fmsystem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Fmsystem-commits] [6811] add yui3


From: Sigurd Nes
Subject: [Fmsystem-commits] [6811] add yui3
Date: Wed, 19 Jan 2011 13:33:14 +0000

Revision: 6811
          http://svn.sv.gnu.org/viewvc/?view=rev&root=fmsystem&revision=6811
Author:   sigurdne
Date:     2011-01-19 13:33:11 +0000 (Wed, 19 Jan 2011)
Log Message:
-----------
add yui3

Added Paths:
-----------
    trunk/phpgwapi/js/yui3/
    trunk/phpgwapi/js/yui3/arraysort/
    trunk/phpgwapi/js/yui3/arraysort/arraysort-debug.js
    trunk/phpgwapi/js/yui3/arraysort/arraysort-min.js
    trunk/phpgwapi/js/yui3/arraysort/arraysort.js
    trunk/phpgwapi/js/yui3/assets/
    trunk/phpgwapi/js/yui3/assets/skins/
    trunk/phpgwapi/js/yui3/assets/skins/sam/
    trunk/phpgwapi/js/yui3/assets/skins/sam/autocomplete-list.css
    trunk/phpgwapi/js/yui3/assets/skins/sam/bg.png
    trunk/phpgwapi/js/yui3/assets/skins/sam/horizontal-menu-submenu-toggle.png
    trunk/phpgwapi/js/yui3/assets/skins/sam/scrollview-scrollbars.css
    trunk/phpgwapi/js/yui3/assets/skins/sam/thumb-classic-x.png
    trunk/phpgwapi/js/yui3/assets/skins/sam/thumb-x.png
    trunk/phpgwapi/js/yui3/assets/skins/sam/widget-base.css
    trunk/phpgwapi/js/yui3/async-queue/
    trunk/phpgwapi/js/yui3/async-queue/async-queue-debug.js
    trunk/phpgwapi/js/yui3/async-queue/async-queue-min.js
    trunk/phpgwapi/js/yui3/async-queue/async-queue.js
    trunk/phpgwapi/js/yui3/autocomplete/
    trunk/phpgwapi/js/yui3/autocomplete/assets/
    trunk/phpgwapi/js/yui3/autocomplete/assets/autocomplete-list-core.css
    trunk/phpgwapi/js/yui3/autocomplete/assets/skins/
    trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/
    
trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete-list-skin.css
    trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete-list.css
    trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete.css
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base-debug.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base-min.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-debug.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-filters-accentfold-debug.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-filters-accentfold-min.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-filters-accentfold.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-filters-debug.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-filters-min.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-filters.js
    
trunk/phpgwapi/js/yui3/autocomplete/autocomplete-highlighters-accentfold-debug.js
    
trunk/phpgwapi/js/yui3/autocomplete/autocomplete-highlighters-accentfold-min.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-highlighters-accentfold.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-highlighters-debug.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-highlighters-min.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-highlighters.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-list-debug.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-list-keys-debug.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-list-keys-min.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-list-keys.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-list-min.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-list.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-min.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-plugin-debug.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-plugin-min.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-plugin.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-sources-debug.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-sources-min.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete-sources.js
    trunk/phpgwapi/js/yui3/autocomplete/autocomplete.js
    trunk/phpgwapi/js/yui3/autocomplete/lang/
    trunk/phpgwapi/js/yui3/autocomplete/lang/autocomplete-list.js
    trunk/phpgwapi/js/yui3/autocomplete/lang/autocomplete-list_en.js
    trunk/phpgwapi/js/yui3/autocomplete/lang/autocomplete.js
    trunk/phpgwapi/js/yui3/autocomplete/lang/autocomplete_en.js
    trunk/phpgwapi/js/yui3/charts/
    trunk/phpgwapi/js/yui3/charts/charts-debug.js
    trunk/phpgwapi/js/yui3/charts/charts-min.js
    trunk/phpgwapi/js/yui3/charts/charts.js
    trunk/phpgwapi/js/yui3/classnamemanager/
    trunk/phpgwapi/js/yui3/classnamemanager/classnamemanager-debug.js
    trunk/phpgwapi/js/yui3/classnamemanager/classnamemanager-min.js
    trunk/phpgwapi/js/yui3/classnamemanager/classnamemanager.js
    trunk/phpgwapi/js/yui3/collection/
    trunk/phpgwapi/js/yui3/collection/array-extras-debug.js
    trunk/phpgwapi/js/yui3/collection/array-extras-min.js
    trunk/phpgwapi/js/yui3/collection/array-extras.js
    trunk/phpgwapi/js/yui3/collection/array-invoke-debug.js
    trunk/phpgwapi/js/yui3/collection/array-invoke-min.js
    trunk/phpgwapi/js/yui3/collection/array-invoke.js
    trunk/phpgwapi/js/yui3/collection/arraylist-add-debug.js
    trunk/phpgwapi/js/yui3/collection/arraylist-add-min.js
    trunk/phpgwapi/js/yui3/collection/arraylist-add.js
    trunk/phpgwapi/js/yui3/collection/arraylist-debug.js
    trunk/phpgwapi/js/yui3/collection/arraylist-filter-debug.js
    trunk/phpgwapi/js/yui3/collection/arraylist-filter-min.js
    trunk/phpgwapi/js/yui3/collection/arraylist-filter.js
    trunk/phpgwapi/js/yui3/collection/arraylist-min.js
    trunk/phpgwapi/js/yui3/collection/arraylist.js
    trunk/phpgwapi/js/yui3/collection/collection-debug.js
    trunk/phpgwapi/js/yui3/collection/collection-min.js
    trunk/phpgwapi/js/yui3/collection/collection.js
    trunk/phpgwapi/js/yui3/compat/
    trunk/phpgwapi/js/yui3/compat/compat-debug.js
    trunk/phpgwapi/js/yui3/compat/compat-min.js
    trunk/phpgwapi/js/yui3/compat/compat.js
    trunk/phpgwapi/js/yui3/cookie/
    trunk/phpgwapi/js/yui3/cookie/cookie-debug.js
    trunk/phpgwapi/js/yui3/cookie/cookie-min.js
    trunk/phpgwapi/js/yui3/cookie/cookie.js
    trunk/phpgwapi/js/yui3/cssbase/
    trunk/phpgwapi/js/yui3/cssbase/base-context-min.css
    trunk/phpgwapi/js/yui3/cssbase/base-context.css
    trunk/phpgwapi/js/yui3/cssbase/base-min.css
    trunk/phpgwapi/js/yui3/cssbase/base.css
    trunk/phpgwapi/js/yui3/cssfonts/
    trunk/phpgwapi/js/yui3/cssfonts/fonts-context-min.css
    trunk/phpgwapi/js/yui3/cssfonts/fonts-context.css
    trunk/phpgwapi/js/yui3/cssfonts/fonts-min.css
    trunk/phpgwapi/js/yui3/cssfonts/fonts.css
    trunk/phpgwapi/js/yui3/cssgrids/
    trunk/phpgwapi/js/yui3/cssgrids/grids-min.css
    trunk/phpgwapi/js/yui3/cssgrids/grids.css
    trunk/phpgwapi/js/yui3/dataschema/
    trunk/phpgwapi/js/yui3/dataschema/dataschema-array-debug.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-array-min.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-array.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-base-debug.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-base-min.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-base.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-debug.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-json-debug.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-json-min.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-json.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-min.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-text-debug.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-text-min.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-text.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-xml-debug.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-xml-min.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema-xml.js
    trunk/phpgwapi/js/yui3/dataschema/dataschema.js
    trunk/phpgwapi/js/yui3/datatype/
    trunk/phpgwapi/js/yui3/datatype/datatype-date-debug.js
    trunk/phpgwapi/js/yui3/datatype/datatype-date-format-debug.js
    trunk/phpgwapi/js/yui3/datatype/datatype-date-format-min.js
    trunk/phpgwapi/js/yui3/datatype/datatype-date-format.js
    trunk/phpgwapi/js/yui3/datatype/datatype-date-min.js
    trunk/phpgwapi/js/yui3/datatype/datatype-date-parse-debug.js
    trunk/phpgwapi/js/yui3/datatype/datatype-date-parse-min.js
    trunk/phpgwapi/js/yui3/datatype/datatype-date-parse.js
    trunk/phpgwapi/js/yui3/datatype/datatype-date.js
    trunk/phpgwapi/js/yui3/datatype/datatype-debug.js
    trunk/phpgwapi/js/yui3/datatype/datatype-min.js
    trunk/phpgwapi/js/yui3/datatype/datatype-number-debug.js
    trunk/phpgwapi/js/yui3/datatype/datatype-number-format-debug.js
    trunk/phpgwapi/js/yui3/datatype/datatype-number-format-min.js
    trunk/phpgwapi/js/yui3/datatype/datatype-number-format.js
    trunk/phpgwapi/js/yui3/datatype/datatype-number-min.js
    trunk/phpgwapi/js/yui3/datatype/datatype-number-parse-debug.js
    trunk/phpgwapi/js/yui3/datatype/datatype-number-parse-min.js
    trunk/phpgwapi/js/yui3/datatype/datatype-number-parse.js
    trunk/phpgwapi/js/yui3/datatype/datatype-number.js
    trunk/phpgwapi/js/yui3/datatype/datatype-xml-debug.js
    trunk/phpgwapi/js/yui3/datatype/datatype-xml-format-debug.js
    trunk/phpgwapi/js/yui3/datatype/datatype-xml-format-min.js
    trunk/phpgwapi/js/yui3/datatype/datatype-xml-format.js
    trunk/phpgwapi/js/yui3/datatype/datatype-xml-min.js
    trunk/phpgwapi/js/yui3/datatype/datatype-xml-parse-debug.js
    trunk/phpgwapi/js/yui3/datatype/datatype-xml-parse-min.js
    trunk/phpgwapi/js/yui3/datatype/datatype-xml-parse.js
    trunk/phpgwapi/js/yui3/datatype/datatype-xml.js
    trunk/phpgwapi/js/yui3/datatype/datatype.js
    trunk/phpgwapi/js/yui3/datatype/lang/
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ar-JO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ar.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ca-ES.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ca.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_da-DK.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_da.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_de-AT.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_de-DE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_de.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_el-GR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_el.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en-AU.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en-CA.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en-GB.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en-IE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en-IN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en-JO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en-MY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en-NZ.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en-PH.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en-SG.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en-US.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_en.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-AR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-BO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-CL.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-CO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-EC.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-ES.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-MX.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-PE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-PY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-US.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-UY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es-VE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_es.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_fi-FI.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_fi.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_fr-BE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_fr-CA.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_fr-FR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_fr.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_hi-IN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_hi.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_id-ID.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_id.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_it-IT.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_it.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ja-JP.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ja.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ko-KR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ko.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ms-MY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ms.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_nb-NO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_nb.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_nl-BE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_nl-NL.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_nl.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_pl-PL.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_pl.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_pt-BR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_pt.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ro-RO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ro.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ru-RU.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_ru.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_sv-SE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_sv.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_th-TH.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_th.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_tr-TR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_tr.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_vi-VN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_vi.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_zh-Hans-CN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_zh-Hans.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_zh-Hant-HK.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_zh-Hant-TW.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date-format_zh-Hant.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ar-JO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ar.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ca-ES.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ca.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_da-DK.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_da.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_de-AT.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_de-DE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_de.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_el-GR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_el.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en-AU.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en-CA.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en-GB.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en-IE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en-IN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en-JO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en-MY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en-NZ.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en-PH.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en-SG.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en-US.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_en.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-AR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-BO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-CL.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-CO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-EC.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-ES.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-MX.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-PE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-PY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-US.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-UY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es-VE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_es.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_fi-FI.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_fi.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_fr-BE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_fr-CA.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_fr-FR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_fr.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_hi-IN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_hi.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_id-ID.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_id.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_it-IT.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_it.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ja-JP.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ja.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ko-KR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ko.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ms-MY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ms.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_nb-NO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_nb.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_nl-BE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_nl-NL.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_nl.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_pl-PL.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_pl.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_pt-BR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_pt.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ro-RO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ro.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ru-RU.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_ru.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_sv-SE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_sv.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_th-TH.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_th.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_tr-TR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_tr.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_vi-VN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_vi.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_zh-Hans-CN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_zh-Hans.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_zh-Hant-HK.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_zh-Hant-TW.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype-date_zh-Hant.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ar-JO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ar.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ca-ES.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ca.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_da-DK.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_da.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_de-AT.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_de-DE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_de.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_el-GR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_el.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en-AU.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en-CA.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en-GB.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en-IE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en-IN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en-JO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en-MY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en-NZ.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en-PH.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en-SG.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en-US.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_en.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-AR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-BO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-CL.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-CO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-EC.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-ES.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-MX.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-PE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-PY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-US.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-UY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es-VE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_es.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_fi-FI.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_fi.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_fr-BE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_fr-CA.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_fr-FR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_fr.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_hi-IN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_hi.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_id-ID.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_id.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_it-IT.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_it.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ja-JP.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ja.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ko-KR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ko.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ms-MY.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ms.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_nb-NO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_nb.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_nl-BE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_nl-NL.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_nl.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_pl-PL.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_pl.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_pt-BR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_pt.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ro-RO.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ro.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ru-RU.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_ru.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_sv-SE.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_sv.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_th-TH.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_th.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_tr-TR.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_tr.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_vi-VN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_vi.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_zh-Hans-CN.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_zh-Hans.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_zh-Hant-HK.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_zh-Hant-TW.js
    trunk/phpgwapi/js/yui3/datatype/lang/datatype_zh-Hant.js
    trunk/phpgwapi/js/yui3/dd/
    trunk/phpgwapi/js/yui3/dd/dd-constrain-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-constrain-min.js
    trunk/phpgwapi/js/yui3/dd/dd-constrain.js
    trunk/phpgwapi/js/yui3/dd/dd-ddm-base-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-ddm-base-min.js
    trunk/phpgwapi/js/yui3/dd/dd-ddm-base.js
    trunk/phpgwapi/js/yui3/dd/dd-ddm-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-ddm-drop-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-ddm-drop-min.js
    trunk/phpgwapi/js/yui3/dd/dd-ddm-drop.js
    trunk/phpgwapi/js/yui3/dd/dd-ddm-min.js
    trunk/phpgwapi/js/yui3/dd/dd-ddm.js
    trunk/phpgwapi/js/yui3/dd/dd-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-delegate-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-delegate-min.js
    trunk/phpgwapi/js/yui3/dd/dd-delegate.js
    trunk/phpgwapi/js/yui3/dd/dd-drag-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-drag-min.js
    trunk/phpgwapi/js/yui3/dd/dd-drag.js
    trunk/phpgwapi/js/yui3/dd/dd-drop-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-drop-min.js
    trunk/phpgwapi/js/yui3/dd/dd-drop-plugin-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-drop-plugin-min.js
    trunk/phpgwapi/js/yui3/dd/dd-drop-plugin.js
    trunk/phpgwapi/js/yui3/dd/dd-drop.js
    trunk/phpgwapi/js/yui3/dd/dd-gestures-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-gestures-min.js
    trunk/phpgwapi/js/yui3/dd/dd-gestures.js
    trunk/phpgwapi/js/yui3/dd/dd-min.js
    trunk/phpgwapi/js/yui3/dd/dd-plugin-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-plugin-min.js
    trunk/phpgwapi/js/yui3/dd/dd-plugin.js
    trunk/phpgwapi/js/yui3/dd/dd-proxy-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-proxy-min.js
    trunk/phpgwapi/js/yui3/dd/dd-proxy.js
    trunk/phpgwapi/js/yui3/dd/dd-scroll-debug.js
    trunk/phpgwapi/js/yui3/dd/dd-scroll-min.js
    trunk/phpgwapi/js/yui3/dd/dd-scroll.js
    trunk/phpgwapi/js/yui3/dd/dd.js
    trunk/phpgwapi/js/yui3/editor/
    trunk/phpgwapi/js/yui3/editor/createlink-base-debug.js
    trunk/phpgwapi/js/yui3/editor/createlink-base-min.js
    trunk/phpgwapi/js/yui3/editor/createlink-base.js
    trunk/phpgwapi/js/yui3/editor/editor-base-debug.js
    trunk/phpgwapi/js/yui3/editor/editor-base-min.js
    trunk/phpgwapi/js/yui3/editor/editor-base.js
    trunk/phpgwapi/js/yui3/editor/editor-bidi-debug.js
    trunk/phpgwapi/js/yui3/editor/editor-bidi-min.js
    trunk/phpgwapi/js/yui3/editor/editor-bidi.js
    trunk/phpgwapi/js/yui3/editor/editor-br-debug.js
    trunk/phpgwapi/js/yui3/editor/editor-br-min.js
    trunk/phpgwapi/js/yui3/editor/editor-br.js
    trunk/phpgwapi/js/yui3/editor/editor-debug.js
    trunk/phpgwapi/js/yui3/editor/editor-lists-debug.js
    trunk/phpgwapi/js/yui3/editor/editor-lists-min.js
    trunk/phpgwapi/js/yui3/editor/editor-lists.js
    trunk/phpgwapi/js/yui3/editor/editor-min.js
    trunk/phpgwapi/js/yui3/editor/editor-para-debug.js
    trunk/phpgwapi/js/yui3/editor/editor-para-min.js
    trunk/phpgwapi/js/yui3/editor/editor-para.js
    trunk/phpgwapi/js/yui3/editor/editor-tab-debug.js
    trunk/phpgwapi/js/yui3/editor/editor-tab-min.js
    trunk/phpgwapi/js/yui3/editor/editor-tab.js
    trunk/phpgwapi/js/yui3/editor/editor.js
    trunk/phpgwapi/js/yui3/editor/exec-command-debug.js
    trunk/phpgwapi/js/yui3/editor/exec-command-min.js
    trunk/phpgwapi/js/yui3/editor/exec-command.js
    trunk/phpgwapi/js/yui3/editor/frame-debug.js
    trunk/phpgwapi/js/yui3/editor/frame-min.js
    trunk/phpgwapi/js/yui3/editor/frame.js
    trunk/phpgwapi/js/yui3/editor/selection-debug.js
    trunk/phpgwapi/js/yui3/editor/selection-min.js
    trunk/phpgwapi/js/yui3/editor/selection.js
    trunk/phpgwapi/js/yui3/event/
    trunk/phpgwapi/js/yui3/event/event-base-debug.js
    trunk/phpgwapi/js/yui3/event/event-base-ie-debug.js
    trunk/phpgwapi/js/yui3/event/event-base-ie-min.js
    trunk/phpgwapi/js/yui3/event/event-base-ie.js
    trunk/phpgwapi/js/yui3/event/event-base-min.js
    trunk/phpgwapi/js/yui3/event/event-base.js
    trunk/phpgwapi/js/yui3/event/event-debug.js
    trunk/phpgwapi/js/yui3/event/event-delegate-debug.js
    trunk/phpgwapi/js/yui3/event/event-delegate-min.js
    trunk/phpgwapi/js/yui3/event/event-delegate.js
    trunk/phpgwapi/js/yui3/event/event-focus-debug.js
    trunk/phpgwapi/js/yui3/event/event-focus-min.js
    trunk/phpgwapi/js/yui3/event/event-focus.js
    trunk/phpgwapi/js/yui3/event/event-hover-debug.js
    trunk/phpgwapi/js/yui3/event/event-hover-min.js
    trunk/phpgwapi/js/yui3/event/event-hover.js
    trunk/phpgwapi/js/yui3/event/event-key-debug.js
    trunk/phpgwapi/js/yui3/event/event-key-min.js
    trunk/phpgwapi/js/yui3/event/event-key.js
    trunk/phpgwapi/js/yui3/event/event-min.js
    trunk/phpgwapi/js/yui3/event/event-mouseenter-debug.js
    trunk/phpgwapi/js/yui3/event/event-mouseenter-min.js
    trunk/phpgwapi/js/yui3/event/event-mouseenter.js
    trunk/phpgwapi/js/yui3/event/event-mousewheel-debug.js
    trunk/phpgwapi/js/yui3/event/event-mousewheel-min.js
    trunk/phpgwapi/js/yui3/event/event-mousewheel.js
    trunk/phpgwapi/js/yui3/event/event-resize-debug.js
    trunk/phpgwapi/js/yui3/event/event-resize-min.js
    trunk/phpgwapi/js/yui3/event/event-resize.js
    trunk/phpgwapi/js/yui3/event/event-synthetic-debug.js
    trunk/phpgwapi/js/yui3/event/event-synthetic-min.js
    trunk/phpgwapi/js/yui3/event/event-synthetic.js
    trunk/phpgwapi/js/yui3/event/event-touch-debug.js
    trunk/phpgwapi/js/yui3/event/event-touch-min.js
    trunk/phpgwapi/js/yui3/event/event-touch.js
    trunk/phpgwapi/js/yui3/event/event.js
    trunk/phpgwapi/js/yui3/event-custom/
    trunk/phpgwapi/js/yui3/event-custom/event-custom-base-debug.js
    trunk/phpgwapi/js/yui3/event-custom/event-custom-base-min.js
    trunk/phpgwapi/js/yui3/event-custom/event-custom-base.js
    trunk/phpgwapi/js/yui3/event-custom/event-custom-complex-debug.js
    trunk/phpgwapi/js/yui3/event-custom/event-custom-complex-min.js
    trunk/phpgwapi/js/yui3/event-custom/event-custom-complex.js
    trunk/phpgwapi/js/yui3/event-custom/event-custom-debug.js
    trunk/phpgwapi/js/yui3/event-custom/event-custom-min.js
    trunk/phpgwapi/js/yui3/event-custom/event-custom.js
    trunk/phpgwapi/js/yui3/event-gestures/
    trunk/phpgwapi/js/yui3/event-gestures/event-flick-debug.js
    trunk/phpgwapi/js/yui3/event-gestures/event-flick-min.js
    trunk/phpgwapi/js/yui3/event-gestures/event-flick.js
    trunk/phpgwapi/js/yui3/event-gestures/event-gestures-debug.js
    trunk/phpgwapi/js/yui3/event-gestures/event-gestures-min.js
    trunk/phpgwapi/js/yui3/event-gestures/event-gestures.js
    trunk/phpgwapi/js/yui3/event-gestures/event-move-debug.js
    trunk/phpgwapi/js/yui3/event-gestures/event-move-min.js
    trunk/phpgwapi/js/yui3/event-gestures/event-move.js
    trunk/phpgwapi/js/yui3/event-simulate/
    trunk/phpgwapi/js/yui3/event-simulate/event-simulate-debug.js
    trunk/phpgwapi/js/yui3/event-simulate/event-simulate-min.js
    trunk/phpgwapi/js/yui3/event-simulate/event-simulate.js
    trunk/phpgwapi/js/yui3/event-valuechange/
    trunk/phpgwapi/js/yui3/event-valuechange/event-valuechange-debug.js
    trunk/phpgwapi/js/yui3/event-valuechange/event-valuechange-min.js
    trunk/phpgwapi/js/yui3/event-valuechange/event-valuechange.js
    trunk/phpgwapi/js/yui3/imageloader/
    trunk/phpgwapi/js/yui3/imageloader/imageloader-debug.js
    trunk/phpgwapi/js/yui3/imageloader/imageloader-min.js
    trunk/phpgwapi/js/yui3/imageloader/imageloader.js
    trunk/phpgwapi/js/yui3/intl/
    trunk/phpgwapi/js/yui3/intl/intl-debug.js
    trunk/phpgwapi/js/yui3/intl/intl-min.js
    trunk/phpgwapi/js/yui3/intl/intl.js
    trunk/phpgwapi/js/yui3/io/
    trunk/phpgwapi/js/yui3/io/io-base-debug.js
    trunk/phpgwapi/js/yui3/io/io-base-min.js
    trunk/phpgwapi/js/yui3/io/io-base.js
    trunk/phpgwapi/js/yui3/io/io-debug.js
    trunk/phpgwapi/js/yui3/io/io-form-debug.js
    trunk/phpgwapi/js/yui3/io/io-form-min.js
    trunk/phpgwapi/js/yui3/io/io-form.js
    trunk/phpgwapi/js/yui3/io/io-min.js
    trunk/phpgwapi/js/yui3/io/io-queue-debug.js
    trunk/phpgwapi/js/yui3/io/io-queue-min.js
    trunk/phpgwapi/js/yui3/io/io-queue.js
    trunk/phpgwapi/js/yui3/io/io-upload-iframe-debug.js
    trunk/phpgwapi/js/yui3/io/io-upload-iframe-min.js
    trunk/phpgwapi/js/yui3/io/io-upload-iframe.js
    trunk/phpgwapi/js/yui3/io/io-xdr-debug.js
    trunk/phpgwapi/js/yui3/io/io-xdr-min.js
    trunk/phpgwapi/js/yui3/io/io-xdr.js
    trunk/phpgwapi/js/yui3/io/io.js
    trunk/phpgwapi/js/yui3/io/io.swf
    trunk/phpgwapi/js/yui3/json/
    trunk/phpgwapi/js/yui3/json/json-debug.js
    trunk/phpgwapi/js/yui3/json/json-min.js
    trunk/phpgwapi/js/yui3/json/json-parse-debug.js
    trunk/phpgwapi/js/yui3/json/json-parse-min.js
    trunk/phpgwapi/js/yui3/json/json-parse.js
    trunk/phpgwapi/js/yui3/json/json-stringify-debug.js
    trunk/phpgwapi/js/yui3/json/json-stringify-min.js
    trunk/phpgwapi/js/yui3/json/json-stringify.js
    trunk/phpgwapi/js/yui3/json/json.js
    trunk/phpgwapi/js/yui3/jsonp/
    trunk/phpgwapi/js/yui3/jsonp/jsonp-debug.js
    trunk/phpgwapi/js/yui3/jsonp/jsonp-min.js
    trunk/phpgwapi/js/yui3/jsonp/jsonp-url-debug.js
    trunk/phpgwapi/js/yui3/jsonp/jsonp-url-min.js
    trunk/phpgwapi/js/yui3/jsonp/jsonp-url.js
    trunk/phpgwapi/js/yui3/jsonp/jsonp.js
    trunk/phpgwapi/js/yui3/loader/
    trunk/phpgwapi/js/yui3/loader/loader-base-debug.js
    trunk/phpgwapi/js/yui3/loader/loader-base-min.js
    trunk/phpgwapi/js/yui3/loader/loader-base.js
    trunk/phpgwapi/js/yui3/loader/loader-debug.js
    trunk/phpgwapi/js/yui3/loader/loader-min.js
    trunk/phpgwapi/js/yui3/loader/loader-rollup-debug.js
    trunk/phpgwapi/js/yui3/loader/loader-rollup-min.js
    trunk/phpgwapi/js/yui3/loader/loader-rollup.js
    trunk/phpgwapi/js/yui3/loader/loader-yui3-debug.js
    trunk/phpgwapi/js/yui3/loader/loader-yui3-min.js
    trunk/phpgwapi/js/yui3/loader/loader-yui3.js
    trunk/phpgwapi/js/yui3/loader/loader.js
    trunk/phpgwapi/js/yui3/node/
    trunk/phpgwapi/js/yui3/node/align-plugin-debug.js
    trunk/phpgwapi/js/yui3/node/align-plugin-min.js
    trunk/phpgwapi/js/yui3/node/align-plugin.js
    trunk/phpgwapi/js/yui3/node/node-base-debug.js
    trunk/phpgwapi/js/yui3/node/node-base-min.js
    trunk/phpgwapi/js/yui3/node/node-base.js
    trunk/phpgwapi/js/yui3/node/node-debug.js
    trunk/phpgwapi/js/yui3/node/node-deprecated-debug.js
    trunk/phpgwapi/js/yui3/node/node-deprecated-min.js
    trunk/phpgwapi/js/yui3/node/node-deprecated.js
    trunk/phpgwapi/js/yui3/node/node-event-delegate-debug.js
    trunk/phpgwapi/js/yui3/node/node-event-delegate-min.js
    trunk/phpgwapi/js/yui3/node/node-event-delegate.js
    trunk/phpgwapi/js/yui3/node/node-event-html5-debug.js
    trunk/phpgwapi/js/yui3/node/node-event-html5-min.js
    trunk/phpgwapi/js/yui3/node/node-event-html5.js
    trunk/phpgwapi/js/yui3/node/node-event-simulate-debug.js
    trunk/phpgwapi/js/yui3/node/node-event-simulate-min.js
    trunk/phpgwapi/js/yui3/node/node-event-simulate.js
    trunk/phpgwapi/js/yui3/node/node-load-debug.js
    trunk/phpgwapi/js/yui3/node/node-load-min.js
    trunk/phpgwapi/js/yui3/node/node-load.js
    trunk/phpgwapi/js/yui3/node/node-min.js
    trunk/phpgwapi/js/yui3/node/node-pluginhost-debug.js
    trunk/phpgwapi/js/yui3/node/node-pluginhost-min.js
    trunk/phpgwapi/js/yui3/node/node-pluginhost.js
    trunk/phpgwapi/js/yui3/node/node-screen-debug.js
    trunk/phpgwapi/js/yui3/node/node-screen-min.js
    trunk/phpgwapi/js/yui3/node/node-screen.js
    trunk/phpgwapi/js/yui3/node/node-style-debug.js
    trunk/phpgwapi/js/yui3/node/node-style-min.js
    trunk/phpgwapi/js/yui3/node/node-style.js
    trunk/phpgwapi/js/yui3/node/node.js
    trunk/phpgwapi/js/yui3/node/shim-plugin-debug.js
    trunk/phpgwapi/js/yui3/node/shim-plugin-min.js
    trunk/phpgwapi/js/yui3/node/shim-plugin.js
    trunk/phpgwapi/js/yui3/node-flick/
    trunk/phpgwapi/js/yui3/node-flick/assets/
    trunk/phpgwapi/js/yui3/node-flick/assets/node-flick-core.css
    trunk/phpgwapi/js/yui3/node-flick/assets/skins/
    trunk/phpgwapi/js/yui3/node-flick/assets/skins/sam/
    trunk/phpgwapi/js/yui3/node-flick/assets/skins/sam/node-flick-skin.css
    trunk/phpgwapi/js/yui3/node-flick/assets/skins/sam/node-flick.css
    trunk/phpgwapi/js/yui3/node-flick/node-flick-debug.js
    trunk/phpgwapi/js/yui3/node-flick/node-flick-min.js
    trunk/phpgwapi/js/yui3/node-flick/node-flick.js
    trunk/phpgwapi/js/yui3/node-focusmanager/
    trunk/phpgwapi/js/yui3/node-focusmanager/node-focusmanager-debug.js
    trunk/phpgwapi/js/yui3/node-focusmanager/node-focusmanager-min.js
    trunk/phpgwapi/js/yui3/node-focusmanager/node-focusmanager.js
    trunk/phpgwapi/js/yui3/node-menunav/
    trunk/phpgwapi/js/yui3/node-menunav/assets/
    trunk/phpgwapi/js/yui3/node-menunav/assets/node-menunav-core.css
    trunk/phpgwapi/js/yui3/node-menunav/assets/skins/
    trunk/phpgwapi/js/yui3/node-menunav/assets/skins/sam/
    
