[Top][All Lists]
[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 <= 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 "shift" 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 "execute" 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 "add" 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 "promote" event. Promotes
the
+ * named callback to the head of the queue.</p>
+ *
+ * <p>The event object will contain a property "callback", 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 "remove" event. Removes the
+ * callback from the queue.</p>
+ *
+ * <p>The event object will contain a property "callback", 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 <= 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 "shift" 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 "execute" 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 "add" 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 "promote" event. Promotes
the
+ * named callback to the head of the queue.</p>
+ *
+ * <p>The event object will contain a property "callback", 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 "remove" event. Removes the
+ * callback from the queue.</p>
+ *
+ * <p>The event object will contain a property "callback", 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) {
+ * var MyAC = Y.Base.create('myAC', Y.Widget,
[Y.AutoCompleteBase], {
+ * // Custom prototype methods and properties.
+ * }, {
+ * // Custom static methods and properties.
+ * });
+ *
+ * // Custom implementation code.
+ * });
+ * </pre>
+ *
+ * <p>
+ * <code>Y.Base</code>-based example:
+ * </p>
+ *
+ * <pre>
+ * YUI().use('autocomplete-base', function (Y) {
+ * var MyAC = Y.Base.create('myAC', Y.Base, [Y.AutoCompleteBase], {
+ * initializer: function () {
+ * this._bindUIACBase();
+ * this._syncUIACBase();
+ * },
+ *
+ * // Custom prototype methods and properties.
+ * }, {
+ * // Custom static methods and properties.
+ * });
+ *
+ * // 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) {
+ * var MyAC = Y.Base.create('myAC', Y.Widget,
[Y.AutoCompleteBase], {
+ * // Custom prototype methods and properties.
+ * }, {
+ * // Custom static methods and properties.
+ * });
+ *
+ * // Custom implementation code.
+ * });
+ * </pre>
+ *
+ * <p>
+ * <code>Y.Base</code>-based example:
+ * </p>
+ *
+ * <pre>
+ * YUI().use('autocomplete-base', function (Y) {
+ * var MyAC = Y.Base.create('myAC', Y.Base, [Y.AutoCompleteBase], {
+ * initializer: function () {
+ * this._bindUIACBase();
+ * this._syncUIACBase();
+ * },
+ *
+ * // Custom prototype methods and properties.
+ * }, {
+ * // Custom static methods and properties.
+ * });
+ *
+ * // 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. @@
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Fmsystem-commits] [6811] add yui3,
Sigurd Nes <=