├── .gitignore ├── LICENSE ├── MANIFEST.in ├── README.rst ├── setup.py └── tagging_autocomplete ├── __init__.py ├── models.py ├── static └── tagging_autocomplete │ ├── css │ ├── base │ │ ├── images │ │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ │ ├── ui-bg_flat_75_ffffff_40x100.png │ │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ │ │ ├── ui-icons_222222_256x240.png │ │ │ ├── ui-icons_2e83ff_256x240.png │ │ │ ├── ui-icons_454545_256x240.png │ │ │ ├── ui-icons_888888_256x240.png │ │ │ └── ui-icons_cd0a0a_256x240.png │ │ ├── jquery.ui.all.css │ │ ├── jquery.ui.autocomplete.css │ │ ├── jquery.ui.base.css │ │ ├── jquery.ui.core.css │ │ └── jquery.ui.theme.css │ └── tagging_autocomplete.css │ └── js │ ├── jquery-1.6.2.min.js │ ├── jquery.ui.autocomplete.min.js │ ├── jquery.ui.core.min.js │ ├── jquery.ui.position.min.js │ └── jquery.ui.widget.min.js ├── urls.py ├── views.py └── widgets.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | dist 3 | MANIFEST 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2009 Ludwik Trammer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE 2 | include README.rst 3 | recursive-include tagging_autocomplete/static * 4 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | django-tagging-autocomplete 3 | =========================== 4 | django-tagging-autocomplete is a jquery based autocomplete solution for 5 | django-tagging. 6 | 7 | Requirements 8 | ============ 9 | * django-tagging 10 | 11 | Setup 12 | ===== 13 | 1. Download package and install, for example using pip:: 14 | 15 | pip install django-tagging-autocomplete 16 | 17 | 2. Add `tagging_autocomplete` to installed apps in your project's settings. 18 | 3. Add the following line to your project's urls.py file:: 19 | 20 | (r'^tagging_autocomplete/', include('tagging_autocomplete.urls')), 21 | 22 | Usage 23 | ===== 24 | 25 | The Model Field 26 | --------------- 27 | You can use `TagAutocompleteField()` to enable autocompletion right in your 28 | `models.py`. In most cases this is the easiest solution:: 29 | 30 | from django.db import models 31 | from tagging_autocomplete.models import TagAutocompleteField 32 | 33 | class SomeModel(models.Model): 34 | tags = TagAutocompleteField() 35 | 36 | The Form Widget 37 | --------------- 38 | Alternatively you can use the `TagAutocomplete()` form widget while creating 39 | your form:: 40 | 41 | from django import forms 42 | from tagging.forms import TagField 43 | from tagging_autocomplete.widgets import TagAutocomplete 44 | 45 | class SomeForm(forms.Form): 46 | tags = TagField(widget=TagAutocomplete()) 47 | 48 | Optional settings 49 | ----------------- 50 | By default the maximum number of results suggested by the autocompletion is 100. 51 | You can modify this number by adding to your `settings.py` project file 52 | the `TAGGING_AUTOCOMPLETE_MAX_RESULTS` constant. 53 | For example:: 54 | 55 | TAGGING_AUTOCOMPLETE_MAX_RESULTS = 5 56 | 57 | By default autocompletion suggests tags that *start with* a given term. 58 | In case you need to show ones that *contain* the given term, 59 | set `TAGGING_AUTOCOMPLETE_SEARCH_CONTAINS` to `True`. 60 | For example:: 61 | 62 | TAGGING_AUTOCOMPLETE_SEARCH_CONTAINS = True 63 | 64 | By default suggestions are shown right after you enter first character. 65 | You can configure this behaviour using `TAGGING_AUTOCOMPLETE_MIN_LENGTH`. 66 | For example:: 67 | 68 | TAGGING_AUTOCOMPLETE_MIN_LENGTH = 3 69 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | from setuptools import find_packages, setup 3 | 4 | with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme: 5 | README = readme.read() 6 | 7 | # allow setup.py to be run from any path 8 | os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) 9 | 10 | setup( 11 | name='django-tagging-autocomplete', 12 | version='0.5.1', 13 | description='Autocompletion for django-tagging', 14 | long_description=README, 15 | author='Ludwik Trammer', 16 | author_email='ludwik@gmail.com', 17 | url='https://github.com/ludwiktrammer/django-tagging-autocomplete/', 18 | packages=find_packages(), 19 | include_package_data=True, 20 | classifiers=[ 21 | 'Development Status :: 4 - Beta', 22 | 'Environment :: Web Environment', 23 | 'Intended Audience :: Developers', 24 | 'License :: OSI Approved :: MIT License', 25 | 'Operating System :: OS Independent', 26 | 'Programming Language :: Python', 27 | 'Framework :: Django', 28 | ] 29 | ) 30 | -------------------------------------------------------------------------------- /tagging_autocomplete/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/__init__.py -------------------------------------------------------------------------------- /tagging_autocomplete/models.py: -------------------------------------------------------------------------------- 1 | from tagging.fields import TagField 2 | from django.contrib.admin.widgets import AdminTextInputWidget 3 | 4 | from tagging_autocomplete.widgets import TagAutocomplete 5 | 6 | 7 | class TagAutocompleteField(TagField): 8 | """ 9 | TagField with autocomplete widget. 10 | """ 11 | 12 | def formfield(self, **kwargs): 13 | defaults = {'widget': TagAutocomplete} 14 | defaults.update(kwargs) 15 | # As an ugly hack, we override the admin widget. 16 | if defaults['widget'] == AdminTextInputWidget: 17 | defaults['widget'] = TagAutocomplete(attrs={'class': 'vTextField'}) 18 | return super(TagAutocompleteField, self).formfield(**defaults) 19 | -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_flat_75_ffffff_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_flat_75_ffffff_40x100.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_glass_95_fef1ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_glass_95_fef1ec_1x400.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-icons_454545_256x240.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-icons_888888_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-icons_888888_256x240.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-icons_cd0a0a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ludwiktrammer/django-tagging-autocomplete/7550b4666d06aac5d9df75fae02a6d60f96051a5/tagging_autocomplete/static/tagging_autocomplete/css/base/images/ui-icons_cd0a0a_256x240.png -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/jquery.ui.all.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI CSS Framework 1.8.17 3 | * 4 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Theming 9 | */ 10 | @import "jquery.ui.base.css"; 11 | @import "jquery.ui.theme.css"; 12 | -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/jquery.ui.autocomplete.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Autocomplete 1.8.17 3 | * 4 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Autocomplete#theming 9 | */ 10 | .ui-autocomplete { position: absolute; cursor: default; } 11 | 12 | /* workarounds */ 13 | * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ 14 | 15 | /* 16 | * jQuery UI Menu 1.8.17 17 | * 18 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 19 | * Dual licensed under the MIT or GPL Version 2 licenses. 20 | * http://jquery.org/license 21 | * 22 | * http://docs.jquery.com/UI/Menu#theming 23 | */ 24 | .ui-menu { 25 | list-style:none; 26 | padding: 2px; 27 | margin: 0; 28 | display:block; 29 | float: left; 30 | } 31 | .ui-menu .ui-menu { 32 | margin-top: -3px; 33 | } 34 | .ui-menu .ui-menu-item { 35 | margin:0; 36 | padding: 0; 37 | zoom: 1; 38 | float: left; 39 | clear: left; 40 | width: 100%; 41 | } 42 | .ui-menu .ui-menu-item a { 43 | text-decoration:none; 44 | display:block; 45 | padding:.2em .4em; 46 | line-height:1.5; 47 | zoom:1; 48 | } 49 | .ui-menu .ui-menu-item a.ui-state-hover, 50 | .ui-menu .ui-menu-item a.ui-state-active { 51 | font-weight: normal; 52 | margin: -1px; 53 | } 54 | -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/jquery.ui.base.css: -------------------------------------------------------------------------------- 1 | @import url("jquery.ui.core.css"); 2 | @import url("jquery.ui.autocomplete.css"); -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/jquery.ui.core.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI CSS Framework 1.8.17 3 | * 4 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Theming/API 9 | */ 10 | 11 | /* Layout helpers 12 | ----------------------------------*/ 13 | .ui-helper-hidden { display: none; } 14 | .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } 15 | .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } 16 | .ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; } 17 | .ui-helper-clearfix:after { clear: both; } 18 | .ui-helper-clearfix { zoom: 1; } 19 | .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } 20 | 21 | 22 | /* Interaction Cues 23 | ----------------------------------*/ 24 | .ui-state-disabled { cursor: default !important; } 25 | 26 | 27 | /* Icons 28 | ----------------------------------*/ 29 | 30 | /* states and images */ 31 | .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } 32 | 33 | 34 | /* Misc visuals 35 | ----------------------------------*/ 36 | 37 | /* Overlays */ 38 | .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } 39 | -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/base/jquery.ui.theme.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI CSS Framework 1.8.17 3 | * 4 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Theming/API 9 | * 10 | * To view and modify this theme, visit http://jqueryui.com/themeroller/ 11 | */ 12 | 13 | 14 | /* Component containers 15 | ----------------------------------*/ 16 | .ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } 17 | .ui-widget .ui-widget { font-size: 1em; } 18 | .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } 19 | .ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } 20 | .ui-widget-content a { color: #222222/*{fcContent}*/; } 21 | .ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; } 22 | .ui-widget-header a { color: #222222/*{fcHeader}*/; } 23 | 24 | /* Interaction states 25 | ----------------------------------*/ 26 | .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; } 27 | .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; } 28 | .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; } 29 | .ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; } 30 | .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; } 31 | .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; } 32 | .ui-widget :active { outline: none; } 33 | 34 | /* Interaction Cues 35 | ----------------------------------*/ 36 | .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } 37 | .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } 38 | .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } 39 | .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; } 40 | .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } 41 | .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } 42 | .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } 43 | .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } 44 | 45 | /* Icons 46 | ----------------------------------*/ 47 | 48 | /* states and images */ 49 | .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } 50 | .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } 51 | .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; } 52 | .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } 53 | .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; } 54 | .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } 55 | .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } 56 | .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } 57 | 58 | /* positioning */ 59 | .ui-icon-carat-1-n { background-position: 0 0; } 60 | .ui-icon-carat-1-ne { background-position: -16px 0; } 61 | .ui-icon-carat-1-e { background-position: -32px 0; } 62 | .ui-icon-carat-1-se { background-position: -48px 0; } 63 | .ui-icon-carat-1-s { background-position: -64px 0; } 64 | .ui-icon-carat-1-sw { background-position: -80px 0; } 65 | .ui-icon-carat-1-w { background-position: -96px 0; } 66 | .ui-icon-carat-1-nw { background-position: -112px 0; } 67 | .ui-icon-carat-2-n-s { background-position: -128px 0; } 68 | .ui-icon-carat-2-e-w { background-position: -144px 0; } 69 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 70 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 71 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 72 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 73 | .ui-icon-triangle-1-s { background-position: -64px -16px; } 74 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 75 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 76 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 77 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 78 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 79 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 80 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 81 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 82 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 83 | .ui-icon-arrow-1-s { background-position: -64px -32px; } 84 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 85 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 86 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 87 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 88 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 89 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 90 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 91 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 92 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 93 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 94 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 95 | .ui-icon-arrowthick-1-n { background-position: 0 -48px; } 96 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 97 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 98 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 99 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 100 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 101 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 102 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 103 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 104 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 105 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 106 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 107 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 108 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 109 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 110 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 111 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 112 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 113 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 114 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 115 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 116 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 117 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 118 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 119 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 120 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 121 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 122 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 123 | .ui-icon-arrow-4 { background-position: 0 -80px; } 124 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 125 | .ui-icon-extlink { background-position: -32px -80px; } 126 | .ui-icon-newwin { background-position: -48px -80px; } 127 | .ui-icon-refresh { background-position: -64px -80px; } 128 | .ui-icon-shuffle { background-position: -80px -80px; } 129 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 130 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 131 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 132 | .ui-icon-folder-open { background-position: -16px -96px; } 133 | .ui-icon-document { background-position: -32px -96px; } 134 | .ui-icon-document-b { background-position: -48px -96px; } 135 | .ui-icon-note { background-position: -64px -96px; } 136 | .ui-icon-mail-closed { background-position: -80px -96px; } 137 | .ui-icon-mail-open { background-position: -96px -96px; } 138 | .ui-icon-suitcase { background-position: -112px -96px; } 139 | .ui-icon-comment { background-position: -128px -96px; } 140 | .ui-icon-person { background-position: -144px -96px; } 141 | .ui-icon-print { background-position: -160px -96px; } 142 | .ui-icon-trash { background-position: -176px -96px; } 143 | .ui-icon-locked { background-position: -192px -96px; } 144 | .ui-icon-unlocked { background-position: -208px -96px; } 145 | .ui-icon-bookmark { background-position: -224px -96px; } 146 | .ui-icon-tag { background-position: -240px -96px; } 147 | .ui-icon-home { background-position: 0 -112px; } 148 | .ui-icon-flag { background-position: -16px -112px; } 149 | .ui-icon-calendar { background-position: -32px -112px; } 150 | .ui-icon-cart { background-position: -48px -112px; } 151 | .ui-icon-pencil { background-position: -64px -112px; } 152 | .ui-icon-clock { background-position: -80px -112px; } 153 | .ui-icon-disk { background-position: -96px -112px; } 154 | .ui-icon-calculator { background-position: -112px -112px; } 155 | .ui-icon-zoomin { background-position: -128px -112px; } 156 | .ui-icon-zoomout { background-position: -144px -112px; } 157 | .ui-icon-search { background-position: -160px -112px; } 158 | .ui-icon-wrench { background-position: -176px -112px; } 159 | .ui-icon-gear { background-position: -192px -112px; } 160 | .ui-icon-heart { background-position: -208px -112px; } 161 | .ui-icon-star { background-position: -224px -112px; } 162 | .ui-icon-link { background-position: -240px -112px; } 163 | .ui-icon-cancel { background-position: 0 -128px; } 164 | .ui-icon-plus { background-position: -16px -128px; } 165 | .ui-icon-plusthick { background-position: -32px -128px; } 166 | .ui-icon-minus { background-position: -48px -128px; } 167 | .ui-icon-minusthick { background-position: -64px -128px; } 168 | .ui-icon-close { background-position: -80px -128px; } 169 | .ui-icon-closethick { background-position: -96px -128px; } 170 | .ui-icon-key { background-position: -112px -128px; } 171 | .ui-icon-lightbulb { background-position: -128px -128px; } 172 | .ui-icon-scissors { background-position: -144px -128px; } 173 | .ui-icon-clipboard { background-position: -160px -128px; } 174 | .ui-icon-copy { background-position: -176px -128px; } 175 | .ui-icon-contact { background-position: -192px -128px; } 176 | .ui-icon-image { background-position: -208px -128px; } 177 | .ui-icon-video { background-position: -224px -128px; } 178 | .ui-icon-script { background-position: -240px -128px; } 179 | .ui-icon-alert { background-position: 0 -144px; } 180 | .ui-icon-info { background-position: -16px -144px; } 181 | .ui-icon-notice { background-position: -32px -144px; } 182 | .ui-icon-help { background-position: -48px -144px; } 183 | .ui-icon-check { background-position: -64px -144px; } 184 | .ui-icon-bullet { background-position: -80px -144px; } 185 | .ui-icon-radio-off { background-position: -96px -144px; } 186 | .ui-icon-radio-on { background-position: -112px -144px; } 187 | .ui-icon-pin-w { background-position: -128px -144px; } 188 | .ui-icon-pin-s { background-position: -144px -144px; } 189 | .ui-icon-play { background-position: 0 -160px; } 190 | .ui-icon-pause { background-position: -16px -160px; } 191 | .ui-icon-seek-next { background-position: -32px -160px; } 192 | .ui-icon-seek-prev { background-position: -48px -160px; } 193 | .ui-icon-seek-end { background-position: -64px -160px; } 194 | .ui-icon-seek-start { background-position: -80px -160px; } 195 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 196 | .ui-icon-seek-first { background-position: -80px -160px; } 197 | .ui-icon-stop { background-position: -96px -160px; } 198 | .ui-icon-eject { background-position: -112px -160px; } 199 | .ui-icon-volume-off { background-position: -128px -160px; } 200 | .ui-icon-volume-on { background-position: -144px -160px; } 201 | .ui-icon-power { background-position: 0 -176px; } 202 | .ui-icon-signal-diag { background-position: -16px -176px; } 203 | .ui-icon-signal { background-position: -32px -176px; } 204 | .ui-icon-battery-0 { background-position: -48px -176px; } 205 | .ui-icon-battery-1 { background-position: -64px -176px; } 206 | .ui-icon-battery-2 { background-position: -80px -176px; } 207 | .ui-icon-battery-3 { background-position: -96px -176px; } 208 | .ui-icon-circle-plus { background-position: 0 -192px; } 209 | .ui-icon-circle-minus { background-position: -16px -192px; } 210 | .ui-icon-circle-close { background-position: -32px -192px; } 211 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 212 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 213 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 214 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 215 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 216 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 217 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 218 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 219 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 220 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 221 | .ui-icon-circle-check { background-position: -208px -192px; } 222 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 223 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 224 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 225 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 226 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 227 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 228 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 229 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 230 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 231 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 232 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 233 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 234 | 235 | 236 | /* Misc visuals 237 | ----------------------------------*/ 238 | 239 | /* Corner radius */ 240 | .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; } 241 | .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } 242 | .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } 243 | .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } 244 | 245 | /* Overlays */ 246 | .ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } 247 | .ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; } -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/css/tagging_autocomplete.css: -------------------------------------------------------------------------------- 1 | ul.ui-autocomplete li { 2 | list-style: none; 3 | } 4 | -------------------------------------------------------------------------------- /tagging_autocomplete/static/tagging_autocomplete/js/jquery-1.6.2.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery JavaScript Library v1.6.2 3 | * http://jquery.com/ 4 | * 5 | * Copyright 2011, John Resig 6 | * Dual licensed under the MIT or GPL Version 2 licenses. 7 | * http://jquery.org/license 8 | * 9 | * Includes Sizzle.js 10 | * http://sizzlejs.com/ 11 | * Copyright 2011, The Dojo Foundation 12 | * Released under the MIT, BSD, and GPL Licenses. 13 | * 14 | * Date: Thu Jun 30 14:16:56 2011 -0400 15 | */ 16 | (function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+"
"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;it |