trunk/phpgwapi/js/yui3/node-menunav/assets/skins/sam/horizontal-menu-submenu-indicator.png
    
trunk/phpgwapi/js/yui3/node-menunav/assets/skins/sam/horizontal-menu-submenu-toggle.png
    trunk/phpgwapi/js/yui3/node-menunav/assets/skins/sam/node-menunav-skin.css
    trunk/phpgwapi/js/yui3/node-menunav/assets/skins/sam/node-menunav.css
    
trunk/phpgwapi/js/yui3/node-menunav/assets/skins/sam/vertical-menu-submenu-indicator.png
    trunk/phpgwapi/js/yui3/node-menunav/node-menunav-debug.js
    trunk/phpgwapi/js/yui3/node-menunav/node-menunav-min.js
    trunk/phpgwapi/js/yui3/node-menunav/node-menunav.js
    trunk/phpgwapi/js/yui3/oop/
    trunk/phpgwapi/js/yui3/oop/oop-debug.js
    trunk/phpgwapi/js/yui3/oop/oop-min.js
    trunk/phpgwapi/js/yui3/oop/oop.js
    trunk/phpgwapi/js/yui3/overlay/
    trunk/phpgwapi/js/yui3/overlay/assets/
    trunk/phpgwapi/js/yui3/overlay/assets/overlay-core.css
    trunk/phpgwapi/js/yui3/overlay/assets/skins/
    trunk/phpgwapi/js/yui3/overlay/assets/skins/sam/
    trunk/phpgwapi/js/yui3/overlay/assets/skins/sam/overlay-skin.css
    trunk/phpgwapi/js/yui3/overlay/assets/skins/sam/overlay.css
    trunk/phpgwapi/js/yui3/overlay/overlay-debug.js
    trunk/phpgwapi/js/yui3/overlay/overlay-min.js
    trunk/phpgwapi/js/yui3/overlay/overlay.js
    trunk/phpgwapi/js/yui3/plugin/
    trunk/phpgwapi/js/yui3/plugin/plugin-debug.js
    trunk/phpgwapi/js/yui3/plugin/plugin-min.js
    trunk/phpgwapi/js/yui3/plugin/plugin.js
    trunk/phpgwapi/js/yui3/pluginhost/
    trunk/phpgwapi/js/yui3/pluginhost/pluginhost-base-debug.js
    trunk/phpgwapi/js/yui3/pluginhost/pluginhost-base-min.js
    trunk/phpgwapi/js/yui3/pluginhost/pluginhost-base.js
    trunk/phpgwapi/js/yui3/pluginhost/pluginhost-config-debug.js
    trunk/phpgwapi/js/yui3/pluginhost/pluginhost-config-min.js
    trunk/phpgwapi/js/yui3/pluginhost/pluginhost-config.js
    trunk/phpgwapi/js/yui3/pluginhost/pluginhost-debug.js
    trunk/phpgwapi/js/yui3/pluginhost/pluginhost-min.js
    trunk/phpgwapi/js/yui3/pluginhost/pluginhost.js
    trunk/phpgwapi/js/yui3/profiler/
    trunk/phpgwapi/js/yui3/profiler/profiler-debug.js
    trunk/phpgwapi/js/yui3/profiler/profiler-min.js
    trunk/phpgwapi/js/yui3/profiler/profiler.js
    trunk/phpgwapi/js/yui3/querystring/
    trunk/phpgwapi/js/yui3/querystring/querystring-debug.js
    trunk/phpgwapi/js/yui3/querystring/querystring-min.js
    trunk/phpgwapi/js/yui3/querystring/querystring-parse-debug.js
    trunk/phpgwapi/js/yui3/querystring/querystring-parse-min.js
    trunk/phpgwapi/js/yui3/querystring/querystring-parse-simple-debug.js
    trunk/phpgwapi/js/yui3/querystring/querystring-parse-simple-min.js
    trunk/phpgwapi/js/yui3/querystring/querystring-parse-simple.js
    trunk/phpgwapi/js/yui3/querystring/querystring-parse.js
    trunk/phpgwapi/js/yui3/querystring/querystring-stringify-debug.js
    trunk/phpgwapi/js/yui3/querystring/querystring-stringify-min.js
    trunk/phpgwapi/js/yui3/querystring/querystring-stringify-simple-debug.js
    trunk/phpgwapi/js/yui3/querystring/querystring-stringify-simple-min.js
    trunk/phpgwapi/js/yui3/querystring/querystring-stringify-simple.js
    trunk/phpgwapi/js/yui3/querystring/querystring-stringify.js
    trunk/phpgwapi/js/yui3/querystring/querystring.js
    trunk/phpgwapi/js/yui3/queue-promote/
    trunk/phpgwapi/js/yui3/queue-promote/queue-promote-debug.js
    trunk/phpgwapi/js/yui3/queue-promote/queue-promote-min.js
    trunk/phpgwapi/js/yui3/queue-promote/queue-promote.js
    trunk/phpgwapi/js/yui3/resize/
    trunk/phpgwapi/js/yui3/resize/assets/
    trunk/phpgwapi/js/yui3/resize/assets/resize-base-core.css
    trunk/phpgwapi/js/yui3/resize/assets/skins/
    trunk/phpgwapi/js/yui3/resize/assets/skins/sam/
    trunk/phpgwapi/js/yui3/resize/assets/skins/sam/arrows.png
    trunk/phpgwapi/js/yui3/resize/assets/skins/sam/resize-base-skin.css
    trunk/phpgwapi/js/yui3/resize/assets/skins/sam/resize-base.css
    trunk/phpgwapi/js/yui3/resize/assets/skins/sam/resize.css
    trunk/phpgwapi/js/yui3/resize/resize-base-debug.js
    trunk/phpgwapi/js/yui3/resize/resize-base-min.js
    trunk/phpgwapi/js/yui3/resize/resize-base.js
    trunk/phpgwapi/js/yui3/resize/resize-constrain-debug.js
    trunk/phpgwapi/js/yui3/resize/resize-constrain-min.js
    trunk/phpgwapi/js/yui3/resize/resize-constrain.js
    trunk/phpgwapi/js/yui3/resize/resize-debug.js
    trunk/phpgwapi/js/yui3/resize/resize-min.js
    trunk/phpgwapi/js/yui3/resize/resize-proxy-debug.js
    trunk/phpgwapi/js/yui3/resize/resize-proxy-min.js
    trunk/phpgwapi/js/yui3/resize/resize-proxy.js
    trunk/phpgwapi/js/yui3/resize/resize.js
    trunk/phpgwapi/js/yui3/scrollview/
    trunk/phpgwapi/js/yui3/scrollview/assets/
    trunk/phpgwapi/js/yui3/scrollview/assets/scrollview-base-core.css
    trunk/phpgwapi/js/yui3/scrollview/assets/scrollview-paginator-core.css
    trunk/phpgwapi/js/yui3/scrollview/assets/scrollview-scrollbars-core.css
    trunk/phpgwapi/js/yui3/scrollview/assets/skins/
    trunk/phpgwapi/js/yui3/scrollview/assets/skins/sam/
    trunk/phpgwapi/js/yui3/scrollview/assets/skins/sam/scrollview-base-skin.css
    trunk/phpgwapi/js/yui3/scrollview/assets/skins/sam/scrollview-base.css
    
trunk/phpgwapi/js/yui3/scrollview/assets/skins/sam/scrollview-paginator-skin.css
    trunk/phpgwapi/js/yui3/scrollview/assets/skins/sam/scrollview-paginator.css
    
trunk/phpgwapi/js/yui3/scrollview/assets/skins/sam/scrollview-scrollbars-skin.css
    trunk/phpgwapi/js/yui3/scrollview/assets/skins/sam/scrollview-scrollbars.css
    trunk/phpgwapi/js/yui3/scrollview/scrollview-base-debug.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-base-ie-debug.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-base-ie-min.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-base-ie.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-base-min.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-base.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-debug.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-min.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-paginator-debug.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-paginator-min.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-paginator.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-scrollbars-debug.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-scrollbars-min.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview-scrollbars.js
    trunk/phpgwapi/js/yui3/scrollview/scrollview.js
    trunk/phpgwapi/js/yui3/simpleyui/
    trunk/phpgwapi/js/yui3/simpleyui/simpleyui-debug.js
    trunk/phpgwapi/js/yui3/simpleyui/simpleyui-min.js
    trunk/phpgwapi/js/yui3/simpleyui/simpleyui.js
    trunk/phpgwapi/js/yui3/stylesheet/
    trunk/phpgwapi/js/yui3/stylesheet/stylesheet-debug.js
    trunk/phpgwapi/js/yui3/stylesheet/stylesheet-min.js
    trunk/phpgwapi/js/yui3/stylesheet/stylesheet.js
    trunk/phpgwapi/js/yui3/swfdetect/
    trunk/phpgwapi/js/yui3/swfdetect/swfdetect-debug.js
    trunk/phpgwapi/js/yui3/swfdetect/swfdetect-min.js
    trunk/phpgwapi/js/yui3/swfdetect/swfdetect.js
    trunk/phpgwapi/js/yui3/test/
    trunk/phpgwapi/js/yui3/test/assets/
    trunk/phpgwapi/js/yui3/test/assets/skins/
    trunk/phpgwapi/js/yui3/test/assets/skins/sam/
    trunk/phpgwapi/js/yui3/test/assets/skins/sam/test-skin.css
    trunk/phpgwapi/js/yui3/test/assets/skins/sam/test.css
    trunk/phpgwapi/js/yui3/test/assets/test-console.css
    trunk/phpgwapi/js/yui3/test/test-debug.js
    trunk/phpgwapi/js/yui3/test/test-min.js
    trunk/phpgwapi/js/yui3/test/test.js
    trunk/phpgwapi/js/yui3/transition/
    trunk/phpgwapi/js/yui3/transition/transition-debug.js
    trunk/phpgwapi/js/yui3/transition/transition-min.js
    trunk/phpgwapi/js/yui3/transition/transition-native-debug.js
    trunk/phpgwapi/js/yui3/transition/transition-native-min.js
    trunk/phpgwapi/js/yui3/transition/transition-native.js
    trunk/phpgwapi/js/yui3/transition/transition-timer-debug.js
    trunk/phpgwapi/js/yui3/transition/transition-timer-min.js
    trunk/phpgwapi/js/yui3/transition/transition-timer.js
    trunk/phpgwapi/js/yui3/transition/transition.js
    trunk/phpgwapi/js/yui3/uploader/
    trunk/phpgwapi/js/yui3/uploader/assets/
    trunk/phpgwapi/js/yui3/uploader/assets/uploader.swf
    trunk/phpgwapi/js/yui3/uploader/uploader-debug.js
    trunk/phpgwapi/js/yui3/uploader/uploader-min.js
    trunk/phpgwapi/js/yui3/uploader/uploader.js
    trunk/phpgwapi/js/yui3/widget/
    trunk/phpgwapi/js/yui3/widget/assets/
    trunk/phpgwapi/js/yui3/widget/assets/skins/
    trunk/phpgwapi/js/yui3/widget/assets/skins/sam/
    trunk/phpgwapi/js/yui3/widget/assets/skins/sam/widget-base-skin.css
    trunk/phpgwapi/js/yui3/widget/assets/skins/sam/widget-base.css
    trunk/phpgwapi/js/yui3/widget/assets/skins/sam/widget-stack-skin.css
    trunk/phpgwapi/js/yui3/widget/assets/skins/sam/widget-stack.css
    trunk/phpgwapi/js/yui3/widget/assets/skins/sam/widget.css
    trunk/phpgwapi/js/yui3/widget/assets/widget-base-core.css
    trunk/phpgwapi/js/yui3/widget/assets/widget-stack-core.css
    trunk/phpgwapi/js/yui3/widget/widget-base-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-base-ie-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-base-ie-min.js
    trunk/phpgwapi/js/yui3/widget/widget-base-ie.js
    trunk/phpgwapi/js/yui3/widget/widget-base-min.js
    trunk/phpgwapi/js/yui3/widget/widget-base.js
    trunk/phpgwapi/js/yui3/widget/widget-child-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-child-min.js
    trunk/phpgwapi/js/yui3/widget/widget-child.js
    trunk/phpgwapi/js/yui3/widget/widget-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-htmlparser-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-htmlparser-min.js
    trunk/phpgwapi/js/yui3/widget/widget-htmlparser.js
    trunk/phpgwapi/js/yui3/widget/widget-locale-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-locale-min.js
    trunk/phpgwapi/js/yui3/widget/widget-locale.js
    trunk/phpgwapi/js/yui3/widget/widget-min.js
    trunk/phpgwapi/js/yui3/widget/widget-parent-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-parent-min.js
    trunk/phpgwapi/js/yui3/widget/widget-parent.js
    trunk/phpgwapi/js/yui3/widget/widget-position-align-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-position-align-min.js
    trunk/phpgwapi/js/yui3/widget/widget-position-align.js
    trunk/phpgwapi/js/yui3/widget/widget-position-constrain-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-position-constrain-min.js
    trunk/phpgwapi/js/yui3/widget/widget-position-constrain.js
    trunk/phpgwapi/js/yui3/widget/widget-position-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-position-min.js
    trunk/phpgwapi/js/yui3/widget/widget-position.js
    trunk/phpgwapi/js/yui3/widget/widget-skin-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-skin-min.js
    trunk/phpgwapi/js/yui3/widget/widget-skin.js
    trunk/phpgwapi/js/yui3/widget/widget-stack-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-stack-min.js
    trunk/phpgwapi/js/yui3/widget/widget-stack.js
    trunk/phpgwapi/js/yui3/widget/widget-stdmod-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-stdmod-min.js
    trunk/phpgwapi/js/yui3/widget/widget-stdmod.js
    trunk/phpgwapi/js/yui3/widget/widget-uievents-debug.js
    trunk/phpgwapi/js/yui3/widget/widget-uievents-min.js
    trunk/phpgwapi/js/yui3/widget/widget-uievents.js
    trunk/phpgwapi/js/yui3/widget/widget.js
    trunk/phpgwapi/js/yui3/yql/
    trunk/phpgwapi/js/yui3/yql/yql-debug.js
    trunk/phpgwapi/js/yui3/yql/yql-min.js
    trunk/phpgwapi/js/yui3/yql/yql.js
    trunk/phpgwapi/js/yui3/yui/
    trunk/phpgwapi/js/yui3/yui/features-debug.js
    trunk/phpgwapi/js/yui3/yui/features-min.js
    trunk/phpgwapi/js/yui3/yui/features.js
    trunk/phpgwapi/js/yui3/yui/get-debug.js
    trunk/phpgwapi/js/yui3/yui/get-min.js
    trunk/phpgwapi/js/yui3/yui/get.js
    trunk/phpgwapi/js/yui3/yui/intl-base-debug.js
    trunk/phpgwapi/js/yui3/yui/intl-base-min.js
    trunk/phpgwapi/js/yui3/yui/intl-base.js
    trunk/phpgwapi/js/yui3/yui/rls-debug.js
    trunk/phpgwapi/js/yui3/yui/rls-min.js
    trunk/phpgwapi/js/yui3/yui/rls.js
    trunk/phpgwapi/js/yui3/yui/yui-base-debug.js
    trunk/phpgwapi/js/yui3/yui/yui-base-min.js
    trunk/phpgwapi/js/yui3/yui/yui-base.js
    trunk/phpgwapi/js/yui3/yui/yui-debug.js
    trunk/phpgwapi/js/yui3/yui/yui-later-debug.js
    trunk/phpgwapi/js/yui3/yui/yui-later-min.js
    trunk/phpgwapi/js/yui3/yui/yui-later.js
    trunk/phpgwapi/js/yui3/yui/yui-log-debug.js
    trunk/phpgwapi/js/yui3/yui/yui-log-min.js
    trunk/phpgwapi/js/yui3/yui/yui-log.js
    trunk/phpgwapi/js/yui3/yui/yui-min.js
    trunk/phpgwapi/js/yui3/yui/yui-throttle-debug.js
    trunk/phpgwapi/js/yui3/yui/yui-throttle-min.js
    trunk/phpgwapi/js/yui3/yui/yui-throttle.js
    trunk/phpgwapi/js/yui3/yui/yui.js

Added: trunk/phpgwapi/js/yui3/arraysort/arraysort-debug.js
===================================================================
--- trunk/phpgwapi/js/yui3/arraysort/arraysort-debug.js                         
(rev 0)
+++ trunk/phpgwapi/js/yui3/arraysort/arraysort-debug.js 2011-01-19 13:33:11 UTC 
(rev 6811)
@@ -0,0 +1,59 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+YUI.add('arraysort', function(Y) {
+
+var LANG = Y.Lang,
+    ISVALUE = LANG.isValue,
+    ISSTRING = LANG.isString;
+
+Y.ArraySort = {
+    /**
+     * Comparator function for simple case-insensitive string sorting.
+     *
+     * @method compare
+     * @param a {Object} First sort argument.
+     * @param b {Object} Second sort argument.
+     * @param desc {Boolean} True if sort direction is descending, false if
+     * sort direction is ascending.
+     * @return {Boolean} Return -1 when a < b. Return 0 when a = b.
+     * Return 1 when a > b.
+     */
+    compare: function(a, b, desc) {
+        if(!ISVALUE(a)) {
+            if(!ISVALUE(b)) {
+                return 0;
+            }
+            else {
+                return 1;
+            }
+        }
+        else if(!ISVALUE(b)) {
+            return -1;
+        }
+
+        if(ISSTRING(a)) {
+            a = a.toLowerCase();
+        }
+        if(ISSTRING(b)) {
+            b = b.toLowerCase();
+        }
+        if(a < b) {
+            return (desc) ? 1 : -1;
+        }
+        else if (a > b) {
+            return (desc) ? -1 : 1;
+        }
+        else {
+            return 0;
+        }
+    }
+};
+
+
+
+}, '3.3.0' ,{requires:['yui-base']});

Added: trunk/phpgwapi/js/yui3/arraysort/arraysort-min.js
===================================================================
--- trunk/phpgwapi/js/yui3/arraysort/arraysort-min.js                           
(rev 0)
+++ trunk/phpgwapi/js/yui3/arraysort/arraysort-min.js   2011-01-19 13:33:11 UTC 
(rev 6811)
@@ -0,0 +1,8 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+YUI.add("arraysort",function(C){var 
B=C.Lang,A=B.isValue,D=B.isString;C.ArraySort={compare:function(F,E,G){if(!A(F)){if(!A(E)){return
 0;}else{return 1;}}else{if(!A(E)){return 
-1;}}if(D(F)){F=F.toLowerCase();}if(D(E)){E=E.toLowerCase();}if(F<E){return(G)?1:-1;}else{if(F>E){return(G)?-1:1;}else{return
 0;}}}};},"3.3.0",{requires:["yui-base"]});
\ No newline at end of file

Added: trunk/phpgwapi/js/yui3/arraysort/arraysort.js
===================================================================
--- trunk/phpgwapi/js/yui3/arraysort/arraysort.js                               
(rev 0)
+++ trunk/phpgwapi/js/yui3/arraysort/arraysort.js       2011-01-19 13:33:11 UTC 
(rev 6811)
@@ -0,0 +1,59 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+YUI.add('arraysort', function(Y) {
+
+var LANG = Y.Lang,
+    ISVALUE = LANG.isValue,
+    ISSTRING = LANG.isString;
+
+Y.ArraySort = {
+    /**
+     * Comparator function for simple case-insensitive string sorting.
+     *
+     * @method compare
+     * @param a {Object} First sort argument.
+     * @param b {Object} Second sort argument.
+     * @param desc {Boolean} True if sort direction is descending, false if
+     * sort direction is ascending.
+     * @return {Boolean} Return -1 when a < b. Return 0 when a = b.
+     * Return 1 when a > b.
+     */
+    compare: function(a, b, desc) {
+        if(!ISVALUE(a)) {
+            if(!ISVALUE(b)) {
+                return 0;
+            }
+            else {
+                return 1;
+            }
+        }
+        else if(!ISVALUE(b)) {
+            return -1;
+        }
+
+        if(ISSTRING(a)) {
+            a = a.toLowerCase();
+        }
+        if(ISSTRING(b)) {
+            b = b.toLowerCase();
+        }
+        if(a < b) {
+            return (desc) ? 1 : -1;
+        }
+        else if (a > b) {
+            return (desc) ? -1 : 1;
+        }
+        else {
+            return 0;
+        }
+    }
+};
+
+
+
+}, '3.3.0' ,{requires:['yui-base']});

Added: trunk/phpgwapi/js/yui3/assets/skins/sam/autocomplete-list.css
===================================================================
--- trunk/phpgwapi/js/yui3/assets/skins/sam/autocomplete-list.css               
                (rev 0)
+++ trunk/phpgwapi/js/yui3/assets/skins/sam/autocomplete-list.css       
2011-01-19 13:33:11 UTC (rev 6811)
@@ -0,0 +1,8 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+.yui3-aclist{position:absolute}.yui3-aclist-hidden{visibility:hidden}.yui3-aclist-aria{left:-9999px;position:absolute}.yui3-aclist-list{list-style:none;margin:0;overflow:hidden;padding:0}.yui3-aclist-item{cursor:pointer;list-style:none;padding:2px
 5px}.yui3-aclist-item-active{outline:#afafaf dotted thin}.yui3-skin-sam 
.yui3-aclist-content{-moz-box-shadow:1px 1px 4px #888;-webkit-box-shadow:1px 
1px 4px #888;background:#fff;border:1px solid #afafaf;box-shadow:1px 1px 4px 
#888}.yui3-skin-sam .yui3-aclist-item-hover{background:#bfdaff}.yui3-skin-sam 
.yui3-aclist-item-active{background:#2647a0;color:#fff;outline:0}

Added: trunk/phpgwapi/js/yui3/assets/skins/sam/bg.png
===================================================================
(Binary files differ)


Property changes on: trunk/phpgwapi/js/yui3/assets/skins/sam/bg.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: 
trunk/phpgwapi/js/yui3/assets/skins/sam/horizontal-menu-submenu-toggle.png
===================================================================
(Binary files differ)


Property changes on: 
trunk/phpgwapi/js/yui3/assets/skins/sam/horizontal-menu-submenu-toggle.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/phpgwapi/js/yui3/assets/skins/sam/scrollview-scrollbars.css
===================================================================
--- trunk/phpgwapi/js/yui3/assets/skins/sam/scrollview-scrollbars.css           
                (rev 0)
+++ trunk/phpgwapi/js/yui3/assets/skins/sam/scrollview-scrollbars.css   
2011-01-19 13:33:11 UTC (rev 6811)
@@ -0,0 +1,8 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+.yui3-scrollview-scrollbar{opacity:1;position:absolute;width:6px;height:10px}.yui3-scrollview-scrollbar{top:0;right:1px}.yui3-scrollview-scrollbar-horiz{top:auto;height:8px;width:20px;bottom:1px;left:0}.yui3-scrollview-scrollbar
 
.yui3-scrollview-child{position:absolute;right:0;display:block;width:100%;height:4px}.yui3-scrollview-scrollbar
 .yui3-scrollview-first{top:0}.yui3-scrollview-scrollbar 
.yui3-scrollview-last{top:0}.yui3-scrollview-scrollbar 
.yui3-scrollview-middle{position:absolute;top:4px;height:1px}.yui3-scrollview-scrollbar-horiz
 
.yui3-scrollview-child{display:-moz-inline-stack;display:inline-block;zoom:1;*display:inline;top:0;left:0;bottom:auto;right:auto}.yui3-scrollview-scrollbar-horiz
 .yui3-scrollview-first,.yui3-scrollview-scrollbar-horiz 
.yui3-scrollview-last{width:4px;height:6px}.yui3-scrollview-scrollbar-horiz 
.yui3-scrollview-middle{top:0;left:4px;width:1px;height:6px}.yui3-scrollview-scrollbar-vert-basic{height:auto}.yui3-scrollview-scrollbar-vert-basic
 
.yui3-scrollview-child{position:static;_overflow:hidden;_line-height:4px}.yui3-scrollview-scrollbar-horiz-basic{width:auto;white-space:nowrap;line-height:6px;_overflow:hidden}.yui3-scrollview-scrollbar-horiz-basic
 
.yui3-scrollview-child{position:static;padding:0;margin:0;top:auto;left:auto;right:auto;bottom:auto}.yui3-skin-sam
 
.yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0)}.yui3-skin-sam
 .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam 
.yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam 
.yui3-scrollview-scrollbar 
.yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==)}.yui3-skin-sam
 .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam 
.yui3-scrollview-scrollbar 
.yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam
 .yui3-scrollview-scrollbar 
.yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate3d(0,0,0)}.yui3-skin-sam
 .yui3-scrollview-scrollbar 
.yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0)
 scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate3d(0,0,0) 
scaleY(1);-moz-transform-origin-y:0}.yui3-skin-sam 
.yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam 
.yui3-scrollview-scrollbar-horiz 
.yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam
 .yui3-scrollview-scrollbar-horiz 
.yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam
 .yui3-scrollview-scrollbar-horiz 
.yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) 
scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate3d(0,0,0) 
scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam 
.yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam 
.yui3-scrollview-scrollbar-horiz-basic 
.yui3-scrollview-child{background-color:#aaa;background-image:none}

Added: trunk/phpgwapi/js/yui3/assets/skins/sam/thumb-classic-x.png
===================================================================
(Binary files differ)


Property changes on: trunk/phpgwapi/js/yui3/assets/skins/sam/thumb-classic-x.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/phpgwapi/js/yui3/assets/skins/sam/thumb-x.png
===================================================================
(Binary files differ)


Property changes on: trunk/phpgwapi/js/yui3/assets/skins/sam/thumb-x.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/phpgwapi/js/yui3/assets/skins/sam/widget-base.css
===================================================================
--- trunk/phpgwapi/js/yui3/assets/skins/sam/widget-base.css                     
        (rev 0)
+++ trunk/phpgwapi/js/yui3/assets/skins/sam/widget-base.css     2011-01-19 
13:33:11 UTC (rev 6811)
@@ -0,0 +1,8 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+.yui3-widget-hidden{display:none}.yui3-widget-content{overflow:hidden}.yui3-widget-content-expanded{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;height:100%}.yui3-widget-tmp-forcesize{overflow:hidden!important}

Added: trunk/phpgwapi/js/yui3/async-queue/async-queue-debug.js
===================================================================
--- trunk/phpgwapi/js/yui3/async-queue/async-queue-debug.js                     
        (rev 0)
+++ trunk/phpgwapi/js/yui3/async-queue/async-queue-debug.js     2011-01-19 
13:33:11 UTC (rev 6811)
@@ -0,0 +1,529 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+YUI.add('async-queue', function(Y) {
+
+/**
+ * <p>AsyncQueue allows you create a chain of function callbacks executed
+ * via setTimeout (or synchronously) that are guaranteed to run in order.
+ * Items in the queue can be promoted or removed.  Start or resume the
+ * execution chain with run().  pause() to temporarily delay execution, or
+ * stop() to halt and clear the queue.</p>
+ *
+ * @module async-queue
+ */
+
+/**
+ * <p>A specialized queue class that supports scheduling callbacks to execute
+ * sequentially, iteratively, even asynchronously.</p>
+ *
+ * <p>Callbacks can be function refs or objects with the following keys.  Only
+ * the <code>fn</code> key is required.</p>
+ *
+ * <ul>
+ * <li><code>fn</code> -- The callback function</li>
+ * <li><code>context</code> -- The execution context for the callbackFn.</li>
+ * <li><code>args</code> -- Arguments to pass to callbackFn.</li>
+ * <li><code>timeout</code> -- Millisecond delay before executing callbackFn.
+ *                     (Applies to each iterative execution of callback)</li>
+ * <li><code>iterations</code> -- Number of times to repeat the callback.
+ * <li><code>until</code> -- Repeat the callback until this function returns
+ *                         true.  This setting trumps iterations.</li>
+ * <li><code>autoContinue</code> -- Set to false to prevent the AsyncQueue from
+ *                        executing the next callback in the Queue after
+ *                        the callback completes.</li>
+ * <li><code>id</code> -- Name that can be used to get, promote, get the
+ *                        indexOf, or delete this callback.</li>
+ * </ul>
+ *
+ * @class AsyncQueue
+ * @extends EventTarget
+ * @constructor
+ * @param callback* {Function|Object} 0..n callbacks to seed the queue
+ */
+Y.AsyncQueue = function() {
+    this._init();
+    this.add.apply(this, arguments);
+};
+
+var Queue   = Y.AsyncQueue,
+    EXECUTE = 'execute',
+    SHIFT   = 'shift',
+    PROMOTE = 'promote',
+    REMOVE  = 'remove',
+
+    isObject   = Y.Lang.isObject,
+    isFunction = Y.Lang.isFunction;
+
+/**
+ * <p>Static default values used to populate callback configuration properties.
+ * Preconfigured defaults include:</p>
+ *
+ * <ul>
+ *  <li><code>autoContinue</code>: <code>true</code></li>
+ *  <li><code>iterations</code>: 1</li>
+ *  <li><code>timeout</code>: 10 (10ms between callbacks)</li>
+ *  <li><code>until</code>: (function to run until iterations &lt;= 0)</li>
+ * </ul>
+ *
+ * @property AsyncQueue.defaults
+ * @type {Object}
+ * @static
+ */
+Queue.defaults = Y.mix({
+    autoContinue : true,
+    iterations   : 1,
+    timeout      : 10,
+    until        : function () {
+        this.iterations |= 0;
+        return this.iterations <= 0;
+    }
+}, Y.config.queueDefaults || {});
+
+Y.extend(Queue, Y.EventTarget, {
+    /**
+     * Used to indicate the queue is currently executing a callback.
+     *
+     * @property _running
+     * @type {Boolean|Object} true for synchronous callback execution, the
+     *                        return handle from Y.later for async callbacks.
+     *                        Otherwise false.
+     * @protected
+     */
+    _running : false,
+
+    /**
+     * Initializes the AsyncQueue instance properties and events.
+     *
+     * @method _init
+     * @protected
+     */
+    _init : function () {
+        Y.EventTarget.call(this, { emitFacade: true });
+
+        this._q = [];
+
+        /** 
+         * Callback defaults for this instance.  Static defaults that are not
+         * overridden are also included.
+         *
+         * @property defaults
+         * @type {Object}
+         */
+        this.defaults = {};
+
+        this._initEvents();
+    },
+
+    /**
+     * Initializes the instance events.
+     *
+     * @method _initEvents
+     * @protected
+     */
+    _initEvents : function () {
+        this.publish({
+            'execute' : { defaultFn : this._defExecFn,    emitFacade: true },
+            'shift'   : { defaultFn : this._defShiftFn,   emitFacade: true },
+            'add'     : { defaultFn : this._defAddFn,     emitFacade: true },
+            'promote' : { defaultFn : this._defPromoteFn, emitFacade: true },
+            'remove'  : { defaultFn : this._defRemoveFn,  emitFacade: true }
+        });
+    },
+
+    /**
+     * Returns the next callback needing execution.  If a callback is
+     * configured to repeat via iterations or until, it will be returned until
+     * the completion criteria is met.
+     *
+     * When the queue is empty, null is returned.
+     *
+     * @method next
+     * @return {Function} the callback to execute
+     */
+    next : function () {
+        var callback;
+
+        while (this._q.length) {
+            callback = this._q[0] = this._prepare(this._q[0]);
+            if (callback && callback.until()) {
+                this.fire(SHIFT, { callback: callback });
+                callback = null;
+            } else {
+                break;
+            }
+        }
+
+        return callback || null;
+    },
+
+    /**
+     * Default functionality for the &quot;shift&quot; event.  Shifts the
+     * callback stored in the event object's <em>callback</em> property from
+     * the queue if it is the first item.
+     *
+     * @method _defShiftFn
+     * @param e {Event} The event object
+     * @protected
+     */
+    _defShiftFn : function (e) {
+        if (this.indexOf(e.callback) === 0) {
+            this._q.shift();
+        }
+    },
+
+    /**
+     * Creates a wrapper function to execute the callback using the aggregated 
+     * configuration generated by combining the static AsyncQueue.defaults, the
+     * instance defaults, and the specified callback settings.
+     *
+     * The wrapper function is decorated with the callback configuration as
+     * properties for runtime modification.
+     *
+     * @method _prepare
+     * @param callback {Object|Function} the raw callback
+     * @return {Function} a decorated function wrapper to execute the callback
+     * @protected
+     */
+    _prepare: function (callback) {
+        if (isFunction(callback) && callback._prepared) {
+            return callback;
+        }
+
+        var config = Y.merge(
+            Queue.defaults,
+            { context : this, args: [], _prepared: true },
+            this.defaults,
+            (isFunction(callback) ? { fn: callback } : callback)),
+            
+            wrapper = Y.bind(function () {
+                if (!wrapper._running) {
+                    wrapper.iterations--;
+                }
+                if (isFunction(wrapper.fn)) {
+                    wrapper.fn.apply(wrapper.context || Y,
+                                     Y.Array(wrapper.args));
+                }
+            }, this);
+            
+        return Y.mix(wrapper, config);
+    },
+
+    /**
+     * Sets the queue in motion.  All queued callbacks will be executed in
+     * order unless pause() or stop() is called or if one of the callbacks is
+     * configured with autoContinue: false.
+     *
+     * @method run
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    run : function () {
+        var callback,
+            cont = true;
+
+        for (callback = this.next();
+            cont && callback && !this.isRunning();
+            callback = this.next())
+        {
+            cont = (callback.timeout < 0) ?
+                this._execute(callback) :
+                this._schedule(callback);
+        }
+
+        if (!callback) {
+            /**
+             * Event fired after the last queued callback is executed.
+             * @event complete
+             */
+            this.fire('complete');
+        }
+
+        return this;
+    },
+
+    /**
+     * Handles the execution of callbacks. Returns a boolean indicating
+     * whether it is appropriate to continue running.
+     *
+     * @method _execute
+     * @param callback {Object} the callback object to execute
+     * @return {Boolean} whether the run loop should continue
+     * @protected
+     */
+    _execute : function (callback) {
+        this._running = callback._running = true;
+
+        callback.iterations--;
+        this.fire(EXECUTE, { callback: callback });
+
+        var cont = this._running && callback.autoContinue;
+
+        this._running = callback._running = false;
+
+        return cont;
+    },
+
+    /**
+     * Schedules the execution of asynchronous callbacks.
+     *
+     * @method _schedule
+     * @param callback {Object} the callback object to execute
+     * @return {Boolean} whether the run loop should continue
+     * @protected
+     */
+    _schedule : function (callback) {
+        this._running = Y.later(callback.timeout, this, function () {
+            if (this._execute(callback)) {
+                this.run();
+            }
+        });
+
+        return false;
+    },
+
+    /**
+     * Determines if the queue is waiting for a callback to complete execution.
+     *
+     * @method isRunning
+     * @return {Boolean} true if queue is waiting for a 
+     *                   from any initiated transactions
+     */
+    isRunning : function () {
+        return !!this._running;
+    },
+
+    /**
+     * Default functionality for the &quot;execute&quot; event.  Executes the
+     * callback function
+     *
+     * @method _defExecFn
+     * @param e {Event} the event object
+     * @protected
+     */
+    _defExecFn : function (e) {
+        e.callback();
+    },
+
+    /**
+     * Add any number of callbacks to the end of the queue. Callbacks may be
+     * provided as functions or objects.
+     *
+     * @method add
+     * @param callback* {Function|Object} 0..n callbacks
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    add : function () {
+        this.fire('add', { callbacks: Y.Array(arguments,0,true) });
+
+        return this;
+    },
+
+    /**
+     * Default functionality for the &quot;add&quot; event.  Adds the callbacks
+     * in the event facade to the queue. Callbacks successfully added to the
+     * queue are present in the event's <code>added</code> property in the
+     * after phase.
+     *
+     * @method _defAddFn
+     * @param e {Event} the event object
+     * @protected
+     */
+    _defAddFn : function(e) {
+        var _q = this._q,
+            added = [];
+
+        Y.Array.each(e.callbacks, function (c) {
+            if (isObject(c)) {
+                _q.push(c);
+                added.push(c);
+            }
+        });
+
+        e.added = added;
+    },
+
+    /**
+     * Pause the execution of the queue after the execution of the current
+     * callback completes.  If called from code outside of a queued callback,
+     * clears the timeout for the pending callback. Paused queue can be
+     * restarted with q.run()
+     *
+     * @method pause
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    pause: function () {
+        if (isObject(this._running)) {
+            this._running.cancel();
+        }
+
+        this._running = false;
+
+        return this;
+    },
+
+    /**
+     * Stop and clear the queue after the current execution of the
+     * current callback completes.
+     *
+     * @method stop
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    stop : function () { 
+        this._q = [];
+
+        return this.pause();
+    },
+
+    /** 
+     * Returns the current index of a callback.  Pass in either the id or
+     * callback function from getCallback.
+     *
+     * @method indexOf
+     * @param callback {String|Function} the callback or its specified id
+     * @return {Number} index of the callback or -1 if not found
+     */
+    indexOf : function (callback) {
+        var i = 0, len = this._q.length, c;
+
+        for (; i < len; ++i) {
+            c = this._q[i];
+            if (c === callback || c.id === callback) {
+                return i;
+            }
+        }
+
+        return -1;
+    },
+
+    /**
+     * Retrieve a callback by its id.  Useful to modify the configuration
+     * while the queue is running.
+     *
+     * @method getCallback
+     * @param id {String} the id assigned to the callback
+     * @return {Object} the callback object
+     */
+    getCallback : function (id) {
+        var i = this.indexOf(id);
+
+        return (i > -1) ? this._q[i] : null;
+    },
+
+    /**
+     * Promotes the named callback to the top of the queue. If a callback is
+     * currently executing or looping (via until or iterations), the promotion
+     * is scheduled to occur after the current callback has completed.
+     *
+     * @method promote
+     * @param callback {String|Object} the callback object or a callback's id
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    promote : function (callback) {
+        var payload = { callback : callback },e;
+
+        if (this.isRunning()) {
+            e = this.after(SHIFT, function () {
+                    this.fire(PROMOTE, payload);
+                    e.detach();
+                }, this);
+        } else {
+            this.fire(PROMOTE, payload);
+        }
+
+        return this;
+    },
+
+    /**
+     * <p>Default functionality for the &quot;promote&quot; event.  Promotes 
the
+     * named callback to the head of the queue.</p>
+     *
+     * <p>The event object will contain a property &quot;callback&quot;, which
+     * holds the id of a callback or the callback object itself.</p>
+     *
+     * @method _defPromoteFn
+     * @param e {Event} the custom event
+     * @protected
+     */
+    _defPromoteFn : function (e) {
+        var i = this.indexOf(e.callback),
+            promoted = (i > -1) ? this._q.splice(i,1)[0] : null;
+
+        e.promoted = promoted;
+
+        if (promoted) {
+            this._q.unshift(promoted);
+        }
+    },
+
+    /**
+     * Removes the callback from the queue.  If the queue is active, the
+     * removal is scheduled to occur after the current callback has completed.
+     *
+     * @method remove
+     * @param callback {String|Object} the callback object or a callback's id
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    remove : function (callback) {
+        var payload = { callback : callback },e;
+
+        // Can't return the removed callback because of the deferral until
+        // current callback is complete
+        if (this.isRunning()) {
+            e = this.after(SHIFT, function () {
+                    this.fire(REMOVE, payload);
+                    e.detach();
+                },this);
+        } else {
+            this.fire(REMOVE, payload);
+        }
+
+        return this;
+    },
+
+    /**
+     * <p>Default functionality for the &quot;remove&quot; event.  Removes the
+     * callback from the queue.</p>
+     *
+     * <p>The event object will contain a property &quot;callback&quot;, which
+     * holds the id of a callback or the callback object itself.</p>
+     *
+     * @method _defRemoveFn
+     * @param e {Event} the custom event
+     * @protected
+     */
+    _defRemoveFn : function (e) {
+        var i = this.indexOf(e.callback);
+
+        e.removed = (i > -1) ? this._q.splice(i,1)[0] : null;
+    },
+
+    /**
+     * Returns the number of callbacks in the queue.
+     *
+     * @method size
+     * @return {Number}
+     */
+    size : function () {
+        // next() flushes callbacks that have met their until() criteria and
+        // therefore shouldn't count since they wouldn't execute anyway.
+        if (!this.isRunning()) {
+            this.next();
+        }
+
+        return this._q.length;
+    }
+});
+
+
+
+}, '3.3.0' ,{requires:['event-custom']});

Added: trunk/phpgwapi/js/yui3/async-queue/async-queue-min.js
===================================================================
--- trunk/phpgwapi/js/yui3/async-queue/async-queue-min.js                       
        (rev 0)
+++ trunk/phpgwapi/js/yui3/async-queue/async-queue-min.js       2011-01-19 
13:33:11 UTC (rev 6811)
@@ -0,0 +1,8 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+YUI.add("async-queue",function(G){G.AsyncQueue=function(){this._init();this.add.apply(this,arguments);};var
 
E=G.AsyncQueue,C="execute",B="shift",D="promote",H="remove",A=G.Lang.isObject,F=G.Lang.isFunction;E.defaults=G.mix({autoContinue:true,iterations:1,timeout:10,until:function(){this.iterations|=0;return
 
this.iterations<=0;}},G.config.queueDefaults||{});G.extend(E,G.EventTarget,{_running:false,_init:function(){G.EventTarget.call(this,{emitFacade:true});this._q=[];this.defaults={};this._initEvents();},_initEvents:function(){this.publish({"execute":{defaultFn:this._defExecFn,emitFacade:true},"shift":{defaultFn:this._defShiftFn,emitFacade:true},"add":{defaultFn:this._defAddFn,emitFacade:true},"promote":{defaultFn:this._defPromoteFn,emitFacade:true},"remove":{defaultFn:this._defRemoveFn,emitFacade:true}});},next:function(){var
 
I;while(this._q.length){I=this._q[0]=this._prepare(this._q[0]);if(I&&I.until()){this.fire(B,{callback:I});I=null;}else{break;}}return
 
I||null;},_defShiftFn:function(I){if(this.indexOf(I.callback)===0){this._q.shift();}},_prepare:function(K){if(F(K)&&K._prepared){return
 K;}var 
I=G.merge(E.defaults,{context:this,args:[],_prepared:true},this.defaults,(F(K)?{fn:K}:K)),J=G.bind(function(){if(!J._running){J.iterations--;}if(F(J.fn)){J.fn.apply(J.context||G,G.Array(J.args));}},this);return
 G.mix(J,I);},run:function(){var 
J,I=true;for(J=this.next();I&&J&&!this.isRunning();J=this.next()){I=(J.timeout<0)?this._execute(J):this._schedule(J);}if(!J){this.fire("complete");}return
 
this;},_execute:function(J){this._running=J._running=true;J.iterations--;this.fire(C,{callback:J});var
 I=this._running&&J.autoContinue;this._running=J._running=false;return 
I;},_schedule:function(I){this._running=G.later(I.timeout,this,function(){if(this._execute(I)){this.run();}});return
 false;},isRunning:function(){return 
!!this._running;},_defExecFn:function(I){I.callback();},add:function(){this.fire("add",{callbacks:G.Array(arguments,0,true)});return
 this;},_defAddFn:function(J){var 
K=this._q,I=[];G.Array.each(J.callbacks,function(L){if(A(L)){K.push(L);I.push(L);}});J.added=I;},pause:function(){if(A(this._running)){this._running.cancel();}this._running=false;return
 this;},stop:function(){this._q=[];return 
this.pause();},indexOf:function(L){var 
J=0,I=this._q.length,K;for(;J<I;++J){K=this._q[J];if(K===L||K.id===L){return 
J;}}return -1;},getCallback:function(J){var 
I=this.indexOf(J);return(I>-1)?this._q[I]:null;},promote:function(K){var 
J={callback:K},I;if(this.isRunning()){I=this.after(B,function(){this.fire(D,J);I.detach();},this);}else{this.fire(D,J);}return
 this;},_defPromoteFn:function(K){var 
I=this.indexOf(K.callback),J=(I>-1)?this._q.splice(I,1)[0]:null;K.promoted=J;if(J){this._q.unshift(J);}},remove:function(K){var
 
J={callback:K},I;if(this.isRunning()){I=this.after(B,function(){this.fire(H,J);I.detach();},this);}else{this.fire(H,J);}return
 this;},_defRemoveFn:function(J){var 
I=this.indexOf(J.callback);J.removed=(I>-1)?this._q.splice(I,1)[0]:null;},size:function(){if(!this.isRunning()){this.next();}return
 this._q.length;}});},"3.3.0",{requires:["event-custom"]});
\ No newline at end of file

Added: trunk/phpgwapi/js/yui3/async-queue/async-queue.js
===================================================================
--- trunk/phpgwapi/js/yui3/async-queue/async-queue.js                           
(rev 0)
+++ trunk/phpgwapi/js/yui3/async-queue/async-queue.js   2011-01-19 13:33:11 UTC 
(rev 6811)
@@ -0,0 +1,529 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+YUI.add('async-queue', function(Y) {
+
+/**
+ * <p>AsyncQueue allows you create a chain of function callbacks executed
+ * via setTimeout (or synchronously) that are guaranteed to run in order.
+ * Items in the queue can be promoted or removed.  Start or resume the
+ * execution chain with run().  pause() to temporarily delay execution, or
+ * stop() to halt and clear the queue.</p>
+ *
+ * @module async-queue
+ */
+
+/**
+ * <p>A specialized queue class that supports scheduling callbacks to execute
+ * sequentially, iteratively, even asynchronously.</p>
+ *
+ * <p>Callbacks can be function refs or objects with the following keys.  Only
+ * the <code>fn</code> key is required.</p>
+ *
+ * <ul>
+ * <li><code>fn</code> -- The callback function</li>
+ * <li><code>context</code> -- The execution context for the callbackFn.</li>
+ * <li><code>args</code> -- Arguments to pass to callbackFn.</li>
+ * <li><code>timeout</code> -- Millisecond delay before executing callbackFn.
+ *                     (Applies to each iterative execution of callback)</li>
+ * <li><code>iterations</code> -- Number of times to repeat the callback.
+ * <li><code>until</code> -- Repeat the callback until this function returns
+ *                         true.  This setting trumps iterations.</li>
+ * <li><code>autoContinue</code> -- Set to false to prevent the AsyncQueue from
+ *                        executing the next callback in the Queue after
+ *                        the callback completes.</li>
+ * <li><code>id</code> -- Name that can be used to get, promote, get the
+ *                        indexOf, or delete this callback.</li>
+ * </ul>
+ *
+ * @class AsyncQueue
+ * @extends EventTarget
+ * @constructor
+ * @param callback* {Function|Object} 0..n callbacks to seed the queue
+ */
+Y.AsyncQueue = function() {
+    this._init();
+    this.add.apply(this, arguments);
+};
+
+var Queue   = Y.AsyncQueue,
+    EXECUTE = 'execute',
+    SHIFT   = 'shift',
+    PROMOTE = 'promote',
+    REMOVE  = 'remove',
+
+    isObject   = Y.Lang.isObject,
+    isFunction = Y.Lang.isFunction;
+
+/**
+ * <p>Static default values used to populate callback configuration properties.
+ * Preconfigured defaults include:</p>
+ *
+ * <ul>
+ *  <li><code>autoContinue</code>: <code>true</code></li>
+ *  <li><code>iterations</code>: 1</li>
+ *  <li><code>timeout</code>: 10 (10ms between callbacks)</li>
+ *  <li><code>until</code>: (function to run until iterations &lt;= 0)</li>
+ * </ul>
+ *
+ * @property AsyncQueue.defaults
+ * @type {Object}
+ * @static
+ */
+Queue.defaults = Y.mix({
+    autoContinue : true,
+    iterations   : 1,
+    timeout      : 10,
+    until        : function () {
+        this.iterations |= 0;
+        return this.iterations <= 0;
+    }
+}, Y.config.queueDefaults || {});
+
+Y.extend(Queue, Y.EventTarget, {
+    /**
+     * Used to indicate the queue is currently executing a callback.
+     *
+     * @property _running
+     * @type {Boolean|Object} true for synchronous callback execution, the
+     *                        return handle from Y.later for async callbacks.
+     *                        Otherwise false.
+     * @protected
+     */
+    _running : false,
+
+    /**
+     * Initializes the AsyncQueue instance properties and events.
+     *
+     * @method _init
+     * @protected
+     */
+    _init : function () {
+        Y.EventTarget.call(this, { emitFacade: true });
+
+        this._q = [];
+
+        /** 
+         * Callback defaults for this instance.  Static defaults that are not
+         * overridden are also included.
+         *
+         * @property defaults
+         * @type {Object}
+         */
+        this.defaults = {};
+
+        this._initEvents();
+    },
+
+    /**
+     * Initializes the instance events.
+     *
+     * @method _initEvents
+     * @protected
+     */
+    _initEvents : function () {
+        this.publish({
+            'execute' : { defaultFn : this._defExecFn,    emitFacade: true },
+            'shift'   : { defaultFn : this._defShiftFn,   emitFacade: true },
+            'add'     : { defaultFn : this._defAddFn,     emitFacade: true },
+            'promote' : { defaultFn : this._defPromoteFn, emitFacade: true },
+            'remove'  : { defaultFn : this._defRemoveFn,  emitFacade: true }
+        });
+    },
+
+    /**
+     * Returns the next callback needing execution.  If a callback is
+     * configured to repeat via iterations or until, it will be returned until
+     * the completion criteria is met.
+     *
+     * When the queue is empty, null is returned.
+     *
+     * @method next
+     * @return {Function} the callback to execute
+     */
+    next : function () {
+        var callback;
+
+        while (this._q.length) {
+            callback = this._q[0] = this._prepare(this._q[0]);
+            if (callback && callback.until()) {
+                this.fire(SHIFT, { callback: callback });
+                callback = null;
+            } else {
+                break;
+            }
+        }
+
+        return callback || null;
+    },
+
+    /**
+     * Default functionality for the &quot;shift&quot; event.  Shifts the
+     * callback stored in the event object's <em>callback</em> property from
+     * the queue if it is the first item.
+     *
+     * @method _defShiftFn
+     * @param e {Event} The event object
+     * @protected
+     */
+    _defShiftFn : function (e) {
+        if (this.indexOf(e.callback) === 0) {
+            this._q.shift();
+        }
+    },
+
+    /**
+     * Creates a wrapper function to execute the callback using the aggregated 
+     * configuration generated by combining the static AsyncQueue.defaults, the
+     * instance defaults, and the specified callback settings.
+     *
+     * The wrapper function is decorated with the callback configuration as
+     * properties for runtime modification.
+     *
+     * @method _prepare
+     * @param callback {Object|Function} the raw callback
+     * @return {Function} a decorated function wrapper to execute the callback
+     * @protected
+     */
+    _prepare: function (callback) {
+        if (isFunction(callback) && callback._prepared) {
+            return callback;
+        }
+
+        var config = Y.merge(
+            Queue.defaults,
+            { context : this, args: [], _prepared: true },
+            this.defaults,
+            (isFunction(callback) ? { fn: callback } : callback)),
+            
+            wrapper = Y.bind(function () {
+                if (!wrapper._running) {
+                    wrapper.iterations--;
+                }
+                if (isFunction(wrapper.fn)) {
+                    wrapper.fn.apply(wrapper.context || Y,
+                                     Y.Array(wrapper.args));
+                }
+            }, this);
+            
+        return Y.mix(wrapper, config);
+    },
+
+    /**
+     * Sets the queue in motion.  All queued callbacks will be executed in
+     * order unless pause() or stop() is called or if one of the callbacks is
+     * configured with autoContinue: false.
+     *
+     * @method run
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    run : function () {
+        var callback,
+            cont = true;
+
+        for (callback = this.next();
+            cont && callback && !this.isRunning();
+            callback = this.next())
+        {
+            cont = (callback.timeout < 0) ?
+                this._execute(callback) :
+                this._schedule(callback);
+        }
+
+        if (!callback) {
+            /**
+             * Event fired after the last queued callback is executed.
+             * @event complete
+             */
+            this.fire('complete');
+        }
+
+        return this;
+    },
+
+    /**
+     * Handles the execution of callbacks. Returns a boolean indicating
+     * whether it is appropriate to continue running.
+     *
+     * @method _execute
+     * @param callback {Object} the callback object to execute
+     * @return {Boolean} whether the run loop should continue
+     * @protected
+     */
+    _execute : function (callback) {
+        this._running = callback._running = true;
+
+        callback.iterations--;
+        this.fire(EXECUTE, { callback: callback });
+
+        var cont = this._running && callback.autoContinue;
+
+        this._running = callback._running = false;
+
+        return cont;
+    },
+
+    /**
+     * Schedules the execution of asynchronous callbacks.
+     *
+     * @method _schedule
+     * @param callback {Object} the callback object to execute
+     * @return {Boolean} whether the run loop should continue
+     * @protected
+     */
+    _schedule : function (callback) {
+        this._running = Y.later(callback.timeout, this, function () {
+            if (this._execute(callback)) {
+                this.run();
+            }
+        });
+
+        return false;
+    },
+
+    /**
+     * Determines if the queue is waiting for a callback to complete execution.
+     *
+     * @method isRunning
+     * @return {Boolean} true if queue is waiting for a 
+     *                   from any initiated transactions
+     */
+    isRunning : function () {
+        return !!this._running;
+    },
+
+    /**
+     * Default functionality for the &quot;execute&quot; event.  Executes the
+     * callback function
+     *
+     * @method _defExecFn
+     * @param e {Event} the event object
+     * @protected
+     */
+    _defExecFn : function (e) {
+        e.callback();
+    },
+
+    /**
+     * Add any number of callbacks to the end of the queue. Callbacks may be
+     * provided as functions or objects.
+     *
+     * @method add
+     * @param callback* {Function|Object} 0..n callbacks
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    add : function () {
+        this.fire('add', { callbacks: Y.Array(arguments,0,true) });
+
+        return this;
+    },
+
+    /**
+     * Default functionality for the &quot;add&quot; event.  Adds the callbacks
+     * in the event facade to the queue. Callbacks successfully added to the
+     * queue are present in the event's <code>added</code> property in the
+     * after phase.
+     *
+     * @method _defAddFn
+     * @param e {Event} the event object
+     * @protected
+     */
+    _defAddFn : function(e) {
+        var _q = this._q,
+            added = [];
+
+        Y.Array.each(e.callbacks, function (c) {
+            if (isObject(c)) {
+                _q.push(c);
+                added.push(c);
+            }
+        });
+
+        e.added = added;
+    },
+
+    /**
+     * Pause the execution of the queue after the execution of the current
+     * callback completes.  If called from code outside of a queued callback,
+     * clears the timeout for the pending callback. Paused queue can be
+     * restarted with q.run()
+     *
+     * @method pause
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    pause: function () {
+        if (isObject(this._running)) {
+            this._running.cancel();
+        }
+
+        this._running = false;
+
+        return this;
+    },
+
+    /**
+     * Stop and clear the queue after the current execution of the
+     * current callback completes.
+     *
+     * @method stop
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    stop : function () { 
+        this._q = [];
+
+        return this.pause();
+    },
+
+    /** 
+     * Returns the current index of a callback.  Pass in either the id or
+     * callback function from getCallback.
+     *
+     * @method indexOf
+     * @param callback {String|Function} the callback or its specified id
+     * @return {Number} index of the callback or -1 if not found
+     */
+    indexOf : function (callback) {
+        var i = 0, len = this._q.length, c;
+
+        for (; i < len; ++i) {
+            c = this._q[i];
+            if (c === callback || c.id === callback) {
+                return i;
+            }
+        }
+
+        return -1;
+    },
+
+    /**
+     * Retrieve a callback by its id.  Useful to modify the configuration
+     * while the queue is running.
+     *
+     * @method getCallback
+     * @param id {String} the id assigned to the callback
+     * @return {Object} the callback object
+     */
+    getCallback : function (id) {
+        var i = this.indexOf(id);
+
+        return (i > -1) ? this._q[i] : null;
+    },
+
+    /**
+     * Promotes the named callback to the top of the queue. If a callback is
+     * currently executing or looping (via until or iterations), the promotion
+     * is scheduled to occur after the current callback has completed.
+     *
+     * @method promote
+     * @param callback {String|Object} the callback object or a callback's id
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    promote : function (callback) {
+        var payload = { callback : callback },e;
+
+        if (this.isRunning()) {
+            e = this.after(SHIFT, function () {
+                    this.fire(PROMOTE, payload);
+                    e.detach();
+                }, this);
+        } else {
+            this.fire(PROMOTE, payload);
+        }
+
+        return this;
+    },
+
+    /**
+     * <p>Default functionality for the &quot;promote&quot; event.  Promotes 
the
+     * named callback to the head of the queue.</p>
+     *
+     * <p>The event object will contain a property &quot;callback&quot;, which
+     * holds the id of a callback or the callback object itself.</p>
+     *
+     * @method _defPromoteFn
+     * @param e {Event} the custom event
+     * @protected
+     */
+    _defPromoteFn : function (e) {
+        var i = this.indexOf(e.callback),
+            promoted = (i > -1) ? this._q.splice(i,1)[0] : null;
+
+        e.promoted = promoted;
+
+        if (promoted) {
+            this._q.unshift(promoted);
+        }
+    },
+
+    /**
+     * Removes the callback from the queue.  If the queue is active, the
+     * removal is scheduled to occur after the current callback has completed.
+     *
+     * @method remove
+     * @param callback {String|Object} the callback object or a callback's id
+     * @return {AsyncQueue} the AsyncQueue instance
+     * @chainable
+     */
+    remove : function (callback) {
+        var payload = { callback : callback },e;
+
+        // Can't return the removed callback because of the deferral until
+        // current callback is complete
+        if (this.isRunning()) {
+            e = this.after(SHIFT, function () {
+                    this.fire(REMOVE, payload);
+                    e.detach();
+                },this);
+        } else {
+            this.fire(REMOVE, payload);
+        }
+
+        return this;
+    },
+
+    /**
+     * <p>Default functionality for the &quot;remove&quot; event.  Removes the
+     * callback from the queue.</p>
+     *
+     * <p>The event object will contain a property &quot;callback&quot;, which
+     * holds the id of a callback or the callback object itself.</p>
+     *
+     * @method _defRemoveFn
+     * @param e {Event} the custom event
+     * @protected
+     */
+    _defRemoveFn : function (e) {
+        var i = this.indexOf(e.callback);
+
+        e.removed = (i > -1) ? this._q.splice(i,1)[0] : null;
+    },
+
+    /**
+     * Returns the number of callbacks in the queue.
+     *
+     * @method size
+     * @return {Number}
+     */
+    size : function () {
+        // next() flushes callbacks that have met their until() criteria and
+        // therefore shouldn't count since they wouldn't execute anyway.
+        if (!this.isRunning()) {
+            this.next();
+        }
+
+        return this._q.length;
+    }
+});
+
+
+
+}, '3.3.0' ,{requires:['event-custom']});

Added: trunk/phpgwapi/js/yui3/autocomplete/assets/autocomplete-list-core.css
===================================================================
--- trunk/phpgwapi/js/yui3/autocomplete/assets/autocomplete-list-core.css       
                        (rev 0)
+++ trunk/phpgwapi/js/yui3/autocomplete/assets/autocomplete-list-core.css       
2011-01-19 13:33:11 UTC (rev 6811)
@@ -0,0 +1,32 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+.yui3-aclist { position: absolute; }
+.yui3-aclist-hidden { visibility: hidden; }
+
+.yui3-aclist-aria {
+    /* Hide from sighted users, show to screen readers. */
+    left: -9999px;
+    position: absolute;
+}
+
+.yui3-aclist-list {
+    list-style: none;
+    margin: 0;
+    overflow: hidden;
+    padding: 0;
+}
+
+.yui3-aclist-item {
+    cursor: pointer;
+    list-style: none;
+    padding: 2px 5px;
+}
+
+.yui3-aclist-item-active {
+    outline: #afafaf dotted thin;
+}

Added: 
trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete-list-skin.css
===================================================================
--- 
trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete-list-skin.css 
                            (rev 0)
+++ 
trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete-list-skin.css 
    2011-01-19 13:33:11 UTC (rev 6811)
@@ -0,0 +1,24 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+.yui3-skin-sam .yui3-aclist-content {
+    -moz-box-shadow: 1px 1px 4px #888;
+    -webkit-box-shadow: 1px 1px 4px #888;
+    background: #fff;
+    border: 1px solid #afafaf;
+    box-shadow: 1px 1px 4px #888;
+}
+
+.yui3-skin-sam .yui3-aclist-item-hover {
+    background: #bfdaff;
+}
+
+.yui3-skin-sam .yui3-aclist-item-active {
+    background: #2647a0;
+    color: #fff;
+    outline: none;
+}
\ No newline at end of file

Added: 
trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete-list.css
===================================================================
--- trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete-list.css  
                        (rev 0)
+++ trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete-list.css  
2011-01-19 13:33:11 UTC (rev 6811)
@@ -0,0 +1,8 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+.yui3-aclist{position:absolute}.yui3-aclist-hidden{visibility:hidden}.yui3-aclist-aria{left:-9999px;position:absolute}.yui3-aclist-list{list-style:none;margin:0;overflow:hidden;padding:0}.yui3-aclist-item{cursor:pointer;list-style:none;padding:2px
 5px}.yui3-aclist-item-active{outline:#afafaf dotted thin}.yui3-skin-sam 
.yui3-aclist-content{-moz-box-shadow:1px 1px 4px #888;-webkit-box-shadow:1px 
1px 4px #888;background:#fff;border:1px solid #afafaf;box-shadow:1px 1px 4px 
#888}.yui3-skin-sam .yui3-aclist-item-hover{background:#bfdaff}.yui3-skin-sam 
.yui3-aclist-item-active{background:#2647a0;color:#fff;outline:0}

Added: trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete.css
===================================================================
--- trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete.css       
                        (rev 0)
+++ trunk/phpgwapi/js/yui3/autocomplete/assets/skins/sam/autocomplete.css       
2011-01-19 13:33:11 UTC (rev 6811)
@@ -0,0 +1,8 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+.yui3-aclist{position:absolute}.yui3-aclist-hidden{visibility:hidden}.yui3-aclist-aria{left:-9999px;position:absolute}.yui3-aclist-list{list-style:none;margin:0;overflow:hidden;padding:0}.yui3-aclist-item{cursor:pointer;list-style:none;padding:2px
 5px}.yui3-aclist-item-active{outline:#afafaf dotted thin}.yui3-skin-sam 
.yui3-aclist-content{-moz-box-shadow:1px 1px 4px #888;-webkit-box-shadow:1px 
1px 4px #888;background:#fff;border:1px solid #afafaf;box-shadow:1px 1px 4px 
#888}.yui3-skin-sam .yui3-aclist-item-hover{background:#bfdaff}.yui3-skin-sam 
.yui3-aclist-item-active{background:#2647a0;color:#fff;outline:0}

Added: trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base-debug.js
===================================================================
--- trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base-debug.js              
                (rev 0)
+++ trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base-debug.js      
2011-01-19 13:33:11 UTC (rev 6811)
@@ -0,0 +1,1532 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+YUI.add('autocomplete-base', function(Y) {
+
+/**
+ * Provides automatic input completion or suggestions for text input fields and
+ * textareas.
+ *
+ * @module autocomplete
+ * @since 3.3.0
+ */
+
+/**
+ * <code>Y.Base</code> extension that provides core autocomplete logic (but no
+ * UI implementation) for a text input field or textarea. Must be mixed into a
+ * <code>Y.Base</code>-derived class to be useful.
+ *
+ * @module autocomplete
+ * @submodule autocomplete-base
+ */
+
+/**
+ * <p>
+ * Extension that provides core autocomplete logic (but no UI implementation)
+ * for a text input field or textarea.
+ * </p>
+ *
+ * <p>
+ * The <code>AutoCompleteBase</code> class provides events and attributes that
+ * abstract away core autocomplete logic and configuration, but does not 
provide
+ * a widget implementation or suggestion UI. For a prepackaged autocomplete
+ * widget, see <code>AutoCompleteList</code>.
+ * </p>
+ *
+ * <p>
+ * This extension cannot be instantiated directly, since it doesn't provide an
+ * actual implementation. It's intended to be mixed into a
+ * <code>Y.Base</code>-based class or widget.
+ * </p>
+ *
+ * <p>
+ * <code>Y.Widget</code>-based example:
+ * </p>
+ *
+ * <pre>
+ * YUI().use('autocomplete-base', 'widget', function (Y) {
+ * &nbsp;&nbsp;var MyAC = Y.Base.create('myAC', Y.Widget, 
[Y.AutoCompleteBase], {
+ * &nbsp;&nbsp;&nbsp;&nbsp;// Custom prototype methods and properties.
+ * &nbsp;&nbsp;}, {
+ * &nbsp;&nbsp;&nbsp;&nbsp;// Custom static methods and properties.
+ * &nbsp;&nbsp;});
+ * &nbsp;
+ * &nbsp;&nbsp;// Custom implementation code.
+ * });
+ * </pre>
+ *
+ * <p>
+ * <code>Y.Base</code>-based example:
+ * </p>
+ *
+ * <pre>
+ * YUI().use('autocomplete-base', function (Y) {
+ * &nbsp;&nbsp;var MyAC = Y.Base.create('myAC', Y.Base, [Y.AutoCompleteBase], {
+ * &nbsp;&nbsp;&nbsp;&nbsp;initializer: function () {
+ * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._bindUIACBase();
+ * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._syncUIACBase();
+ * &nbsp;&nbsp;&nbsp;&nbsp;},
+ * &nbsp;
+ * &nbsp;&nbsp;&nbsp;&nbsp;// Custom prototype methods and properties.
+ * &nbsp;&nbsp;}, {
+ * &nbsp;&nbsp;&nbsp;&nbsp;// Custom static methods and properties.
+ * &nbsp;&nbsp;});
+ * &nbsp;
+ * &nbsp;&nbsp;// Custom implementation code.
+ * });
+ * </pre>
+ *
+ * @class AutoCompleteBase
+ */
+
+var Escape  = Y.Escape,
+    Lang    = Y.Lang,
+    YArray  = Y.Array,
+    YObject = Y.Object,
+
+    isFunction = Lang.isFunction,
+    isString   = Lang.isString,
+    trim       = Lang.trim,
+
+    INVALID_VALUE = Y.Attribute.INVALID_VALUE,
+
+    _FUNCTION_VALIDATOR = '_functionValidator',
+    _SOURCE_SUCCESS     = '_sourceSuccess',
+
+    ALLOW_BROWSER_AC    = 'allowBrowserAutocomplete',
+    INPUT_NODE          = 'inputNode',
+    QUERY               = 'query',
+    QUERY_DELIMITER     = 'queryDelimiter',
+    REQUEST_TEMPLATE    = 'requestTemplate',
+    RESULTS             = 'results',
+    RESULT_LIST_LOCATOR = 'resultListLocator',
+    VALUE               = 'value',
+    VALUE_CHANGE        = 'valueChange',
+
+    EVT_CLEAR   = 'clear',
+    EVT_QUERY   = QUERY,
+    EVT_RESULTS = RESULTS;
+
+function AutoCompleteBase() {
+    // AOP bindings.
+    Y.before(this._bindUIACBase, this, 'bindUI');
+    Y.before(this._destructorACBase, this, 'destructor');
+    Y.before(this._syncUIACBase, this, 'syncUI');
+
+    // -- Public Events 
--------------------------------------------------------
+
+    /**
+     * Fires after the query has been completely cleared or no longer meets the
+     * minimum query length requirement.
+     *
+     * @event clear
+     * @param {EventFacade} e Event facade with the following additional
+     *   properties:
+     *
+     * <dl>
+     *   <dt>prevVal (String)</dt>
+     *   <dd>
+     *     Value of the query before it was cleared.
+     *   </dd>
+     * </dl>
+     *
+     * @preventable _defClearFn
+     */
+    this.publish(EVT_CLEAR, {
+        defaultFn: this._defClearFn
+    });
+
+    /**
+     * Fires when the contents of the input field have changed and the input
+     * value meets the criteria necessary to generate an autocomplete query.
+     *
+     * @event query
+     * @param {EventFacade} e Event facade with the following additional
+     *   properties:
+     *
+     * <dl>
+     *   <dt>inputValue (String)</dt>
+     *   <dd>
+     *     Full contents of the text input field or textarea that generated
+     *     the query.
+     *   </dd>
+     *
+     *   <dt>query (String)</dt>
+     *   <dd>
+     *     Autocomplete query. This is the string that will be used to
+     *     request completion results. It may or may not be the same as
+     *     <code>inputValue</code>.
+     *   </dd>
+     * </dl>
+     *
+     * @preventable _defQueryFn
+     */
+    this.publish(EVT_QUERY, {
+        defaultFn: this._defQueryFn
+    });
+
+    /**
+     * Fires after query results are received from the <code>source</code>. If
+     * no source has been set, this event will not fire.
+     *
+     * @event results
+     * @param {EventFacade} e Event facade with the following additional
+     *   properties:
+     *
+     * <dl>
+     *   <dt>data (Array|Object)</dt>
+     *   <dd>
+     *     Raw, unfiltered result data (if available).
+     *   </dd>
+     *
+     *   <dt>query (String)</dt>
+     *   <dd>
+     *     Query that generated these results.
+     *   </dd>
+     *
+     *   <dt>results (Array)</dt>
+     *   <dd>
+     *     Array of filtered, formatted, and highlighted results. Each item in
+     *     the array is an object with the following properties:
+     *
+     *     <dl>
+     *       <dt>display (Node|HTMLElement|String)</dt>
+     *       <dd>
+     *         Formatted result HTML suitable for display to the user. If no
+     *         custom formatter is set, this will be an HTML-escaped version of
+     *         the string in the <code>text</code> property.
+     *       </dd>
+     *
+     *       <dt>highlighted (String)</dt>
+     *       <dd>
+     *         Highlighted (but not formatted) result text. This property will
+     *         only be set if a highlighter is in use.
+     *       </dd>
+     *
+     *       <dt>raw (mixed)</dt>
+     *       <dd>
+     *         Raw, unformatted result in whatever form it was provided by the
+     *         <code>source</code>.
+     *       </dd>
+     *
+     *       <dt>text (String)</dt>
+     *       <dd>
+     *         Plain text version of the result, suitable for being inserted
+     *         into the value of a text input field or textarea when the result
+     *         is selected by a user. This value is not HTML-escaped and should
+     *         not be inserted into the page using innerHTML.
+     *       </dd>
+     *     </dl>
+     *   </dd>
+     * </dl>
+     *
+     * @preventable _defResultsFn
+     */
+    this.publish(EVT_RESULTS, {
+        defaultFn: this._defResultsFn
+    });
+}
+
+// -- Public Static Properties 
-------------------------------------------------
+AutoCompleteBase.ATTRS = {
+    /**
+     * Whether or not to enable the browser's built-in autocomplete
+     * functionality for input fields.
+     *
+     * @attribute allowBrowserAutocomplete
+     * @type Boolean
+     * @default false
+     */
+    allowBrowserAutocomplete: {
+        value: false
+    },
+
+    /**
+     * When a <code>queryDelimiter</code> is set, trailing delimiters will
+     * automatically be stripped from the input value by default when the
+     * input node loses focus. Set this to <code>true</code> to allow trailing
+     * delimiters.
+     *
+     * @attribute allowTrailingDelimiter
+     * @type Boolean
+     * @default false
+     */
+    allowTrailingDelimiter: {
+        value: false
+    },
+
+    /**
+     * Node to monitor for changes, which will generate <code>query</code>
+     * events when appropriate. May be either an input field or a textarea.
+     *
+     * @attribute inputNode
+     * @type Node|HTMLElement|String
+     * @writeonce
+     */
+    inputNode: {
+        setter: Y.one,
+        writeOnce: 'initOnly'
+    },
+
+    /**
+     * Maximum number of results to return. A value of <code>0</code> or less
+     * will allow an unlimited number of results.
+     *
+     * @attribute maxResults
+     * @type Number
+     * @default 0
+     */
+    maxResults: {
+        value: 0
+    },
+
+    /**
+     * Minimum number of characters that must be entered before a
+     * <code>query</code> event will be fired. A value of <code>0</code>
+     * allows empty queries; a negative value will effectively disable all
+     * <code>query</code> events.
+     *
+     * @attribute minQueryLength
+     * @type Number
+     * @default 1
+     */
+    minQueryLength: {
+        value: 1
+    },
+
+    /**
+     * <p>
+     * Current query, or <code>null</code> if there is no current query.
+     * </p>
+     *
+     * <p>
+     * The query might not be the same as the current value of the input
+     * node, both for timing reasons (due to <code>queryDelay</code>) and
+     * because when one or more <code>queryDelimiter</code> separators are
+     * in use, only the last portion of the delimited input string will be
+     * used as the query value.
+     * </p>
+     *
+     * @attribute query
+     * @type String|null
+     * @default null
+     * @readonly
+     */
+    query: {
+        readOnly: true,
+        value: null
+    },
+
+    /**
+     * <p>
+     * Number of milliseconds to delay after input before triggering a
+     * <code>query</code> event. If new input occurs before this delay is
+     * over, the previous input event will be ignored and a new delay will
+     * begin.
+     * </p>
+     *
+     * <p>
+     * This can be useful both to throttle queries to a remote data source
+     * and to avoid distracting the user by showing them less relevant
+     * results before they've paused their typing.
+     * </p>
+     *
+     * @attribute queryDelay
+     * @type Number
+     * @default 100
+     */
+    queryDelay: {
+        value: 100
+    },
+
+    /**
+     * Query delimiter string. When a delimiter is configured, the input value
+     * will be split on the delimiter, and only the last portion will be used 
in
+     * autocomplete queries and updated when the <code>query</code> attribute 
is
+     * modified.
+     *
+     * @attribute queryDelimiter
+     * @type String|null
+     * @default null
+     */
+    queryDelimiter: {
+        value: null
+    },
+
+    /**
+     * <p>
+     * Source request template. This can be a function that accepts a query as 
a
+     * parameter and returns a request string, or it can be a string containing
+     * the placeholder "{query}", which will be replaced with the actual
+     * URI-encoded query. In either case, the resulting string will be appended
+     * to the request URL when the <code>source</code> attribute is set to a
+     * remote DataSource, JSONP URL, or XHR URL (it will not be appended to YQL
+     * URLs).
+     * </p>
+     *
+     * <p>
+     * While <code>requestTemplate</code> may be set to either a function or
+     * a string, it will always be returned as a function that accepts a
+     * query argument and returns a string.
+     * </p>
+     *
+     * @attribute requestTemplate
+     * @type Function|String|null
+     * @default null
+     */
+    requestTemplate: {
+        setter: '_setRequestTemplate',
+        value: null
+    },
+
+    /**
+     * <p>
+     * Array of local result filter functions. If provided, each filter
+     * will be called with two arguments when results are received: the query
+     * and an array of result objects. See the documentation for the
+     * <code>results</code> event for a list of the properties available on 
each
+     * result object.
+     * </p>
+     *
+     * <p>
+     * Each filter is expected to return a filtered or modified version of the
+     * results array, which will then be passed on to subsequent filters, then
+     * the <code>resultHighlighter</code> function (if set), then the
+     * <code>resultFormatter</code> function (if set), and finally to
+     * subscribers to the <code>results</code> event.
+     * </p>
+     *
+     * <p>
+     * If no <code>source</code> is set, result filters will not be called.
+     * </p>
+     *
+     * <p>
+     * Prepackaged result filters provided by the autocomplete-filters and
+     * autocomplete-filters-accentfold modules can be used by specifying the
+     * filter name as a string, such as <code>'phraseMatch'</code> (assuming
+     * the necessary filters module is loaded).
+     * </p>
+     *
+     * @attribute resultFilters
+     * @type Array
+     * @default []
+     */
+    resultFilters: {
+        setter: '_setResultFilters',
+        value: []
+    },
+
+    /**
+     * <p>
+     * Function which will be used to format results. If provided, this 
function
+     * will be called with two arguments after results have been received and
+     * filtered: the query and an array of result objects. The formatter is
+     * expected to return an array of HTML strings or Node instances containing
+     * the desired HTML for each result.
+     * </p>
+     *
+     * <p>
+     * See the documentation for the <code>results</code> event for a list of
+     * the properties available on each result object.
+     * </p>
+     *
+     * <p>
+     * If no <code>source</code> is set, the formatter will not be called.
+     * </p>
+     *
+     * @attribute resultFormatter
+     * @type Function|null
+     */
+    resultFormatter: {
+        validator: _FUNCTION_VALIDATOR
+    },
+
+    /**
+     * <p>
+     * Function which will be used to highlight results. If provided, this
+     * function will be called with two arguments after results have been
+     * received and filtered: the query and an array of filtered result 
objects.
+     * The highlighter is expected to return an array of highlighted result
+     * text in the form of HTML strings.
+     * </p>
+     *
+     * <p>
+     * See the documentation for the <code>results</code> event for a list of
+     * the properties available on each result object.
+     * </p>
+     *
+     * <p>
+     * If no <code>source</code> is set, the highlighter will not be called.
+     * </p>
+     *
+     * @attribute resultHighlighter
+     * @type Function|null
+     */
+    resultHighlighter: {
+        setter: '_setResultHighlighter'
+    },
+
+    /**
+     * <p>
+     * Locator that should be used to extract an array of results from a
+     * non-array response.
+     * </p>
+     *
+     * <p>
+     * By default, no locator is applied, and all responses are assumed to be
+     * arrays by default. If all responses are already arrays, you don't need 
to
+     * define a locator.
+     * </p>
+     *
+     * <p>
+     * The locator may be either a function (which will receive the raw 
response
+     * as an argument and must return an array) or a string representing an
+     * object path, such as "foo.bar.baz" (which would return the value of
+     * <code>result.foo.bar.baz</code> if the response is an object).
+     * </p>
+     *
+     * <p>
+     * While <code>resultListLocator</code> may be set to either a function or 
a
+     * string, it will always be returned as a function that accepts a response
+     * argument and returns an array.
+     * </p>
+     *
+     * @attribute resultListLocator
+     * @type Function|String|null
+     */
+    resultListLocator: {
+        setter: '_setLocator'
+    },
+
+    /**
+     * Current results, or an empty array if there are no results.
+     *
+     * @attribute results
+     * @type Array
+     * @default []
+     * @readonly
+     */
+    results: {
+        readOnly: true,
+        value: []
+    },
+
+    /**
+     * <p>
+     * Locator that should be used to extract a plain text string from a
+     * non-string result item. The resulting text value will typically be the
+     * value that ends up being inserted into an input field or textarea when
+     * the user of an autocomplete implementation selects a result.
+     * </p>
+     *
+     * <p>
+     * By default, no locator is applied, and all results are assumed to be
+     * plain text strings. If all results are already plain text strings, you
+     * don't need to define a locator.
+     * </p>
+     *
+     * <p>
+     * The locator may be either a function (which will receive the raw result
+     * as an argument and must return a string) or a string representing an
+     * object path, such as "foo.bar.baz" (which would return the value of
+     * <code>result.foo.bar.baz</code> if the result is an object).
+     * </p>
+     *
+     * <p>
+     * While <code>resultTextLocator</code> may be set to either a function or 
a
+     * string, it will always be returned as a function that accepts a result
+     * argument and returns a string.
+     * </p>
+     *
+     * @attribute resultTextLocator
+     * @type Function|String|null
+     */
+    resultTextLocator: {
+        setter: '_setLocator'
+    },
+
+    /**
+     * <p>
+     * Source for autocomplete results. The following source types are
+     * supported:
+     * </p>
+     *
+     * <dl>
+     *   <dt>Array</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> <code>['first result', 'second result', 
'etc']</code>
+     *     </p>
+     *
+     *     <p>
+     *     The full array will be provided to any configured filters for each
+     *     query. This is an easy way to create a fully client-side 
autocomplete
+     *     implementation.
+     *     </p>
+     *   </dd>
+     *
+     *   <dt>DataSource</dt>
+     *   <dd>
+     *     <p>
+     *     A <code>DataSource</code> instance or other object that provides a
+     *     DataSource-like <code>sendRequest</code> method. See the
+     *     <code>DataSource</code> documentation for details.
+     *     </p>
+     *   </dd>
+     *
+     *   <dt>Function</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> <code>function (query) { return ['foo', 'bar']; 
}</code>
+     *     </p>
+     *
+     *     <p>
+     *     A function source will be called with the current query as a
+     *     parameter, and should return an array of results.
+     *     </p>
+     *   </dd>
+     *
+     *   <dt>Object</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> <code>{foo: ['foo result 1', 'foo result 2'], bar: 
['bar result']}</code>
+     *     </p>
+     *
+     *     <p>
+     *     An object will be treated as a query hashmap. If a property on the
+     *     object matches the current query, the value of that property will be
+     *     used as the response.
+     *     </p>
+     *
+     *     <p>
+     *     The response is assumed to be an array of results by default. If the
+     *     response is not an array, provide a <code>resultListLocator</code> 
to
+     *     process the response and return an array.
+     *     </p>
+     *   </dd>
+     * </dl>
+     *
+     * <p>
+     * If the optional <code>autocomplete-sources</code> module is loaded, then
+     * the following additional source types will be supported as well:
+     * </p>
+     *
+     * <dl>
+     *   <dt>String (JSONP URL)</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> 
<code>'http://example.com/search?q={query}&callback={callback}'</code>
+     *     </p>
+     *
+     *     <p>
+     *     If a URL with a <code>{callback}</code> placeholder is provided, it
+     *     will be used to make a JSONP request. The <code>{query}</code>
+     *     placeholder will be replaced with the current query, and the
+     *     <code>{callback}</code> placeholder will be replaced with an
+     *     internally-generated JSONP callback name. Both placeholders must
+     *     appear in the URL, or the request will fail. An optional
+     *     <code>{maxResults}</code> placeholder may also be provided, and will
+     *     be replaced with the value of the maxResults attribute (or 1000 if
+     *     the maxResults attribute is 0 or less).
+     *     </p>
+     *
+     *     <p>
+     *     The response is assumed to be an array of results by default. If the
+     *     response is not an array, provide a <code>resultListLocator</code> 
to
+     *     process the response and return an array.
+     *     </p>
+     *
+     *     <p>
+     *     <strong>The <code>jsonp</code> module must be loaded in order for
+     *     JSONP URL sources to work.</strong> If the <code>jsonp</code> module
+     *     is not already loaded, it will be loaded on demand if possible.
+     *     </p>
+     *   </dd>
+     *
+     *   <dt>String (XHR URL)</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> <code>'http://example.com/search?q={query}'</code>
+     *     </p>
+     *
+     *     <p>
+     *     If a URL without a <code>{callback}</code> placeholder is provided,
+     *     it will be used to make a same-origin XHR request. The
+     *     <code>{query}</code> placeholder will be replaced with the current
+     *     query. An optional <code>{maxResults}</code> placeholder may also be
+     *     provided, and will be replaced with the value of the maxResults
+     *     attribute (or 1000 if the maxResults attribute is 0 or less).
+     *     </p>
+     *
+     *     <p>
+     *     The response is assumed to be a JSON array of results by default. If
+     *     the response is a JSON object and not an array, provide a
+     *     <code>resultListLocator</code> to process the response and return an
+     *     array. If the response is in some form other than JSON, you will
+     *     need to use a custom DataSource instance as the source.
+     *     </p>
+     *
+     *     <p>
+     *     <strong>The <code>io-base</code> and <code>json-parse</code> modules
+     *     must be loaded in order for XHR URL sources to work.</strong> If
+     *     these modules are not already loaded, they will be loaded on demand
+     *     if possible.
+     *     </p>
+     *   </dd>
+     *
+     *   <dt>String (YQL query)</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> <code>'select * from search.suggest where 
query="{query}"'</code>
+     *     </p>
+     *
+     *     <p>
+     *     If a YQL query is provided, it will be used to make a YQL request.
+     *     The <code>{query}</code> placeholder will be replaced with the
+     *     current autocomplete query. This placeholder must appear in the YQL
+     *     query, or the request will fail. An optional
+     *     <code>{maxResults}</code> placeholder may also be provided, and will
+     *     be replaced with the value of the maxResults attribute (or 1000 if
+     *     the maxResults attribute is 0 or less).
+     *     </p>
+     *
+     *     <p>
+     *     <strong>The <code>yql</code> module must be loaded in order for YQL
+     *     sources to work.</strong> If the <code>yql</code> module is not
+     *     already loaded, it will be loaded on demand if possible.
+     *     </p>
+     *   </dd>
+     * </dl>
+     *
+     * <p>
+     * As an alternative to providing a source, you could simply listen for
+     * <code>query</code> events and handle them any way you see fit. Providing
+     * a source is optional, but will usually be simpler.
+     * </p>
+     *
+     * @attribute source
+     * @type Array|DataSource|Function|Object|String|null
+     */
+    source: {
+        setter: '_setSource'
+    },
+
+    /**
+     * If the <code>inputNode</code> specified at instantiation time has a
+     * <code>node-tokeninput</code> plugin attached to it, this attribute will
+     * be a reference to the <code>Y.Plugin.TokenInput</code> instance.
+     *
+     * @attribute tokenInput
+     * @type Plugin.TokenInput
+     * @readonly
+     */
+    tokenInput: {
+        readOnly: true
+    },
+
+    /**
+     * Current value of the input node.
+     *
+     * @attribute value
+     * @type String
+     * @default ''
+     */
+    value: {
+        // Why duplicate this._inputNode.get('value')? Because we need a
+        // reliable way to track the source of value changes. We want to 
perform
+        // completion when the user changes the value, but not when we change
+        // the value.
+        value: ''
+    }
+};
+
+AutoCompleteBase.CSS_PREFIX = 'ac';
+AutoCompleteBase.UI_SRC = (Y.Widget && Y.Widget.UI_SRC) || 'ui';
+
+AutoCompleteBase.prototype = {
+    // -- Public Prototype Methods 
---------------------------------------------
+
+    /**
+     * <p>
+     * Sends a request to the configured source. If no source is configured,
+     * this method won't do anything.
+     * </p>
+     *
+     * <p>
+     * Usually there's no reason to call this method manually; it will be
+     * called automatically when user input causes a <code>query</code> event 
to
+     * be fired. The only time you'll need to call this method manually is if
+     * you want to force a request to be sent when no user input has occurred.
+     * </p>
+     *
+     * @method sendRequest
+     * @param {String} query (optional) Query to send. If specified, the
+     *   <code>query</code> attribute will be set to this query. If not
+     *   specified, the current value of the <code>query</code> attribute will
+     *   be used.
+     * @param {Function} requestTemplate (optional) Request template function.
+     *   If not specified, the current value of the 
<code>requestTemplate</code>
+     *   attribute will be used.
+     * @chainable
+     */
+    sendRequest: function (query, requestTemplate) {
+        var request,
+            source = this.get('source');
+
+        if (query || query === '') {
+            this._set(QUERY, query);
+        } else {
+            query = this.get(QUERY);
+        }
+
+        if (source) {
+            if (!requestTemplate) {
+                requestTemplate = this.get(REQUEST_TEMPLATE);
+            }
+
+            request = requestTemplate ? requestTemplate(query) : query;
+
+            Y.log('sendRequest: ' + request, 'info', 'autocomplete-base');
+
+            source.sendRequest({
+                request: request,
+                callback: {
+                    success: Y.bind(this._onResponse, this, query)
+                }
+            });
+        }
+
+        return this;
+    },
+
+    // -- Protected Lifecycle Methods 
------------------------------------------
+
+    /**
+     * Attaches event listeners and behaviors.
+     *
+     * @method _bindUIACBase
+     * @protected
+     */
+    _bindUIACBase: function () {
+        var inputNode  = this.get(INPUT_NODE),
+            tokenInput = inputNode && inputNode.tokenInput;
+
+        // If the inputNode has a node-tokeninput plugin attached, bind to the
+        // plugin's inputNode instead.
+        if (tokenInput) {
+            inputNode = tokenInput.get(INPUT_NODE);
+            this._set('tokenInput', tokenInput);
+        }
+
+        if (!inputNode) {
+            Y.error('No inputNode specified.');
+            return;
+        }
+
+        this._inputNode = inputNode;
+
+        this._acBaseEvents = [
+            // This is the valueChange event on the inputNode, provided by the
+            // event-valuechange module, not our own valueChange.
+            inputNode.on(VALUE_CHANGE, this._onInputValueChange, this),
+
+            inputNode.on('blur', this._onInputBlur, this),
+
+            this.after(ALLOW_BROWSER_AC + 'Change', 
this._syncBrowserAutocomplete),
+            this.after(VALUE_CHANGE, this._afterValueChange)
+        ];
+    },
+
+    /**
+     * Detaches AutoCompleteBase event listeners.
+     *
+     * @method _destructorACBase
+     * @protected
+     */
+    _destructorACBase: function () {
+        var events = this._acBaseEvents;
+
+        while (events && events.length) {
+            events.pop().detach();
+        }
+    },
+
+    /**
+     * Synchronizes the UI state of the <code>inputNode</code>.
+     *
+     * @method _syncUIACBase
+     * @protected
+     */
+    _syncUIACBase: function () {
+        this._syncBrowserAutocomplete();
+        this.set(VALUE, this.get(INPUT_NODE).get(VALUE));
+    },
+
+    // -- Protected Prototype Methods 
------------------------------------------
+
+    /**
+     * Creates a DataSource-like object that simply returns the specified array
+     * as a response. See the <code>source</code> attribute for more details.
+     *
+     * @method _createArraySource
+     * @param {Array} source
+     * @return {Object} DataSource-like object.
+     * @protected
+     */
+    _createArraySource: function (source) {
+        var that = this;
+
+        return {sendRequest: function (request) {
+            that[_SOURCE_SUCCESS](source.concat(), request);
+        }};
+    },
+
+    /**
+     * Creates a DataSource-like object that passes the query to a
+     * custom-defined function, which is expected to return an array as a
+     * response. See the <code>source</code> attribute for more details.
+     *
+     * @method _createFunctionSource
+     * @param {Function} source Function that accepts a query parameter and
+     *   returns an array of results.
+     * @return {Object} DataSource-like object.
+     * @protected
+     */
+    _createFunctionSource: function (source) {
+        var that = this;
+
+        return {sendRequest: function (request) {
+            that[_SOURCE_SUCCESS](source(request.request) || [], request);
+        }};
+    },
+
+    /**
+     * Creates a DataSource-like object that looks up queries as properties on
+     * the specified object, and returns the found value (if any) as a 
response.
+     * See the <code>source</code> attribute for more details.
+     *
+     * @method _createObjectSource
+     * @param {Object} source
+     * @return {Object} DataSource-like object.
+     * @protected
+     */
+    _createObjectSource: function (source) {
+        var that = this;
+
+        return {sendRequest: function (request) {
+            var query = request.request;
+
+            that[_SOURCE_SUCCESS](
+                YObject.owns(source, query) ? source[query] : [],
+                request
+            );
+        }};
+    },
+
+    /**
+     * Returns <code>true</code> if <i>value</i> is either a function or
+     * <code>null</code>.
+     *
+     * @method _functionValidator
+     * @param {Function|null} value Value to validate.
+     * @protected
+     */
+    _functionValidator: function (value) {
+        return value === null || isFunction(value);
+    },
+
+    /**
+     * Faster and safer alternative to Y.Object.getValue(). Doesn't bother
+     * casting the path to an array (since we already know it's an array) and
+     * doesn't throw an error if a value in the middle of the object hierarchy
+     * is neither <code>undefined</code> nor an object.
+     *
+     * @method _getObjectValue
+     * @param {Object} obj
+     * @param {Array} path
+     * @return {mixed} Located value, or <code>undefined</code> if the value 
was
+     *   not found at the specified path.
+     * @protected
+     */
+    _getObjectValue: function (obj, path) {
+        if (!obj) {
+            return;
+        }
+
+        for (var i = 0, len = path.length; obj && i < len; i++) {
+            obj = obj[path[i]];
+        }
+
+        return obj;
+    },
+
+    /**
+     * Parses result responses, performs filtering and highlighting, and fires
+     * the <code>results</code> event.
+     *
+     * @method _parseResponse
+     * @param {String} query Query that generated these results.
+     * @param {Object} response Response containing results.
+     * @param {Object} data Raw response data.
+     * @protected
+     */
+    _parseResponse: function (query, response, data) {
+        var facade = {
+                data   : data,
+                query  : query,
+                results: []
+            },
+
+            listLocator = this.get(RESULT_LIST_LOCATOR),
+            results     = [],
+            unfiltered  = response && response.results,
+
+            filters,
+            formatted,
+            formatter,
+            highlighted,
+            highlighter,
+            i,
+            len,
+            maxResults,
+            result,
+            text,
+            textLocator;
+
+        if (unfiltered && listLocator) {
+            unfiltered = listLocator(unfiltered);
+        }
+
+        if (unfiltered && unfiltered.length) {
+            filters     = this.get('resultFilters');
+            textLocator = this.get('resultTextLocator');
+
+            // Create a lightweight result object for each result to make them
+            // easier to work with. The various properties on the object
+            // represent different formats of the result, and will be populated
+            // as we go.
+            for (i = 0, len = unfiltered.length; i < len; ++i) {
+                result = unfiltered[i];
+                text   = textLocator ? textLocator(result) : result.toString();
+
+                results.push({
+                    display: Escape.html(text),
+                    raw    : result,
+                    text   : text
+                });
+            }
+
+            // Run the results through all configured result filters. Each
+            // filter returns an array of (potentially fewer) result objects,
+            // which is then passed to the next filter, and so on.
+            for (i = 0, len = filters.length; i < len; ++i) {
+                results = filters[i](query, results.concat());
+
+                if (!results) {
+                    Y.log("Filter didn't return anything.", 'warn', 
'autocomplete-base');
+                    return;
+                }
+
+                if (!results.length) {
+                    break;
+                }
+            }
+
+            if (results.length) {
+                formatter   = this.get('resultFormatter');
+                highlighter = this.get('resultHighlighter');
+                maxResults  = this.get('maxResults');
+
+                // If maxResults is set and greater than 0, limit the number of
+                // results.
+                if (maxResults && maxResults > 0 &&
+                        results.length > maxResults) {
+                    results.length = maxResults;
+                }
+
+                // Run the results through the configured highlighter (if any).
+                // The highlighter returns an array of highlighted strings (not
+                // an array of result objects), and these strings are then 
added
+                // to each result object.
+                if (highlighter) {
+                    highlighted = highlighter(query, results.concat());
+
+                    if (!highlighted) {
+                        Y.log("Highlighter didn't return anything.", 'warn', 
'autocomplete-base');
+                        return;
+                    }
+
+                    for (i = 0, len = highlighted.length; i < len; ++i) {
+                        result = results[i];
+                        result.highlighted = highlighted[i];
+                        result.display     = result.highlighted;
+                    }
+                }
+
+                // Run the results through the configured formatter (if any) to
+                // produce the final formatted results. The formatter returns 
an
+                // array of strings or Node instances (not an array of result
+                // objects), and these strings/Nodes are then added to each
+                // result object.
+                if (formatter) {
+                    formatted = formatter(query, results.concat());
+
+                    if (!formatted) {
+                        Y.log("Formatter didn't return anything.", 'warn', 
'autocomplete-base');
+                        return;
+                    }
+
+                    for (i = 0, len = formatted.length; i < len; ++i) {
+                        results[i].display = formatted[i];
+                    }
+                }
+            }
+        }
+
+        facade.results = results;
+        this.fire(EVT_RESULTS, facade);
+    },
+
+    /**
+     * <p>
+     * Returns the query portion of the specified input value, or
+     * <code>null</code> if there is no suitable query within the input value.
+     * </p>
+     *
+     * <p>
+     * If a query delimiter is defined, the query will be the last delimited
+     * part of of the string.
+     * </p>
+     *
+     * @method _parseValue
+     * @param {String} value Input value from which to extract the query.
+     * @return {String|null} query
+     * @protected
+     */
+    _parseValue: function (value) {
+        var delim = this.get(QUERY_DELIMITER);
+
+        if (delim) {
+            value = value.split(delim);
+            value = value[value.length - 1];
+        }
+
+        return Lang.trimLeft(value);
+    },
+
+    /**
+     * Setter for locator attributes.
+     *
+     * @method _setLocator
+     * @param {Function|String|null} locator
+     * @return {Function|null}
+     * @protected
+     */
+    _setLocator: function (locator) {
+        if (this[_FUNCTION_VALIDATOR](locator)) {
+            return locator;
+        }
+
+        var that = this;
+
+        locator = locator.toString().split('.');
+
+        return function (result) {
+            return result && that._getObjectValue(result, locator);
+        };
+    },
+
+    /**
+     * Setter for the <code>requestTemplate</code> attribute.
+     *
+     * @method _setRequestTemplate
+     * @param {Function|String|null} template
+     * @return {Function|null}
+     * @protected
+     */
+    _setRequestTemplate: function (template) {
+        if (this[_FUNCTION_VALIDATOR](template)) {
+            return template;
+        }
+
+        template = template.toString();
+
+        return function (query) {
+            return Lang.sub(template, {query: encodeURIComponent(query)});
+        };
+    },
+
+    /**
+     * Setter for the <code>resultFilters</code> attribute.
+     *
+     * @method _setResultFilters
+     * @param {Array|Function|String|null} filters <code>null</code>, a filter
+     *   function, an array of filter functions, or a string or array of 
strings
+     *   representing the names of methods on
+     *   <code>Y.AutoCompleteFilters</code>.
+     * @return {Array} Array of filter functions (empty if <i>filters</i> is
+     *   <code>null</code>).
+     * @protected
+     */
+    _setResultFilters: function (filters) {
+        var acFilters, getFilterFunction;
+
+        if (filters === null) {
+            return [];
+        }
+
+        acFilters = Y.AutoCompleteFilters;
+
+        getFilterFunction = function (filter) {
+            if (isFunction(filter)) {
+                return filter;
+            }
+
+            if (isString(filter) && acFilters &&
+                    isFunction(acFilters[filter])) {
+                return acFilters[filter];
+            }
+
+            return false;
+        };
+
+        if (Lang.isArray(filters)) {
+            filters = YArray.map(filters, getFilterFunction);
+            return YArray.every(filters, function (f) { return !!f; }) ?
+                    filters : INVALID_VALUE;
+        } else {
+            filters = getFilterFunction(filters);
+            return filters ? [filters] : INVALID_VALUE;
+        }
+    },
+
+    /**
+     * Setter for the <code>resultHighlighter</code> attribute.
+     *
+     * @method _setResultHighlighter
+     * @param {Function|String|null} highlighter <code>null</code>, a
+     *   highlighter function, or a string representing the name of a method on
+     *   <code>Y.AutoCompleteHighlighters</code>.
+     * @return {Function|null}
+     * @protected
+     */
+    _setResultHighlighter: function (highlighter) {
+        var acHighlighters;
+
+        if (this._functionValidator(highlighter)) {
+            return highlighter;
+        }
+
+        acHighlighters = Y.AutoCompleteHighlighters;
+
+        if (isString(highlighter) && acHighlighters &&
+                isFunction(acHighlighters[highlighter])) {
+            return acHighlighters[highlighter];
+        }
+
+        return INVALID_VALUE;
+    },
+
+    /**
+     * Setter for the <code>source</code> attribute. Returns a DataSource or
+     * a DataSource-like object depending on the type of <i>source</i>.
+     *
+     * @method _setSource
+     * @param {Array|DataSource|Object|String} source AutoComplete source. See
+     *   the <code>source</code> attribute for details.
+     * @return {DataSource|Object}
+     * @protected
+     */
+    _setSource: function (source) {
+        var sourcesNotLoaded = 'autocomplete-sources module not loaded';
+
+        if ((source && isFunction(source.sendRequest)) || source === null) {
+            // Quacks like a DataSource instance (or null). Make it so!
+            return source;
+        }
+
+        switch (Lang.type(source)) {
+        case 'string':
+            if (this._createStringSource) {
+                return this._createStringSource(source);
+            }
+
+            Y.error(sourcesNotLoaded);
+            return INVALID_VALUE;
+
+        case 'array':
+            // Wrap the array in a teensy tiny fake DataSource that just 
returns
+            // the array itself for each request. Filters will do the rest.
+            return this._createArraySource(source);
+
+        case 'function':
+            return this._createFunctionSource(source);
+
+        case 'object':
+            // If the object is a JSONPRequest instance, use it as a JSONP
+            // source.
+            if (Y.JSONPRequest && source instanceof Y.JSONPRequest) {
+                if (this._createJSONPSource) {
+                    return this._createJSONPSource(source);
+                }
+
+                Y.error(sourcesNotLoaded);
+                return INVALID_VALUE;
+            }
+
+            // Not a JSONPRequest instance. Wrap the object in a teensy tiny
+            // fake DataSource that looks for the request as a property on the
+            // object and returns it if it exists, or an empty array otherwise.
+            return this._createObjectSource(source);
+        }
+
+        return INVALID_VALUE;
+    },
+
+    /**
+     * Shared success callback for non-DataSource sources.
+     *
+     * @method _sourceSuccess
+     * @param {mixed} data Response data.
+     * @param {Object} request Request object.
+     * @protected
+     */
+    _sourceSuccess: function (data, request) {
+        request.callback.success({
+            data: data,
+            response: {results: data}
+        });
+    },
+
+    /**
+     * Synchronizes the UI state of the <code>allowBrowserAutocomplete</code>
+     * attribute.
+     *
+     * @method _syncBrowserAutocomplete
+     * @protected
+     */
+    _syncBrowserAutocomplete: function () {
+        var inputNode = this.get(INPUT_NODE);
+
+        if (inputNode.get('nodeName').toLowerCase() === 'input') {
+            inputNode.setAttribute('autocomplete',
+                    this.get(ALLOW_BROWSER_AC) ? 'on' : 'off');
+        }
+    },
+
+    /**
+     * <p>
+     * Updates the query portion of the <code>value</code> attribute.
+     * </p>
+     *
+     * <p>
+     * If a query delimiter is defined, the last delimited portion of the input
+     * value will be replaced with the specified <i>value</i>.
+     * </p>
+     *
+     * @method _updateValue
+     * @param {String} newVal New value.
+     * @protected
+     */
+    _updateValue: function (newVal) {
+        var delim = this.get(QUERY_DELIMITER),
+            insertDelim,
+            len,
+            prevVal;
+
+        newVal = Lang.trimLeft(newVal);
+
+        if (delim) {
+            insertDelim = trim(delim); // so we don't double up on spaces
+            prevVal     = YArray.map(trim(this.get(VALUE)).split(delim), trim);
+            len         = prevVal.length;
+
+            if (len > 1) {
+                prevVal[len - 1] = newVal;
+                newVal = prevVal.join(insertDelim + ' ');
+            }
+
+            newVal = newVal + insertDelim + ' ';
+        }
+
+        this.set(VALUE, newVal);
+    },
+
+    // -- Protected Event Handlers 
---------------------------------------------
+
+    /**
+     * Handles change events for the <code>value</code> attribute.
+     *
+     * @method _afterValueChange
+     * @param {EventFacade} e
+     * @protected
+     */
+    _afterValueChange: function (e) {
+        var delay,
+            fire,
+            minQueryLength,
+            newVal = e.newVal,
+            query,
+            that;
+
+        // Don't query on value changes that didn't come from the user.
+        if (e.src !== AutoCompleteBase.UI_SRC) {
+            this._inputNode.set(VALUE, newVal);
+            return;
+        }
+
+        Y.log('valueChange: new: "' + newVal + '"; old: "' + e.prevVal + '"', 
'info', 'autocomplete-base');
+
+        minQueryLength = this.get('minQueryLength');
+        query          = this._parseValue(newVal) || '';
+
+        if (minQueryLength >= 0 && query.length >= minQueryLength) {
+            delay = this.get('queryDelay');
+            that  = this;
+
+            fire = function () {
+                that.fire(EVT_QUERY, {
+                    inputValue: newVal,
+                    query     : query
+                });
+            };
+
+            if (delay) {
+                clearTimeout(this._delay);
+                this._delay = setTimeout(fire, delay);
+            } else {
+                fire();
+            }
+        } else {
+            clearTimeout(this._delay);
+
+            this.fire(EVT_CLEAR, {
+                prevVal: e.prevVal ? this._parseValue(e.prevVal) : null
+            });
+        }
+    },
+
+    /**
+     * Handles <code>blur</code> events on the input node.
+     *
+     * @method _onInputBlur
+     * @param {EventFacade} e
+     * @protected
+     */
+    _onInputBlur: function (e) {
+        var delim = this.get(QUERY_DELIMITER),
+            delimPos,
+            newVal,
+            value;
+
+        // If a query delimiter is set and the input's value contains one or
+        // more trailing delimiters, strip them.
+        if (delim && !this.get('allowTrailingDelimiter')) {
+            delim = Lang.trimRight(delim);
+            value = newVal = this._inputNode.get(VALUE);
+
+            if (delim) {
+                while ((newVal = Lang.trimRight(newVal)) &&
+                        (delimPos = newVal.length - delim.length) &&
+                        newVal.lastIndexOf(delim) === delimPos) {
+
+                    newVal = newVal.substring(0, delimPos);
+                }
+            } else {
+                // Delimiter is one or more space characters, so just trim the
+                // value.
+                newVal = Lang.trimRight(newVal);
+            }
+
+            if (newVal !== value) {
+                this.set(VALUE, newVal);
+            }
+        }
+    },
+
+    /**
+     * Handles <code>valueChange</code> events on the input node and fires a
+     * <code>query</code> event when the input value meets the configured
+     * criteria.
+     *
+     * @method _onInputValueChange
+     * @param {EventFacade} e
+     * @protected
+     */
+    _onInputValueChange: function (e) {
+        var newVal = e.newVal;
+
+        // Don't query if the internal value is the same as the new value
+        // reported by valueChange.
+        if (newVal === this.get(VALUE)) {
+            return;
+        }
+
+        this.set(VALUE, newVal, {src: AutoCompleteBase.UI_SRC});
+    },
+
+    /**
+     * Handles source responses and fires the <code>results</code> event.
+     *
+     * @method _onResponse
+     * @param {EventFacade} e
+     * @protected
+     */
+    _onResponse: function (query, e) {
+        // Ignore stale responses that aren't for the current query.
+        if (query === this.get(QUERY)) {
+            this._parseResponse(query, e.response, e.data);
+        }
+    },
+
+    // -- Protected Default Event Handlers 
-------------------------------------
+
+    /**
+     * Default <code>clear</code> event handler. Sets the <code>results</code>
+     * property to an empty array and <code>query</code> to null.
+     *
+     * @method _defClearFn
+     * @protected
+     */
+    _defClearFn: function () {
+        this._set(QUERY, null);
+        this._set(RESULTS, []);
+    },
+
+    /**
+     * Default <code>query</code> event handler. Sets the <code>query</code>
+     * property and sends a request to the source if one is configured.
+     *
+     * @method _defQueryFn
+     * @param {EventFacade} e
+     * @protected
+     */
+    _defQueryFn: function (e) {
+        var query = e.query;
+
+        Y.log('query: "' + query + '"; inputValue: "' + e.inputValue + '"', 
'info', 'autocomplete-base');
+        this.sendRequest(query); // sendRequest will set the 'query' attribute
+    },
+
+    /**
+     * Default <code>results</code> event handler. Sets the 
<code>results</code>
+     * property to the latest results.
+     *
+     * @method _defResultsFn
+     * @param {EventFacade} e
+     * @protected
+     */
+    _defResultsFn: function (e) {
+        Y.log('results: ' + Y.dump(e.results), 'info', 'autocomplete-base');
+        this._set(RESULTS, e[RESULTS]);
+    }
+};
+
+Y.AutoCompleteBase = AutoCompleteBase;
+
+
+}, '3.3.0' ,{optional:['autocomplete-sources'], requires:['array-extras', 
'base-build', 'escape', 'event-valuechange', 'node-base']});

Added: trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base-min.js
===================================================================
--- trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base-min.js                
                (rev 0)
+++ trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base-min.js        
2011-01-19 13:33:11 UTC (rev 6811)
@@ -0,0 +1,9 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+YUI.add("autocomplete-base",function(f){var 
g=f.Escape,j=f.Lang,q=f.Array,i=f.Object,d=j.isFunction,r=j.isString,u=j.trim,l=f.Attribute.INVALID_VALUE,o="_functionValidator",x="_sourceSuccess",c="allowBrowserAutocomplete",h="inputNode",w="query",e="queryDelimiter",b="requestTemplate",m="results",n="resultListLocator",k="value",s="valueChange",a="clear",t=w,p=m;function
 
v(){f.before(this._bindUIACBase,this,"bindUI");f.before(this._destructorACBase,this,"destructor");f.before(this._syncUIACBase,this,"syncUI");this.publish(a,{defaultFn:this._defClearFn});this.publish(t,{defaultFn:this._defQueryFn});this.publish(p,{defaultFn:this._defResultsFn});}v.ATTRS={allowBrowserAutocomplete:{value:false},allowTrailingDelimiter:{value:false},inputNode:{setter:f.one,writeOnce:"initOnly"},maxResults:{value:0},minQueryLength:{value:1},query:{readOnly:true,value:null},queryDelay:{value:100},queryDelimiter:{value:null},requestTemplate:{setter:"_setRequestTemplate",value:null},resultFilters:{setter:"_setResultFilters",value:[]},resultFormatter:{validator:o},resultHighlighter:{setter:"_setResultHighlighter"},resultListLocator:{setter:"_setLocator"},results:{readOnly:true,value:[]},resultTextLocator:{setter:"_setLocator"},source:{setter:"_setSource"},tokenInput:{readOnly:true},value:{value:""}};v.CSS_PREFIX="ac";v.UI_SRC=(f.Widget&&f.Widget.UI_SRC)||"ui";v.prototype={sendRequest:function(A,B){var
 
y,z=this.get("source");if(A||A===""){this._set(w,A);}else{A=this.get(w);}if(z){if(!B){B=this.get(b);}y=B?B(A):A;z.sendRequest({request:y,callback:{success:f.bind(this._onResponse,this,A)}});}return
 this;},_bindUIACBase:function(){var 
z=this.get(h),y=z&&z.tokenInput;if(y){z=y.get(h);this._set("tokenInput",y);}if(!z){f.error("No
 inputNode 
specified.");return;}this._inputNode=z;this._acBaseEvents=[z.on(s,this._onInputValueChange,this),z.on("blur",this._onInputBlur,this),this.after(c+"Change",this._syncBrowserAutocomplete),this.after(s,this._afterValueChange)];},_destructorACBase:function(){var
 
y=this._acBaseEvents;while(y&&y.length){y.pop().detach();}},_syncUIACBase:function(){this._syncBrowserAutocomplete();this.set(k,this.get(h).get(k));},_createArraySource:function(z){var
 
y=this;return{sendRequest:function(A){y[x](z.concat(),A);}};},_createFunctionSource:function(z){var
 
y=this;return{sendRequest:function(A){y[x](z(A.request)||[],A);}};},_createObjectSource:function(z){var
 y=this;return{sendRequest:function(A){var 
B=A.request;y[x](i.owns(z,B)?z[B]:[],A);}};},_functionValidator:function(y){return
 y===null||d(y);},_getObjectValue:function(B,A){if(!B){return;}for(var 
z=0,y=A.length;B&&z<y;z++){B=B[A[z]];}return 
B;},_parseResponse:function(A,y,P){var 
G={data:P,query:A,results:[]},I=this.get(n),H=[],F=y&&y.results,C,z,J,B,O,K,L,M,D,E,N;if(F&&I){F=I(F);}if(F&&F.length){C=this.get("resultFilters");N=this.get("resultTextLocator");for(K=0,L=F.length;K<L;++K){D=F[K];E=N?N(D):D.toString();H.push({display:g.html(E),raw:D,text:E});}for(K=0,L=C.length;K<L;++K){H=C[K](A,H.concat());if(!H){return;}if(!H.length){break;}}if(H.length){J=this.get("resultFormatter");O=this.get("resultHighlighter");M=this.get("maxResults");if(M&&M>0&&H.length>M){H.length=M;}if(O){B=O(A,H.concat());if(!B){return;}for(K=0,L=B.length;K<L;++K){D=H[K];D.highlighted=B[K];D.display=D.highlighted;}}if(J){z=J(A,H.concat());if(!z){return;}for(K=0,L=z.length;K<L;++K){H[K].display=z[K];}}}}G.results=H;this.fire(p,G);},_parseValue:function(y){var
 z=this.get(e);if(z){y=y.split(z);y=y[y.length-1];}return 
j.trimLeft(y);},_setLocator:function(y){if(this[o](y)){return y;}var 
z=this;y=y.toString().split(".");return function(A){return 
A&&z._getObjectValue(A,y);};},_setRequestTemplate:function(y){if(this[o](y)){return
 y;}y=y.toString();return function(z){return 
j.sub(y,{query:encodeURIComponent(z)});};},_setResultFilters:function(A){var 
y,z;if(A===null){return[];}y=f.AutoCompleteFilters;z=function(B){if(d(B)){return
 B;}if(r(B)&&y&&d(y[B])){return y[B];}return 
false;};if(j.isArray(A)){A=q.map(A,z);return q.every(A,function(B){return 
!!B;})?A:l;}else{A=z(A);return A?[A]:l;}},_setResultHighlighter:function(y){var 
z;if(this._functionValidator(y)){return 
y;}z=f.AutoCompleteHighlighters;if(r(y)&&z&&d(z[y])){return z[y];}return 
l;},_setSource:function(z){var y="autocomplete-sources module not 
loaded";if((z&&d(z.sendRequest))||z===null){return 
z;}switch(j.type(z)){case"string":if(this._createStringSource){return 
this._createStringSource(z);}f.error(y);return l;case"array":return 
this._createArraySource(z);case"function":return 
this._createFunctionSource(z);case"object":if(f.JSONPRequest&&z instanceof 
f.JSONPRequest){if(this._createJSONPSource){return 
this._createJSONPSource(z);}f.error(y);return l;}return 
this._createObjectSource(z);}return 
l;},_sourceSuccess:function(z,y){y.callback.success({data:z,response:{results:z}});},_syncBrowserAutocomplete:function(){var
 
y=this.get(h);if(y.get("nodeName").toLowerCase()==="input"){y.setAttribute("autocomplete",this.get(c)?"on":"off");}},_updateValue:function(z){var
 
B=this.get(e),A,y,C;z=j.trimLeft(z);if(B){A=u(B);C=q.map(u(this.get(k)).split(B),u);y=C.length;if(y>1){C[y-1]=z;z=C.join(A+"
 ");}z=z+A+" ";}this.set(k,z);},_afterValueChange:function(E){var 
A,B,y,z=E.newVal,D,C;if(E.src!==v.UI_SRC){this._inputNode.set(k,z);return;}y=this.get("minQueryLength");D=this._parseValue(z)||"";if(y>=0&&D.length>=y){A=this.get("queryDelay");C=this;B=function(){C.fire(t,{inputValue:z,query:D});};if(A){clearTimeout(this._delay);this._delay=setTimeout(B,A);}else{B();}}else{clearTimeout(this._delay);this.fire(a,{prevVal:E.prevVal?this._parseValue(E.prevVal):null});}},_onInputBlur:function(B){var
 
C=this.get(e),y,z,A;if(C&&!this.get("allowTrailingDelimiter")){C=j.trimRight(C);A=z=this._inputNode.get(k);if(C){while((z=j.trimRight(z))&&(y=z.length-C.length)&&z.lastIndexOf(C)===y){z=z.substring(0,y);}}else{z=j.trimRight(z);}if(z!==A){this.set(k,z);}}},_onInputValueChange:function(z){var
 
y=z.newVal;if(y===this.get(k)){return;}this.set(k,y,{src:v.UI_SRC});},_onResponse:function(y,z){if(y===this.get(w)){this._parseResponse(y,z.response,z.data);
+}},_defClearFn:function(){this._set(w,null);this._set(m,[]);},_defQueryFn:function(z){var
 
y=z.query;this.sendRequest(y);},_defResultsFn:function(y){this._set(m,y[m]);}};f.AutoCompleteBase=v;},"3.3.0",{optional:["autocomplete-sources"],requires:["array-extras","base-build","escape","event-valuechange","node-base"]});
\ No newline at end of file

Added: trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base.js
===================================================================
--- trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base.js                    
        (rev 0)
+++ trunk/phpgwapi/js/yui3/autocomplete/autocomplete-base.js    2011-01-19 
13:33:11 UTC (rev 6811)
@@ -0,0 +1,1525 @@
+/*
+Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 3.3.0
+build: 3167
+*/
+YUI.add('autocomplete-base', function(Y) {
+
+/**
+ * Provides automatic input completion or suggestions for text input fields and
+ * textareas.
+ *
+ * @module autocomplete
+ * @since 3.3.0
+ */
+
+/**
+ * <code>Y.Base</code> extension that provides core autocomplete logic (but no
+ * UI implementation) for a text input field or textarea. Must be mixed into a
+ * <code>Y.Base</code>-derived class to be useful.
+ *
+ * @module autocomplete
+ * @submodule autocomplete-base
+ */
+
+/**
+ * <p>
+ * Extension that provides core autocomplete logic (but no UI implementation)
+ * for a text input field or textarea.
+ * </p>
+ *
+ * <p>
+ * The <code>AutoCompleteBase</code> class provides events and attributes that
+ * abstract away core autocomplete logic and configuration, but does not 
provide
+ * a widget implementation or suggestion UI. For a prepackaged autocomplete
+ * widget, see <code>AutoCompleteList</code>.
+ * </p>
+ *
+ * <p>
+ * This extension cannot be instantiated directly, since it doesn't provide an
+ * actual implementation. It's intended to be mixed into a
+ * <code>Y.Base</code>-based class or widget.
+ * </p>
+ *
+ * <p>
+ * <code>Y.Widget</code>-based example:
+ * </p>
+ *
+ * <pre>
+ * YUI().use('autocomplete-base', 'widget', function (Y) {
+ * &nbsp;&nbsp;var MyAC = Y.Base.create('myAC', Y.Widget, 
[Y.AutoCompleteBase], {
+ * &nbsp;&nbsp;&nbsp;&nbsp;// Custom prototype methods and properties.
+ * &nbsp;&nbsp;}, {
+ * &nbsp;&nbsp;&nbsp;&nbsp;// Custom static methods and properties.
+ * &nbsp;&nbsp;});
+ * &nbsp;
+ * &nbsp;&nbsp;// Custom implementation code.
+ * });
+ * </pre>
+ *
+ * <p>
+ * <code>Y.Base</code>-based example:
+ * </p>
+ *
+ * <pre>
+ * YUI().use('autocomplete-base', function (Y) {
+ * &nbsp;&nbsp;var MyAC = Y.Base.create('myAC', Y.Base, [Y.AutoCompleteBase], {
+ * &nbsp;&nbsp;&nbsp;&nbsp;initializer: function () {
+ * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._bindUIACBase();
+ * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._syncUIACBase();
+ * &nbsp;&nbsp;&nbsp;&nbsp;},
+ * &nbsp;
+ * &nbsp;&nbsp;&nbsp;&nbsp;// Custom prototype methods and properties.
+ * &nbsp;&nbsp;}, {
+ * &nbsp;&nbsp;&nbsp;&nbsp;// Custom static methods and properties.
+ * &nbsp;&nbsp;});
+ * &nbsp;
+ * &nbsp;&nbsp;// Custom implementation code.
+ * });
+ * </pre>
+ *
+ * @class AutoCompleteBase
+ */
+
+var Escape  = Y.Escape,
+    Lang    = Y.Lang,
+    YArray  = Y.Array,
+    YObject = Y.Object,
+
+    isFunction = Lang.isFunction,
+    isString   = Lang.isString,
+    trim       = Lang.trim,
+
+    INVALID_VALUE = Y.Attribute.INVALID_VALUE,
+
+    _FUNCTION_VALIDATOR = '_functionValidator',
+    _SOURCE_SUCCESS     = '_sourceSuccess',
+
+    ALLOW_BROWSER_AC    = 'allowBrowserAutocomplete',
+    INPUT_NODE          = 'inputNode',
+    QUERY               = 'query',
+    QUERY_DELIMITER     = 'queryDelimiter',
+    REQUEST_TEMPLATE    = 'requestTemplate',
+    RESULTS             = 'results',
+    RESULT_LIST_LOCATOR = 'resultListLocator',
+    VALUE               = 'value',
+    VALUE_CHANGE        = 'valueChange',
+
+    EVT_CLEAR   = 'clear',
+    EVT_QUERY   = QUERY,
+    EVT_RESULTS = RESULTS;
+
+function AutoCompleteBase() {
+    // AOP bindings.
+    Y.before(this._bindUIACBase, this, 'bindUI');
+    Y.before(this._destructorACBase, this, 'destructor');
+    Y.before(this._syncUIACBase, this, 'syncUI');
+
+    // -- Public Events 
--------------------------------------------------------
+
+    /**
+     * Fires after the query has been completely cleared or no longer meets the
+     * minimum query length requirement.
+     *
+     * @event clear
+     * @param {EventFacade} e Event facade with the following additional
+     *   properties:
+     *
+     * <dl>
+     *   <dt>prevVal (String)</dt>
+     *   <dd>
+     *     Value of the query before it was cleared.
+     *   </dd>
+     * </dl>
+     *
+     * @preventable _defClearFn
+     */
+    this.publish(EVT_CLEAR, {
+        defaultFn: this._defClearFn
+    });
+
+    /**
+     * Fires when the contents of the input field have changed and the input
+     * value meets the criteria necessary to generate an autocomplete query.
+     *
+     * @event query
+     * @param {EventFacade} e Event facade with the following additional
+     *   properties:
+     *
+     * <dl>
+     *   <dt>inputValue (String)</dt>
+     *   <dd>
+     *     Full contents of the text input field or textarea that generated
+     *     the query.
+     *   </dd>
+     *
+     *   <dt>query (String)</dt>
+     *   <dd>
+     *     Autocomplete query. This is the string that will be used to
+     *     request completion results. It may or may not be the same as
+     *     <code>inputValue</code>.
+     *   </dd>
+     * </dl>
+     *
+     * @preventable _defQueryFn
+     */
+    this.publish(EVT_QUERY, {
+        defaultFn: this._defQueryFn
+    });
+
+    /**
+     * Fires after query results are received from the <code>source</code>. If
+     * no source has been set, this event will not fire.
+     *
+     * @event results
+     * @param {EventFacade} e Event facade with the following additional
+     *   properties:
+     *
+     * <dl>
+     *   <dt>data (Array|Object)</dt>
+     *   <dd>
+     *     Raw, unfiltered result data (if available).
+     *   </dd>
+     *
+     *   <dt>query (String)</dt>
+     *   <dd>
+     *     Query that generated these results.
+     *   </dd>
+     *
+     *   <dt>results (Array)</dt>
+     *   <dd>
+     *     Array of filtered, formatted, and highlighted results. Each item in
+     *     the array is an object with the following properties:
+     *
+     *     <dl>
+     *       <dt>display (Node|HTMLElement|String)</dt>
+     *       <dd>
+     *         Formatted result HTML suitable for display to the user. If no
+     *         custom formatter is set, this will be an HTML-escaped version of
+     *         the string in the <code>text</code> property.
+     *       </dd>
+     *
+     *       <dt>highlighted (String)</dt>
+     *       <dd>
+     *         Highlighted (but not formatted) result text. This property will
+     *         only be set if a highlighter is in use.
+     *       </dd>
+     *
+     *       <dt>raw (mixed)</dt>
+     *       <dd>
+     *         Raw, unformatted result in whatever form it was provided by the
+     *         <code>source</code>.
+     *       </dd>
+     *
+     *       <dt>text (String)</dt>
+     *       <dd>
+     *         Plain text version of the result, suitable for being inserted
+     *         into the value of a text input field or textarea when the result
+     *         is selected by a user. This value is not HTML-escaped and should
+     *         not be inserted into the page using innerHTML.
+     *       </dd>
+     *     </dl>
+     *   </dd>
+     * </dl>
+     *
+     * @preventable _defResultsFn
+     */
+    this.publish(EVT_RESULTS, {
+        defaultFn: this._defResultsFn
+    });
+}
+
+// -- Public Static Properties 
-------------------------------------------------
+AutoCompleteBase.ATTRS = {
+    /**
+     * Whether or not to enable the browser's built-in autocomplete
+     * functionality for input fields.
+     *
+     * @attribute allowBrowserAutocomplete
+     * @type Boolean
+     * @default false
+     */
+    allowBrowserAutocomplete: {
+        value: false
+    },
+
+    /**
+     * When a <code>queryDelimiter</code> is set, trailing delimiters will
+     * automatically be stripped from the input value by default when the
+     * input node loses focus. Set this to <code>true</code> to allow trailing
+     * delimiters.
+     *
+     * @attribute allowTrailingDelimiter
+     * @type Boolean
+     * @default false
+     */
+    allowTrailingDelimiter: {
+        value: false
+    },
+
+    /**
+     * Node to monitor for changes, which will generate <code>query</code>
+     * events when appropriate. May be either an input field or a textarea.
+     *
+     * @attribute inputNode
+     * @type Node|HTMLElement|String
+     * @writeonce
+     */
+    inputNode: {
+        setter: Y.one,
+        writeOnce: 'initOnly'
+    },
+
+    /**
+     * Maximum number of results to return. A value of <code>0</code> or less
+     * will allow an unlimited number of results.
+     *
+     * @attribute maxResults
+     * @type Number
+     * @default 0
+     */
+    maxResults: {
+        value: 0
+    },
+
+    /**
+     * Minimum number of characters that must be entered before a
+     * <code>query</code> event will be fired. A value of <code>0</code>
+     * allows empty queries; a negative value will effectively disable all
+     * <code>query</code> events.
+     *
+     * @attribute minQueryLength
+     * @type Number
+     * @default 1
+     */
+    minQueryLength: {
+        value: 1
+    },
+
+    /**
+     * <p>
+     * Current query, or <code>null</code> if there is no current query.
+     * </p>
+     *
+     * <p>
+     * The query might not be the same as the current value of the input
+     * node, both for timing reasons (due to <code>queryDelay</code>) and
+     * because when one or more <code>queryDelimiter</code> separators are
+     * in use, only the last portion of the delimited input string will be
+     * used as the query value.
+     * </p>
+     *
+     * @attribute query
+     * @type String|null
+     * @default null
+     * @readonly
+     */
+    query: {
+        readOnly: true,
+        value: null
+    },
+
+    /**
+     * <p>
+     * Number of milliseconds to delay after input before triggering a
+     * <code>query</code> event. If new input occurs before this delay is
+     * over, the previous input event will be ignored and a new delay will
+     * begin.
+     * </p>
+     *
+     * <p>
+     * This can be useful both to throttle queries to a remote data source
+     * and to avoid distracting the user by showing them less relevant
+     * results before they've paused their typing.
+     * </p>
+     *
+     * @attribute queryDelay
+     * @type Number
+     * @default 100
+     */
+    queryDelay: {
+        value: 100
+    },
+
+    /**
+     * Query delimiter string. When a delimiter is configured, the input value
+     * will be split on the delimiter, and only the last portion will be used 
in
+     * autocomplete queries and updated when the <code>query</code> attribute 
is
+     * modified.
+     *
+     * @attribute queryDelimiter
+     * @type String|null
+     * @default null
+     */
+    queryDelimiter: {
+        value: null
+    },
+
+    /**
+     * <p>
+     * Source request template. This can be a function that accepts a query as 
a
+     * parameter and returns a request string, or it can be a string containing
+     * the placeholder "{query}", which will be replaced with the actual
+     * URI-encoded query. In either case, the resulting string will be appended
+     * to the request URL when the <code>source</code> attribute is set to a
+     * remote DataSource, JSONP URL, or XHR URL (it will not be appended to YQL
+     * URLs).
+     * </p>
+     *
+     * <p>
+     * While <code>requestTemplate</code> may be set to either a function or
+     * a string, it will always be returned as a function that accepts a
+     * query argument and returns a string.
+     * </p>
+     *
+     * @attribute requestTemplate
+     * @type Function|String|null
+     * @default null
+     */
+    requestTemplate: {
+        setter: '_setRequestTemplate',
+        value: null
+    },
+
+    /**
+     * <p>
+     * Array of local result filter functions. If provided, each filter
+     * will be called with two arguments when results are received: the query
+     * and an array of result objects. See the documentation for the
+     * <code>results</code> event for a list of the properties available on 
each
+     * result object.
+     * </p>
+     *
+     * <p>
+     * Each filter is expected to return a filtered or modified version of the
+     * results array, which will then be passed on to subsequent filters, then
+     * the <code>resultHighlighter</code> function (if set), then the
+     * <code>resultFormatter</code> function (if set), and finally to
+     * subscribers to the <code>results</code> event.
+     * </p>
+     *
+     * <p>
+     * If no <code>source</code> is set, result filters will not be called.
+     * </p>
+     *
+     * <p>
+     * Prepackaged result filters provided by the autocomplete-filters and
+     * autocomplete-filters-accentfold modules can be used by specifying the
+     * filter name as a string, such as <code>'phraseMatch'</code> (assuming
+     * the necessary filters module is loaded).
+     * </p>
+     *
+     * @attribute resultFilters
+     * @type Array
+     * @default []
+     */
+    resultFilters: {
+        setter: '_setResultFilters',
+        value: []
+    },
+
+    /**
+     * <p>
+     * Function which will be used to format results. If provided, this 
function
+     * will be called with two arguments after results have been received and
+     * filtered: the query and an array of result objects. The formatter is
+     * expected to return an array of HTML strings or Node instances containing
+     * the desired HTML for each result.
+     * </p>
+     *
+     * <p>
+     * See the documentation for the <code>results</code> event for a list of
+     * the properties available on each result object.
+     * </p>
+     *
+     * <p>
+     * If no <code>source</code> is set, the formatter will not be called.
+     * </p>
+     *
+     * @attribute resultFormatter
+     * @type Function|null
+     */
+    resultFormatter: {
+        validator: _FUNCTION_VALIDATOR
+    },
+
+    /**
+     * <p>
+     * Function which will be used to highlight results. If provided, this
+     * function will be called with two arguments after results have been
+     * received and filtered: the query and an array of filtered result 
objects.
+     * The highlighter is expected to return an array of highlighted result
+     * text in the form of HTML strings.
+     * </p>
+     *
+     * <p>
+     * See the documentation for the <code>results</code> event for a list of
+     * the properties available on each result object.
+     * </p>
+     *
+     * <p>
+     * If no <code>source</code> is set, the highlighter will not be called.
+     * </p>
+     *
+     * @attribute resultHighlighter
+     * @type Function|null
+     */
+    resultHighlighter: {
+        setter: '_setResultHighlighter'
+    },
+
+    /**
+     * <p>
+     * Locator that should be used to extract an array of results from a
+     * non-array response.
+     * </p>
+     *
+     * <p>
+     * By default, no locator is applied, and all responses are assumed to be
+     * arrays by default. If all responses are already arrays, you don't need 
to
+     * define a locator.
+     * </p>
+     *
+     * <p>
+     * The locator may be either a function (which will receive the raw 
response
+     * as an argument and must return an array) or a string representing an
+     * object path, such as "foo.bar.baz" (which would return the value of
+     * <code>result.foo.bar.baz</code> if the response is an object).
+     * </p>
+     *
+     * <p>
+     * While <code>resultListLocator</code> may be set to either a function or 
a
+     * string, it will always be returned as a function that accepts a response
+     * argument and returns an array.
+     * </p>
+     *
+     * @attribute resultListLocator
+     * @type Function|String|null
+     */
+    resultListLocator: {
+        setter: '_setLocator'
+    },
+
+    /**
+     * Current results, or an empty array if there are no results.
+     *
+     * @attribute results
+     * @type Array
+     * @default []
+     * @readonly
+     */
+    results: {
+        readOnly: true,
+        value: []
+    },
+
+    /**
+     * <p>
+     * Locator that should be used to extract a plain text string from a
+     * non-string result item. The resulting text value will typically be the
+     * value that ends up being inserted into an input field or textarea when
+     * the user of an autocomplete implementation selects a result.
+     * </p>
+     *
+     * <p>
+     * By default, no locator is applied, and all results are assumed to be
+     * plain text strings. If all results are already plain text strings, you
+     * don't need to define a locator.
+     * </p>
+     *
+     * <p>
+     * The locator may be either a function (which will receive the raw result
+     * as an argument and must return a string) or a string representing an
+     * object path, such as "foo.bar.baz" (which would return the value of
+     * <code>result.foo.bar.baz</code> if the result is an object).
+     * </p>
+     *
+     * <p>
+     * While <code>resultTextLocator</code> may be set to either a function or 
a
+     * string, it will always be returned as a function that accepts a result
+     * argument and returns a string.
+     * </p>
+     *
+     * @attribute resultTextLocator
+     * @type Function|String|null
+     */
+    resultTextLocator: {
+        setter: '_setLocator'
+    },
+
+    /**
+     * <p>
+     * Source for autocomplete results. The following source types are
+     * supported:
+     * </p>
+     *
+     * <dl>
+     *   <dt>Array</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> <code>['first result', 'second result', 
'etc']</code>
+     *     </p>
+     *
+     *     <p>
+     *     The full array will be provided to any configured filters for each
+     *     query. This is an easy way to create a fully client-side 
autocomplete
+     *     implementation.
+     *     </p>
+     *   </dd>
+     *
+     *   <dt>DataSource</dt>
+     *   <dd>
+     *     <p>
+     *     A <code>DataSource</code> instance or other object that provides a
+     *     DataSource-like <code>sendRequest</code> method. See the
+     *     <code>DataSource</code> documentation for details.
+     *     </p>
+     *   </dd>
+     *
+     *   <dt>Function</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> <code>function (query) { return ['foo', 'bar']; 
}</code>
+     *     </p>
+     *
+     *     <p>
+     *     A function source will be called with the current query as a
+     *     parameter, and should return an array of results.
+     *     </p>
+     *   </dd>
+     *
+     *   <dt>Object</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> <code>{foo: ['foo result 1', 'foo result 2'], bar: 
['bar result']}</code>
+     *     </p>
+     *
+     *     <p>
+     *     An object will be treated as a query hashmap. If a property on the
+     *     object matches the current query, the value of that property will be
+     *     used as the response.
+     *     </p>
+     *
+     *     <p>
+     *     The response is assumed to be an array of results by default. If the
+     *     response is not an array, provide a <code>resultListLocator</code> 
to
+     *     process the response and return an array.
+     *     </p>
+     *   </dd>
+     * </dl>
+     *
+     * <p>
+     * If the optional <code>autocomplete-sources</code> module is loaded, then
+     * the following additional source types will be supported as well:
+     * </p>
+     *
+     * <dl>
+     *   <dt>String (JSONP URL)</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> 
<code>'http://example.com/search?q={query}&callback={callback}'</code>
+     *     </p>
+     *
+     *     <p>
+     *     If a URL with a <code>{callback}</code> placeholder is provided, it
+     *     will be used to make a JSONP request. The <code>{query}</code>
+     *     placeholder will be replaced with the current query, and the
+     *     <code>{callback}</code> placeholder will be replaced with an
+     *     internally-generated JSONP callback name. Both placeholders must
+     *     appear in the URL, or the request will fail. An optional
+     *     <code>{maxResults}</code> placeholder may also be provided, and will
+     *     be replaced with the value of the maxResults attribute (or 1000 if
+     *     the maxResults attribute is 0 or less).
+     *     </p>
+     *
+     *     <p>
+     *     The response is assumed to be an array of results by default. If the
+     *     response is not an array, provide a <code>resultListLocator</code> 
to
+     *     process the response and return an array.
+     *     </p>
+     *
+     *     <p>
+     *     <strong>The <code>jsonp</code> module must be loaded in order for
+     *     JSONP URL sources to work.</strong> If the <code>jsonp</code> module
+     *     is not already loaded, it will be loaded on demand if possible.
+     *     </p>
+     *   </dd>
+     *
+     *   <dt>String (XHR URL)</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> <code>'http://example.com/search?q={query}'</code>
+     *     </p>
+     *
+     *     <p>
+     *     If a URL without a <code>{callback}</code> placeholder is provided,
+     *     it will be used to make a same-origin XHR request. The
+     *     <code>{query}</code> placeholder will be replaced with the current
+     *     query. An optional <code>{maxResults}</code> placeholder may also be
+     *     provided, and will be replaced with the value of the maxResults
+     *     attribute (or 1000 if the maxResults attribute is 0 or less).
+     *     </p>
+     *
+     *     <p>
+     *     The response is assumed to be a JSON array of results by default. If
+     *     the response is a JSON object and not an array, provide a
+     *     <code>resultListLocator</code> to process the response and return an
+     *     array. If the response is in some form other than JSON, you will
+     *     need to use a custom DataSource instance as the source.
+     *     </p>
+     *
+     *     <p>
+     *     <strong>The <code>io-base</code> and <code>json-parse</code> modules
+     *     must be loaded in order for XHR URL sources to work.</strong> If
+     *     these modules are not already loaded, they will be loaded on demand
+     *     if possible.
+     *     </p>
+     *   </dd>
+     *
+     *   <dt>String (YQL query)</dt>
+     *   <dd>
+     *     <p>
+     *     <i>Example:</i> <code>'select * from search.suggest where 
query="{query}"'</code>
+     *     </p>
+     *
+     *     <p>
+     *     If a YQL query is provided, it will be used to make a YQL request.
+     *     The <code>{query}</code> placeholder will be replaced with the
+     *     current autocomplete query. This placeholder must appear in the YQL
+     *     query, or the request will fail. An optional
+     *     <code>{maxResults}</code> placeholder may also be provided, and will
+     *     be replaced with the value of the maxResults attribute (or 1000 if
+     *     the maxResults attribute is 0 or less).
+     *     </p>
+     *
+     *     <p>
+     *     <strong>The <code>yql</code> module must be loaded in order for YQL
+     *     sources to work.</strong> If the <code>yql</code> module is not
+     *     already loaded, it will be loaded on demand if possible.
+     *     </p>
+     *   </dd>
+     * </dl>
+     *
+     * <p>
+     * As an alternative to providing a source, you could simply listen for
+     * <code>query</code> events and handle them any way you see fit. Providing
+     * a source is optional, but will usually be simpler.
+     * </p>
+     *
+     * @attribute source
+     * @type Array|DataSource|Function|Object|String|null
+     */
+    source: {
+        setter: '_setSource'
+    },
+
+    /**
+     * If the <code>inputNode</code> specified at instantiation time has a
+     * <code>node-tokeninput</code> plugin attached to it, this attribute will
+     * be a reference to the <code>Y.Plugin.TokenInput</code> instance.
+     *
+     * @attribute tokenInput
+     * @type Plugin.TokenInput
+     * @readonly
+     */
+    tokenInput: {
+        readOnly: true
+    },
+
+    /**
+     * Current value of the input node.
+     *
+     * @attribute value
+     * @type String
+     * @default ''
+     */
+    value: {
+        // Why duplicate this._inputNode.get('value')? Because we need a
+        // reliable way to track the source of value changes. We want to 
perform
+        // completion when the user changes the value, but not when we change
+        // the value.
+        value: ''
+    }
+};
+
+AutoCompleteBase.CSS_PREFIX = 'ac';
+AutoCompleteBase.UI_SRC = (Y.Widget && Y.Widget.UI_SRC) || 'ui';
+
+AutoCompleteBase.prototype = {
+    // -- Public Prototype Methods 
---------------------------------------------
+
+    /**
+     * <p>
+     * Sends a request to the configured source. If no source is configured,
+     * this method won't do anything.
+     * </p>
+     *
+     * <p>
+     * Usually there's no reason to call this method manually; it will be
+     * called automatically when user input causes a <code>query</code> event 
to
+     * be fired. The only time you'll need to call this method manually is if
+     * you want to force a request to be sent when no user input has occurred.
+     * </p>
+     *
+     * @method sendRequest
+     * @param {String} query (optional) Query to send. If specified, the
+     *   <code>query</code> attribute will be set to this query. If not
+     *   specified, the current value of the <code>query</code> attribute will
+     *   be used.
+     * @param {Function} requestTemplate (optional) Request template function.
+     *   If not specified, the current value of the 
<code>requestTemplate</code>
+     *   attribute will be used.
+     * @chainable
+     */
+    sendRequest: function (query, requestTemplate) {
+        var request,
+            source = this.get('source');
+
+        if (query || query === '') {
+            this._set(QUERY, query);
+        } else {
+            query = this.get(QUERY);
+        }
+
+        if (source) {
+            if (!requestTemplate) {
+                requestTemplate = this.get(REQUEST_TEMPLATE);
+            }
+
+            request = requestTemplate ? requestTemplate(query) : query;
+
+
+            source.sendRequest({
+                request: request,
+                callback: {
+                    success: Y.bind(this._onResponse, this, query)
+                }
+            });
+        }
+
+        return this;
+    },
+
+    // -- Protected Lifecycle Methods 
------------------------------------------
+
+    /**
+     * Attaches event listeners and behaviors.
+     *
+     * @method _bindUIACBase
+     * @protected
+     */
+    _bindUIACBase: function () {
+        var inputNode  = this.get(INPUT_NODE),
+            tokenInput = inputNode && inputNode.tokenInput;
+
+        // If the inputNode has a node-tokeninput plugin attached, bind to the
+        // plugin's inputNode instead.
+        if (tokenInput) {
+            inputNode = tokenInput.get(INPUT_NODE);
+            this._set('tokenInput', tokenInput);
+        }
+
+        if (!inputNode) {
+            Y.error('No inputNode specified.');
+            return;
+        }
+
+        this._inputNode = inputNode;
+
+        this._acBaseEvents = [
+            // This is the valueChange event on the inputNode, provided by the
+            // event-valuechange module, not our own valueChange.
+            inputNode.on(VALUE_CHANGE, this._onInputValueChange, this),
+
+            inputNode.on('blur', this._onInputBlur, this),
+
+            this.after(ALLOW_BROWSER_AC + 'Change', 
this._syncBrowserAutocomplete),
+            this.after(VALUE_CHANGE, this._afterValueChange)
+        ];
+    },
+
+    /**
+     * Detaches AutoCompleteBase event listeners.
+     *
+     * @method _destructorACBase
+     * @protected
+     */
+    _destructorACBase: function () {
+        var events = this._acBaseEvents;
+
+        while (events && events.length) {
+            events.pop().detach();
+        }
+    },
+
+    /**
+     * Synchronizes the UI state of the <code>inputNode</code>.
+     *
+     * @method _syncUIACBase
+     * @protected
+     */
+    _syncUIACBase: function () {
+        this._syncBrowserAutocomplete();
+        this.set(VALUE, this.get(INPUT_NODE).get(VALUE));
+    },
+
+    // -- Protected Prototype Methods 
------------------------------------------
+
+    /**
+     * Creates a DataSource-like object that simply returns the specified array
+     * as a response. See the <code>source</code> attribute for more details.
+     *
+     * @method _createArraySource
+     * @param {Array} source
+     * @return {Object} DataSource-like object.
+     * @protected
+     */
+    _createArraySource: function (source) {
+        var that = this;
+
+        return {sendRequest: function (request) {
+            that[_SOURCE_SUCCESS](source.concat(), request);
+        }};
+    },
+
+    /**
+     * Creates a DataSource-like object that passes the query to a
+     * custom-defined function, which is expected to return an array as a
+     * response. See the <code>source</code> attribute for more details.
+     *
+     * @method _createFunctionSource
+     * @param {Function} source Function that accepts a query parameter and
+     *   returns an array of results.
+     * @return {Object} DataSource-like object.
+     * @protected
+     */
+    _createFunctionSource: function (source) {
+        var that = this;
+
+        return {sendRequest: function (request) {
+            that[_SOURCE_SUCCESS](source(request.request) || [], request);
+        }};
+    },
+
+    /**
+     * Creates a DataSource-like object that looks up queries as properties on
+     * the specified object, and returns the found value (if any) as a 
response.
+     * See the <code>source</code> attribute for more details.
+     *
+     * @method _createObjectSource
+     * @param {Object} source
+     * @return {Object} DataSource-like object.
+     * @protected
+     */
+    _createObjectSource: function (source) {
+        var that = this;
+
+        return {sendRequest: function (request) {
+            var query = request.request;
+
+            that[_SOURCE_SUCCESS](
+                YObject.owns(source, query) ? source[query] : [],
+                request
+            );
+        }};
+    },
+
+    /**
+     * Returns <code>true</code> if <i>value</i> is either a function or
+     * <code>null</code>.
+     *
+     * @method _functionValidator
+     * @param {Function|null} value Value to validate.
+     * @protected
+     */
+    _functionValidator: function (value) {
+        return value === null || isFunction(value);
+    },
+
+    /**
+     * Faster and safer alternative to Y.Object.getValue(). Doesn't bother
+     * casting the path to an array (since we already know it's an array) and
+     * doesn't throw an error if a value in the middle of the object hierarchy
+     * is neither <code>undefined</code> nor an object.
+     *
+     * @method _getObjectValue
+     * @param {Object} obj
+     * @param {Array} path
+     * @return {mixed} Located value, or <code>undefined</code> if the value 
was
+     *   not found at the specified path.
+     * @protected
+     */
+    _getObjectValue: function (obj, path) {
+        if (!obj) {
+            return;
+        }
+
+        for (var i = 0, len = path.length; obj && i < len; i++) {
+            obj = obj[path[i]];
+        }
+
+        return obj;
+    },
+
+    /**
+     * Parses result responses, performs filtering and highlighting, and fires
+     * the <code>results</code> event.
+     *
+     * @method _parseResponse
+     * @param {String} query Query that generated these results.
+     * @param {Object} response Response containing results.
+     * @param {Object} data Raw response data.
+     * @protected
+     */
+    _parseResponse: function (query, response, data) {
+        var facade = {
+                data   : data,
+                query  : query,
+                results: []
+            },
+
+            listLocator = this.get(RESULT_LIST_LOCATOR),
+            results     = [],
+            unfiltered  = response && response.results,
+
+            filters,
+            formatted,
+            formatter,
+            highlighted,
+            highlighter,
+            i,
+            len,
+            maxResults,
+            result,
+            text,
+            textLocator;
+
+        if (unfiltered && listLocator) {
+            unfiltered = listLocator(unfiltered);
+        }
+
+        if (unfiltered && unfiltered.length) {
+            filters     = this.get('resultFilters');
+            textLocator = this.get('resultTextLocator');
+
+            // Create a lightweight result object for each result to make them
+            // easier to work with. The various properties on the object
+            // represent different formats of the result, and will be populated
+            // as we go.
+            for (i = 0, len = unfiltered.length; i < len; ++i) {
+                result = unfiltered[i];
+                text   = textLocator ? textLocator(result) : result.toString();
+
+                results.push({
+                    display: Escape.html(text),
+                    raw    : result,
+                    text   : text
+                });
+            }
+
+            // Run the results through all configured result filters. Each
+            // filter returns an array of (potentially fewer) result objects,
+            // which is then passed to the next filter, and so on.
+            for (i = 0, len = filters.length; i < len; ++i) {
+                results = filters[i](query, results.concat());
+
+                if (!results) {
+                    return;
+                }
+
+                if (!results.length) {
+                    break;
+                }
+            }
+
+            if (results.length) {
+                formatter   = this.get('resultFormatter');
+                highlighter = this.get('resultHighlighter');
+                maxResults  = this.get('maxResults');
+
+                // If maxResults is set and greater than 0, limit the number of
+                // results.
+                if (maxResults && maxResults > 0 &&
+                        results.length > maxResults) {
+                    results.length = maxResults;
+                }
+
+                // Run the results through the configured highlighter (if any).
+                // The highlighter returns an array of highlighted strings (not
+                // an array of result objects), and these strings are then 
added
+                // to each result object.
+                if (highlighter) {
+                    highlighted = highlighter(query, results.concat());
+
+                    if (!highlighted) {
+                        return;
+                    }
+
+                    for (i = 0, len = highlighted.length; i < len; ++i) {
+                        result = results[i];
+                        result.highlighted = highlighted[i];
+                        result.display     = result.highlighted;
+                    }
+                }
+
+                // Run the results through the configured formatter (if any) to
+                // produce the final formatted results. The formatter returns 
an
+                // array of strings or Node instances (not an array of result
+                // objects), and these strings/Nodes are then added to each
+                // result object.
+                if (formatter) {
+                    formatted = formatter(query, results.concat());
+
+                    if (!formatted) {
+                        return;
+                    }
+
+                    for (i = 0, len = formatted.length; i < len; ++i) {
+                        results[i].display = formatted[i];
+                    }
+                }
+            }
+        }
+
+        facade.results = results;
+        this.fire(EVT_RESULTS, facade);
+    },
+
+    /**
+     * <p>
+     * Returns the query portion of the specified input value, or
+     * <code>null</code> if there is no suitable query within the input value.
+     * </p>
+     *
+     * <p>
+     * If a query delimiter is defined, the query will be the last delimited
+     * part of of the string.
+     * </p>
+     *
+     * @method _parseValue
+     * @param {String} value Input value from which to extract the query.
+     * @return {String|null} query
+     * @protected
+     */
+    _parseValue: function (value) {
+        var delim = this.get(QUERY_DELIMITER);
+
+        if (delim) {
+            value = value.split(delim);
+            value = value[value.length - 1];
+        }
+
+        return Lang.trimLeft(value);
+    },
+
+    /**
+     * Setter for locator attributes.
+     *
+     * @method _setLocator
+     * @param {Function|String|null} locator
+     * @return {Function|null}
+     * @protected
+     */
+    _setLocator: function (locator) {
+        if (this[_FUNCTION_VALIDATOR](locator)) {
+            return locator;
+        }
+
+        var that = this;
+
+        locator = locator.toString().split('.');
+
+        return function (result) {
+            return result && that._getObjectValue(result, locator);
+        };
+    },
+
+    /**
+     * Setter for the <code>requestTemplate</code> attribute.
+     *
+     * @method _setRequestTemplate
+     * @param {Function|String|null} template
+     * @return {Function|null}
+     * @protected
+     */
+    _setRequestTemplate: function (template) {
+        if (this[_FUNCTION_VALIDATOR](template)) {
+            return template;
+        }
+
+        template = template.toString();
+
+        return function (query) {
+            return Lang.sub(template, {query: encodeURIComponent(query)});
+        };
+    },
+
+    /**
+     * Setter for the <code>resultFilters</code> attribute.
+     *
+     * @method _setResultFilters
+     * @param {Array|Function|String|null} filters <code>null</code>, a filter
+     *   function, an array of filter functions, or a string or array of 
strings
+     *   representing the names of methods on
+     *   <code>Y.AutoCompleteFilters</code>.
+     * @return {Array} Array of filter functions (empty if <i>filters</i> is
+     *   <code>null</code>).
+     * @protected
+     */
+    _setResultFilters: function (filters) {
+        var acFilters, getFilterFunction;
+
+        if (filters === null) {
+            return [];
+        }
+
+        acFilters = Y.AutoCompleteFilters;
+
+        getFilterFunction = function (filter) {
+            if (isFunction(filter)) {
+                return filter;
+            }
+
+            if (isString(filter) && acFilters &&
+                    isFunction(acFilters[filter])) {
+                return acFilters[filter];
+            }
+
+            return false;
+        };
+
+        if (Lang.isArray(filters)) {
+            filters = YArray.map(filters, getFilterFunction);
+            return YArray.every(filters, function (f) { return !!f; }) ?
+                    filters : INVALID_VALUE;
+        } else {
+            filters = getFilterFunction(filters);
+            return filters ? [filters] : INVALID_VALUE;
+        }
+    },
+
+    /**
+     * Setter for the <code>resultHighlighter</code> attribute.
+     *
+     * @method _setResultHighlighter
+     * @param {Function|String|null} highlighter <code>null</code>, a
+     *   highlighter function, or a string representing the name of a method on
+     *   <code>Y.AutoCompleteHighlighters</code>.
+     * @return {Function|null}
+     * @protected
+     */
+    _setResultHighlighter: function (highlighter) {
+        var acHighlighters;
+
+        if (this._functionValidator(highlighter)) {
+            return highlighter;
+        }
+
+        acHighlighters = Y.AutoCompleteHighlighters;
+
+        if (isString(highlighter) && acHighlighters &&
+                isFunction(acHighlighters[highlighter])) {
+            return acHighlighters[highlighter];
+        }
+
+        return INVALID_VALUE;
+    },
+
+    /**
+     * Setter for the <code>source</code> attribute. Returns a DataSource or
+     * a DataSource-like object depending on the type of <i>source</i>.
+     *
+     * @method _setSource
+     * @param {Array|DataSource|Object|String} source AutoComplete source. See
+     *   the <code>source</code> attribute for details.
+     * @return {DataSource|Object}
+     * @protected
+     */
+    _setSource: function (source) {
+        var sourcesNotLoaded = 'autocomplete-sources module not loaded';
+
+        if ((source && isFunction(source.sendRequest)) || source === null) {
+            // Quacks like a DataSource instance (or null). Make it so!
+            return source;
+        }
+
+        switch (Lang.type(source)) {
+        case 'string':
+            if (this._createStringSource) {
+                return this._createStringSource(source);
+            }
+
+            Y.error(sourcesNotLoaded);
+            return INVALID_VALUE;
+
+        case 'array':
+            // Wrap the array in a teensy tiny fake DataSource that just 
returns
+            // the array itself for each request. Filters will do the rest.
+            return this._createArraySource(source);
+
+        case 'function':
+            return this._createFunctionSource(source);
+
+        case 'object':
+            // If the object is a JSONPRequest instance, use it as a JSONP
+            // source.
+            if (Y.JSONPRequest && source instanceof Y.JSONPRequest) {
+                if (this._createJSONPSource) {
+                    return this._createJSONPSource(source);
+                }
+
+                Y.error(sourcesNotLoaded);
+                return INVALID_VALUE;
+            }
+
+            // Not a JSONPRequest instance. Wrap the object in a teensy tiny
+            // fake DataSource that looks for the request as a property on the
+            // object and returns it if it exists, or an empty array otherwise.
+            return this._createObjectSource(source);
+        }
+
+        return INVALID_VALUE;
+    },
+
+    /**
+     * Shared success callback for non-DataSource sources.
+     *
+     * @method _sourceSuccess
+     * @param {mixed} data Response data.
+     * @param {Object} request Request object.
+     * @protected
+     */
+    _sourceSuccess: function (data, request) {
+        request.callback.success({
+            data: data,
+            response: {results: data}
+        });
+    },
+
+    /**
+     * Synchronizes the UI state of the <code>allowBrowserAutocomplete</code>
+     * attribute.
+     *
+     * @method _syncBrowserAutocomplete
+     * @protected
+     */
+    _syncBrowserAutocomplete: function () {
+        var inputNode = this.get(INPUT_NODE);
+
+        if (inputNode.get('nodeName').toLowerCase() === 'input') {
+            inputNode.setAttribute('autocomplete',
+                    this.get(ALLOW_BROWSER_AC) ? 'on' : 'off');
+        }
+    },
+
+    /**
+     * <p>
+     * Updates the query portion of the <code>value</code> attribute.
+     * </p>
+     *
+     * <p>
+     * If a query delimiter is defined, the last delimited portion of the input
+     * value will be replaced with the specified <i>value</i>.
+     * </p>
+     *
+     * @method _updateValue
+     * @param {String} newVal New value.
+     * @protected
+     */
+    _updateValue: function (newVal) {
+        var delim = this.get(QUERY_DELIMITER),
+            insertDelim,
+            len,
+            prevVal;
+
+        newVal = Lang.trimLeft(newVal);
+
+        if (delim) {
+            insertDelim = trim(delim); // so we don't double up on spaces
+            prevVal     = YArray.map(trim(this.get(VALUE)).split(delim), trim);
+            len         = prevVal.length;
+
+            if (len > 1) {
+                prevVal[len - 1] = newVal;
+                newVal = prevVal.join(insertDelim + ' ');
+            }
+
+            newVal = newVal + insertDelim + ' ';
+        }
+
+        this.set(VALUE, newVal);
+    },
+
+    // -- Protected Event Handlers 
---------------------------------------------
+
+    /**
+     * Handles change events for the <code>value</code> attribute.
+     *
+     * @method _afterValueChange
+     * @param {EventFacade} e
+     * @protected
+     */
+    _afterValueChange: function (e) {
+        var delay,
+            fire,
+            minQueryLength,
+            newVal = e.newVal,
+            query,
+            that;
+
+        // Don't query on value changes that didn't come from the user.
+        if (e.src !== AutoCompleteBase.UI_SRC) {
+            this._inputNode.set(VALUE, newVal);
+            return;
+        }
+
+
+        minQueryLength = this.get('minQueryLength');
+        query          = this._parseValue(newVal) || '';
+
+        if (minQueryLength >= 0 && query.length >= minQueryLength) {
+            delay = this.get('queryDelay');
+            that  = this;
+
+            fire = function () {
+                that.fire(EVT_QUERY, {
+                    inputValue: newVal,
+                    query     : query
+                });
+            };
+
+            if (delay) {
+                clearTimeout(this._delay);
+                this._delay = setTimeout(fire, delay);
+            } else {
+                fire();
+            }
+        } else {
+            clearTimeout(this._delay);
+
+            this.fire(EVT_CLEAR, {
+                prevVal: e.prevVal ? this._parseValue(e.prevVal) : null
+            });
+        }
+    },
+
+    /**
+     * Handles <code>blur</code> events on the input node.
+     *
+     * @method _onInputBlur
+     * @param {EventFacade} e
+     * @protected
+     */
+    _onInputBlur: function (e) {
+        var delim = this.get(QUERY_DELIMITER),
+            delimPos,
+            newVal,
+            value;
+
+        // If a query delimiter is set and the input's value contains one or
+        // more trailing delimiters, strip them.
+        if (delim && !this.get('allowTrailingDelimiter')) {
+            delim = Lang.trimRight(delim);
+            value = newVal = this._inputNode.get(VALUE);
+
+            if (delim) {
+                while ((newVal = Lang.trimRight(newVal)) &&
+                        (delimPos = newVal.length - delim.length) &&
+                        newVal.lastIndexOf(delim) === delimPos) {
+
+                    newVal = newVal.substring(0, delimPos);
+                }
+            } else {
+                // Delimiter is one or more space characters, so just trim the
+                // value.
+                newVal = Lang.trimRight(newVal);
+            }
+
+            if (newVal !== value) {
+                this.set(VALUE, newVal);
+            }
+        }
+    },
+
+    /**
+     * Handles <code>valueChange</code> events on the input node and fires a
+     * <code>query</code> event when the input value meets the configured
+     * criteria.
+     *
+     * @method _onInputValueChange
+     * @param {EventFacade} e
+     * @protected
+     */
+    _onInputValueChange: function (e) {
+        var newVal = e.newVal;
+
+        // Don't query if the internal value is the same as the new value
+        // reported by valueChange.
+        if (newVal === this.get(VALUE)) {
+            return;
+        }
+
+        this.set(VALUE, newVal, {src: AutoCompleteBase.UI_SRC});
+    },
+
+    /**
+     * Handles source responses and fires the <code>results</code> event.
+     *
+     * @method _onResponse

@@ Diff output truncated at 153600 characters. @@



reply via email to

[Prev in Thread] Current Thread [Next in Thread]