summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/dashboard/__init__.py2
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/dashboard/dashboards.py257
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/__init__.py0
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/commands/__init__.py0
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/commands/customdashboard.py93
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/dashboard/modules.py456
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/dashboard/registry.py124
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/dashboard/templatetags/__init__.py0
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/dashboard/templatetags/grp_dashboard_tags.py129
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/dashboard/utils.py229
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/models.py0
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/settings.py12
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/templatetags/__init__.py0
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/templatetags/grp_tags.py232
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/urls.py79
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/views/__init__.py0
-rw-r--r--build/lib.linux-i686-2.6/demo/grappelli/views/related.py177
-rw-r--r--build/lib.linux-i686-2.6/gstudio/__init__.py27
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/__init__.py118
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute.py20
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_bigintegerfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_booleanfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_charfield.py10
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_commaseparatedintegerfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_datefield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_datetimefield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_decimalfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_emailfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_filefield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_filepathfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_floatfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_imagefield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_integerfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_ipaddressfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_nullbooleanfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_positiveintegerfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_textfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_timefield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attribute_urlfield.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attributespecification.py10
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/attributetype.py352
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/complement.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/expression.py13
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/forms.py505
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/intersection.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/metatype.py30
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/nodespecification.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/objecttype.py346
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/processtype.py349
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/relation.py13
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/relationspecification.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/relationtype.py362
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/systemtype.py352
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/union.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/admin/widgets.py107
-rw-r--r--build/lib.linux-i686-2.6/gstudio/comparison.py140
-rw-r--r--build/lib.linux-i686-2.6/gstudio/context_processors.py24
-rw-r--r--build/lib.linux-i686-2.6/gstudio/feeds.py351
-rw-r--r--build/lib.linux-i686-2.6/gstudio/forms.py94
-rw-r--r--build/lib.linux-i686-2.6/gstudio/gnowql.py85
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/bl/LC_MESSAGES/django.po1299
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/de/LC_MESSAGES/django.mobin0 -> 15967 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/de/LC_MESSAGES/django.po1341
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/es/LC_MESSAGES/django.mobin0 -> 17836 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/es/LC_MESSAGES/django.po1375
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/fr/LC_MESSAGES/django.mobin0 -> 18086 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/fr/LC_MESSAGES/django.po1373
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/hi/LC_MESSAGES/django.po1300
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/hu/LC_MESSAGES/django.mobin0 -> 16202 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/hu/LC_MESSAGES/django.po1336
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/it/LC_MESSAGES/django.mobin0 -> 14990 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/it/LC_MESSAGES/django.po1337
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/ml/LC_MESSAGES/django.po1300
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/mr/LC_MESSAGES/django.po1299
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/nl/LC_MESSAGES/django.mobin0 -> 17418 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/nl/LC_MESSAGES/django.po1371
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/pl/LC_MESSAGES/django.mobin0 -> 2115 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/pl/LC_MESSAGES/django.po1327
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/pt_BR/LC_MESSAGES/django.mobin0 -> 17032 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/pt_BR/LC_MESSAGES/django.po1341
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/pu/LC_MESSAGES/django.po1299
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/ru/LC_MESSAGES/django.mobin0 -> 19545 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/ru/LC_MESSAGES/django.po1344
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/te/LC_MESSAGES/django.po1300
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/zh_CN/LC_MESSAGES/django.mobin0 -> 5537 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/locale/zh_CN/LC_MESSAGES/django.po1317
-rw-r--r--build/lib.linux-i686-2.6/gstudio/management/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/management/commands/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/management/commands/blogger2gstudio.py319
-rw-r--r--build/lib.linux-i686-2.6/gstudio/management/commands/feed2gstudio.py209
-rw-r--r--build/lib.linux-i686-2.6/gstudio/management/commands/gstudio2wp.py96
-rw-r--r--build/lib.linux-i686-2.6/gstudio/management/commands/spam_cleanup.py89
-rw-r--r--build/lib.linux-i686-2.6/gstudio/management/commands/wp2gstudio.py406
-rw-r--r--build/lib.linux-i686-2.6/gstudio/managers.py130
-rw-r--r--build/lib.linux-i686-2.6/gstudio/migrations/0001_initial.py997
-rw-r--r--build/lib.linux-i686-2.6/gstudio/migrations/__init__.py0
-rw-r--r--build/lib.linux-i686-2.6/gstudio/models.py1905
-rw-r--r--build/lib.linux-i686-2.6/gstudio/moderator.py194
-rw-r--r--build/lib.linux-i686-2.6/gstudio/ping.py231
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/admin.py106
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/cms_app.py16
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/cms_plugins.py201
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/menu.py198
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/migrations/0001_initial.py151
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/migrations/0002_auto__add_field_latestnodetypesplugin_template_to_render__add_field_sele.py132
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/migrations/0003_auto__del_field_latestnodetypesplugin_metatype__del_field_latestnodetypesp.py172
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/migrations/0004_auto__add_field_latestnodetypesplugin_submetatypes.py142
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/migrations/0005_auto__add_randomnodetypesplugin.py151
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/migrations/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/models.py170
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/placeholder.py66
-rw-r--r--build/lib.linux-i686-2.6/gstudio/plugins/settings.py93
-rw-r--r--build/lib.linux-i686-2.6/gstudio/rdf.py120
-rw-r--r--build/lib.linux-i686-2.6/gstudio/search.py181
-rw-r--r--build/lib.linux-i686-2.6/gstudio/settings.py154
-rw-r--r--build/lib.linux-i686-2.6/gstudio/signals.py121
-rw-r--r--build/lib.linux-i686-2.6/gstudio/sitemaps.py183
-rw-r--r--build/lib.linux-i686-2.6/gstudio/spam_checker/__init__.py100
-rw-r--r--build/lib.linux-i686-2.6/gstudio/spam_checker/backends/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/spam_checker/backends/all_is_spam.py72
-rw-r--r--build/lib.linux-i686-2.6/gstudio/spam_checker/backends/automattic.py108
-rw-r--r--build/lib.linux-i686-2.6/gstudio/spam_checker/backends/mollom.py106
-rw-r--r--build/lib.linux-i686-2.6/gstudio/spam_checker/backends/typepad.py115
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/config.rb9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/dashboard_gstudio.css32
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/dashboard_objectapp.css32
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/grappelli-skin-default.css1884
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/ie.css39
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/jquery-ui.css566
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/jquery.autocomplete.css48
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/print.css33
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/screen.css569
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/slider.css12
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_base.sass32
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_calendar.sass15
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_gbobject.sass35
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_gstudio.sass35
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_paginator.sass19
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_tag-cloud.sass21
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/dashboard_gstudio.sass66
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/dashboard_objectapp.sass66
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/ie.sass3
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/print.sass22
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/screen.sass198
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/slider.sass74
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/structures.css662
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/css/wymeditor_styles.css45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/background.gifbin0 -> 196 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/bullet.pngbin0 -> 289 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/comments.pngbin0 -> 426 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/community.pngbin0 -> 4394 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/favicon.icobin0 -> 1150 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/favicon.pngbin0 -> 660 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/grid.pngbin0 -> 206 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/help.pngbin0 -> 764 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/logo.pngbin0 -> 4864 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/manage.pngbin0 -> 228 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/objecttype.pngbin0 -> 438 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/plugin.pngbin0 -> 3530 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/preview.pngbin0 -> 470 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/rss.pngbin0 -> 561 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/shorturl.pngbin0 -> 343 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/sitemap.pngbin0 -> 3215 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/tags.pngbin0 -> 667 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/trans.pngbin0 -> 115 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/comments.pngbin0 -> 1442 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/gstudio.pngbin0 -> 660 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/watermark.pngbin0 -> 12376 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.chart.js984
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.chart.min.js1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.csv.js92
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.csv.min.js1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geo.js938
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geo.min.js1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geom.js835
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geom.min.js1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.js4690
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.layout.js1891
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.layout.min.js1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.min.js2
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.time.js687
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.time.min.js1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/egonet.json1666
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/force.js161
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/gstudio.js88
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/gstudiojs.js55
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/GPL-LICENSE.txt278
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/MIT-LICENSE.txt20
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/i18n.html73
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-de.js9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-fr.js13
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-ja.js9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/index.html1007
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/jquery.ui.timepicker.css69
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/jquery.ui.timepicker.js1345
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/releases.txt105
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui.js11767
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.autocomplete.js13
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.bgiframe.js10
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.js167
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.masonry.js12
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.min.js18
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.ui.js68
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.ui.timepicker.js1345
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/jquery.markitup.js574
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/bold.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/clean.pngbin0 -> 667 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h1.pngbin0 -> 276 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h2.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h3.pngbin0 -> 306 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h4.pngbin0 -> 293 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h5.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h6.pngbin0 -> 310 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/image.pngbin0 -> 516 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/italic.pngbin0 -> 223 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/link.pngbin0 -> 343 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-bullet.pngbin0 -> 344 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-item.pngbin0 -> 248 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-numeric.pngbin0 -> 357 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/paragraph.pngbin0 -> 361 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/picture.pngbin0 -> 606 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/preview.pngbin0 -> 537 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/stroke.pngbin0 -> 269 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/set.js38
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/style.css59
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/bold.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/code.pngbin0 -> 859 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h1.pngbin0 -> 276 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h2.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h3.pngbin0 -> 306 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h4.pngbin0 -> 293 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h5.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h6.pngbin0 -> 310 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/italic.pngbin0 -> 223 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/link.pngbin0 -> 343 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/list-bullet.pngbin0 -> 344 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/list-numeric.pngbin0 -> 357 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/picture.pngbin0 -> 606 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/preview.pngbin0 -> 537 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/quotes.pngbin0 -> 743 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/set.js49
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/style.css54
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/bold.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/code.pngbin0 -> 859 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h1.pngbin0 -> 276 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h2.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h3.pngbin0 -> 306 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h4.pngbin0 -> 293 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h5.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/italic.pngbin0 -> 223 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/link.pngbin0 -> 343 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/list-bullet.pngbin0 -> 344 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/list-numeric.pngbin0 -> 357 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/picture.pngbin0 -> 606 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/preview.pngbin0 -> 537 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/quotes.pngbin0 -> 743 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/set.js48
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/style.css53
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/bold.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/code.pngbin0 -> 859 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h1.pngbin0 -> 276 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h2.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h3.pngbin0 -> 306 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h4.pngbin0 -> 293 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h5.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h6.pngbin0 -> 310 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/italic.pngbin0 -> 223 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/link.pngbin0 -> 343 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/list-bullet.pngbin0 -> 344 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/list-numeric.pngbin0 -> 357 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/paragraph.pngbin0 -> 361 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/picture.pngbin0 -> 606 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/preview.pngbin0 -> 537 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/quotes.pngbin0 -> 743 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/stroke.pngbin0 -> 269 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/set.js37
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/style.css60
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/handle.pngbin0 -> 258 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/menu.pngbin0 -> 27151 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/submenu.pngbin0 -> 240 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/style.css128
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/templates/preview.css5
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/templates/preview.html11
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/mptt_m2m_selectbox.js133
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/underscore.js981
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-blockquote.pngbin0 -> 196 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h1.pngbin0 -> 166 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h2.pngbin0 -> 172 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h3.pngbin0 -> 170 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h4.pngbin0 -> 172 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h5.pngbin0 -> 172 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h6.pngbin0 -> 171 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-p.pngbin0 -> 3607 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-pre.pngbin0 -> 177 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/wymiframe.css90
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/wymiframe.html26
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.js4688
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.min.js1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.pack.js1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/bg.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/ca.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/cs.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/cy.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/de.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/en.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/es.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fa.js46
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fi.js44
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fr.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/gl.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/he.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/hr.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/hu.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/it.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nb.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nl.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nn.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pl.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pt-br.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pt.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/ru.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/sv.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/tr.js45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/zh_cn.js47
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/embed/jquery.wymeditor.embed.js52
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/fullscreen/icon_fullscreen.gifbin0 -> 509 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js127
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js57
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js91
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/resizable/readme.txt124
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/README19
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js82
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/tidy.php36
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/wand.pngbin0 -> 715 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/icons.pngbin0 -> 3651 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/skin.css134
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/skin.js35
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/icons.pngbin0 -> 3651 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/skin.css133
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/skin.js40
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/icons.pngbin0 -> 7236 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/skin.css136
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/skin.js42
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.header.gifbin0 -> 781 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.selector.silver.gifbin0 -> 1621 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.wymeditor.pngbin0 -> 498 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/icons.silver.gifbin0 -> 15382 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/skin.css131
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/skin.js30
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/COPYING674
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/README27
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.header.gifbin0 -> 781 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.selector.silver.gifbin0 -> 1621 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.wymeditor.pngbin0 -> 498 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/icons.silver.gifbin0 -> 15382 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/skin.css297
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/skin.js61
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/icons.pngbin0 -> 3651 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/skin.css134
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/skin.js39
-rw-r--r--build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/wymeditor_icon.pngbin0 -> 1028 bytes
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/404.html46
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/500.html46
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/app_index.html41
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/autocomplete_tags.js11
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/markitup.js3
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/tinymce_textareas.js23
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/wymeditor.js10
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/ATquickpost.html59
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/OTquickpost.html58
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_content_stats.html146
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_draft_nodetypes.html37
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_recent_comments.html45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_recent_linkbacks.html31
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/base.html6
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/content_stats.html12
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/draft_nodetypes.html12
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/quickpost.html14
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/recent_comments.html12
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/recent_linkbacks.html12
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/base.html105
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/comments/comment_authors_email.txt6
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/comments/comment_notification_email.txt14
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/comments/comment_reply_email.txt6
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio/nodetype/form.html22
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio/nodetype/posted.html13
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio_nodetype_preview.html37
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/feeds/comment_description.html1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/feeds/comment_title.html2
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/feeds/discussion_description.html1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/feeds/discussion_title.html2
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/feeds/nodetype_description.html1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/feeds/nodetype_title.html1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/feeds/pingback_description.html1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/feeds/pingback_title.html2
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/feeds/trackback_description.html1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/feeds/trackback_title.html2
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/_header.html80
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/_narrative_detail.html200
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/_nodetype_detail.html32
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/_nodetype_neighbourhood.html18
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/_subtype_detail.html1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/attributetype_detail.html281
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/author/nodetype_list.html1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/author_list.html27
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/base.html108
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/nodetype_detail.html8
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/nodetype_list.html12
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/random_nodetypes.html4
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/graph1.html347
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/login.html40
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/metatype/nodetype_list.html1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/metatype_list.html25
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive.html30
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_day.html23
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_month.html31
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_year.html21
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_detail.html364
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_list.html143
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_search.html49
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_trackback.xml9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/opensearch.xml24
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/password.html35
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/rsd.xml16
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/sitemap.html70
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/skeleton.html507
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tag/nodetype_list.html1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tag_list.html24
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes.html15
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes_link.html3
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes_tree.html43
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/authors.html15
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/breadcrumbs.html9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/calendar.html17
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/dummy.html1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/featured_nodetypes.html12
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/metatypes.html16
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/nodetypes.html16
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/pagination.html59
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/popular_nodetypes.html16
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/random_nodetypes.html12
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_comments.html20
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_linkbacks.html21
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_nodetypes.html20
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/similar_nodetypes.html12
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/slider_nodetypes.html27
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/tag_cloud.html13
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/wlwmanifest.xml63
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudio/wxr.xml125
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudiodashboard/dashboard.html40
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioattributeform.html30
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioattributetypeform.html28
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiocomplementform.html28
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiointersectionform.html28
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiometatypeform.html29
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioobjecttypeform.html28
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioprocesstypeform.html26
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiorelationform.html27
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiorelationtypeform.html28
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiosystemtypeform.html28
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiounionform.html27
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/index.html6
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/activate.html18
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/activation_email.txt6
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/activation_email_subject.txt1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/login.html14
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/logout.html7
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/password_change_done.html6
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/password_change_form.html10
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_complete.html10
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_confirm.html20
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_done.html6
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_email.html5
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_form.html10
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/registration_complete.html6
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/registration/registration_form.html10
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templates/skeleton.html73
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templatetags/__init__.py0
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templatetags/gstudio_admin_tags.py59
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templatetags/gstudio_tags.py352
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templatetags/zbreadcrumbs.py167
-rw-r--r--build/lib.linux-i686-2.6/gstudio/templatetags/zcalendar.py128
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/__init__.py121
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/admin.py151
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/comparison.py115
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/custom_spam_checker.py75
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/custom_url_shortener.py75
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/custom_views_detail_urls.py108
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/feeds.py360
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/managers.py313
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/metatype.py116
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/metaweblog.py360
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/moderator.py169
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/nodetype.py348
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/ping.py187
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/pingback.py253
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/quick_nodetype.py103
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/signals.py137
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/sitemaps.py128
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/spam_checker.py40
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/templatetags.py590
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/url_shortener.py112
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/urls.py37
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/utils.py90
-rw-r--r--build/lib.linux-i686-2.6/gstudio/tests/views.py363
-rw-r--r--build/lib.linux-i686-2.6/gstudio/testsettings.py104
-rw-r--r--build/lib.linux-i686-2.6/gstudio/url_shortener/__init__.py24
-rw-r--r--build/lib.linux-i686-2.6/gstudio/url_shortener/backends/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/url_shortener/backends/bitly.py67
-rw-r--r--build/lib.linux-i686-2.6/gstudio/url_shortener/backends/default.py58
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/__init__.py40
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/add.py52
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/ajaxurls.py26
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/authors.py31
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/capabilities.py51
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/dashboard.py75
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/discussions.py26
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/feeds.py66
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/graphs.py31
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/metatypes.py37
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/nodetypes.py70
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/quick_nodetype.py25
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/search.py24
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/sitemap.py9
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/tags.py29
-rw-r--r--build/lib.linux-i686-2.6/gstudio/urls/trackback.py25
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/add.py219
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/ajaxviews.py47
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/authors.py45
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/channels.py28
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/decorators.py152
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/graphs.py118
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/metatypes.py47
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/nodetypes.py97
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/quick_nodetype.py119
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/search.py93
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/sitemap.py78
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/tags.py98
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/trackback.py110
-rw-r--r--build/lib.linux-i686-2.6/gstudio/views/userdashboard.py78
-rw-r--r--build/lib.linux-i686-2.6/gstudio/xmlrpc/__init__.py81
-rw-r--r--build/lib.linux-i686-2.6/gstudio/xmlrpc/metaweblog.py344
-rw-r--r--build/lib.linux-i686-2.6/gstudio/xmlrpc/pingback.py140
-rw-r--r--build/lib.linux-i686-2.6/objectapp/__init__.py55
-rw-r--r--build/lib.linux-i686-2.6/objectapp/admin/__init__.py79
-rw-r--r--build/lib.linux-i686-2.6/objectapp/admin/forms.py153
-rw-r--r--build/lib.linux-i686-2.6/objectapp/admin/gbobject.py379
-rw-r--r--build/lib.linux-i686-2.6/objectapp/admin/process.py373
-rw-r--r--build/lib.linux-i686-2.6/objectapp/admin/system.py356
-rw-r--r--build/lib.linux-i686-2.6/objectapp/admin/widgets.py171
-rw-r--r--build/lib.linux-i686-2.6/objectapp/comparison.py93
-rw-r--r--build/lib.linux-i686-2.6/objectapp/context_processors.py7
-rw-r--r--build/lib.linux-i686-2.6/objectapp/feeds.py398
-rw-r--r--build/lib.linux-i686-2.6/objectapp/fixtures/helloworld.json129
-rw-r--r--build/lib.linux-i686-2.6/objectapp/forms.py35
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/de/LC_MESSAGES/django.mobin0 -> 15661 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/de/LC_MESSAGES/django.po1200
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/es/LC_MESSAGES/django.mobin0 -> 17490 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/es/LC_MESSAGES/django.po1199
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/fr/LC_MESSAGES/django.mobin0 -> 17740 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/fr/LC_MESSAGES/django.po1199
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/hu/LC_MESSAGES/django.mobin0 -> 15892 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/hu/LC_MESSAGES/django.po1194
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/it/LC_MESSAGES/django.mobin0 -> 14684 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/it/LC_MESSAGES/django.po1196
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/nl/LC_MESSAGES/django.mobin0 -> 17072 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/nl/LC_MESSAGES/django.po1195
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/pl/LC_MESSAGES/django.mobin0 -> 2088 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/pl/LC_MESSAGES/django.po1194
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/pt_BR/LC_MESSAGES/django.mobin0 -> 16686 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/pt_BR/LC_MESSAGES/django.po1195
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/ru/LC_MESSAGES/django.mobin0 -> 19225 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/ru/LC_MESSAGES/django.po1200
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/zh_CN/LC_MESSAGES/django.mobin0 -> 5431 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/locale/zh_CN/LC_MESSAGES/django.po1182
-rw-r--r--build/lib.linux-i686-2.6/objectapp/management/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/management/commands/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/management/commands/blogger2objectapp.py319
-rw-r--r--build/lib.linux-i686-2.6/objectapp/management/commands/feed2objectapp.py209
-rw-r--r--build/lib.linux-i686-2.6/objectapp/management/commands/objectapp2wp.py96
-rw-r--r--build/lib.linux-i686-2.6/objectapp/management/commands/spam_cleanup.py72
-rw-r--r--build/lib.linux-i686-2.6/objectapp/management/commands/wp2objectapp.py406
-rw-r--r--build/lib.linux-i686-2.6/objectapp/managers.py146
-rw-r--r--build/lib.linux-i686-2.6/objectapp/migrations/0001_initial.py459
-rw-r--r--build/lib.linux-i686-2.6/objectapp/migrations/__init__.py0
-rw-r--r--build/lib.linux-i686-2.6/objectapp/models.py754
-rw-r--r--build/lib.linux-i686-2.6/objectapp/moderator.py194
-rw-r--r--build/lib.linux-i686-2.6/objectapp/ping.py231
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/admin.py78
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/cms_app.py63
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/cms_plugins.py182
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/menu.py180
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/migrations/0001_initial.py151
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/migrations/0002_auto__add_field_latestgbobjectsplugin_template_to_render__add_field_sele.py132
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/migrations/0003_auto__del_field_latestgbobjectsplugin_objecttype__del_field_latestgbobjectsp.py172
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/migrations/0004_auto__add_field_latestgbobjectsplugin_subobjecttypes.py142
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/migrations/0005_auto__add_randomgbobjectsplugin.py151
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/migrations/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/models.py152
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/placeholder.py61
-rw-r--r--build/lib.linux-i686-2.6/objectapp/plugins/settings.py74
-rw-r--r--build/lib.linux-i686-2.6/objectapp/search.py180
-rw-r--r--build/lib.linux-i686-2.6/objectapp/settings.py135
-rw-r--r--build/lib.linux-i686-2.6/objectapp/signals.py102
-rw-r--r--build/lib.linux-i686-2.6/objectapp/sitemaps.py183
-rw-r--r--build/lib.linux-i686-2.6/objectapp/spam_checker/__init__.py82
-rw-r--r--build/lib.linux-i686-2.6/objectapp/spam_checker/backends/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/spam_checker/backends/all_is_spam.py53
-rw-r--r--build/lib.linux-i686-2.6/objectapp/spam_checker/backends/automattic.py106
-rw-r--r--build/lib.linux-i686-2.6/objectapp/spam_checker/backends/mollom.py106
-rw-r--r--build/lib.linux-i686-2.6/objectapp/spam_checker/backends/typepad.py94
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/config.rb9
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/dashboard_objectapp.css32
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/ie.css39
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/jquery.autocomplete.css48
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/print.css33
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/screen.css569
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/screen1.css505
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/slider.css12
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_base.sass32
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_calendar.sass15
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_gbobject.sass35
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_paginator.sass19
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_tag-cloud.sass21
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/dashboard_objectapp.sass66
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/ie.sass3
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/print.sass22
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/screen.sass160
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/slider.sass74
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/structures.css662
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/css/wymeditor_styles.css45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/background.gifbin0 -> 196 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/bullet.pngbin0 -> 289 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/comments.pngbin0 -> 426 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/community.pngbin0 -> 4394 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/favicon.icobin0 -> 1150 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/favicon.pngbin0 -> 660 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/grid.pngbin0 -> 206 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/help.pngbin0 -> 764 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/logo.pngbin0 -> 4864 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/manage.pngbin0 -> 228 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/objecttype.pngbin0 -> 438 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/plugin.pngbin0 -> 3530 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/preview.pngbin0 -> 470 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/rss.pngbin0 -> 561 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/shorturl.pngbin0 -> 343 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/sitemap.pngbin0 -> 3215 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/tags.pngbin0 -> 667 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/trans.pngbin0 -> 115 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/comments.pngbin0 -> 1442 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/objectapp.pngbin0 -> 660 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/watermark.pngbin0 -> 12376 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.autocomplete.js13
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.bgiframe.js10
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.js167
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.masonry.js12
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.ui.js68
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/jquery.markitup.js574
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/bold.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/clean.pngbin0 -> 667 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h1.pngbin0 -> 276 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h2.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h3.pngbin0 -> 306 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h4.pngbin0 -> 293 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h5.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h6.pngbin0 -> 310 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/image.pngbin0 -> 516 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/italic.pngbin0 -> 223 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/link.pngbin0 -> 343 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-bullet.pngbin0 -> 344 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-item.pngbin0 -> 248 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-numeric.pngbin0 -> 357 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/paragraph.pngbin0 -> 361 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/picture.pngbin0 -> 606 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/preview.pngbin0 -> 537 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/stroke.pngbin0 -> 269 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/set.js38
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/style.css59
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/bold.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/code.pngbin0 -> 859 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h1.pngbin0 -> 276 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h2.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h3.pngbin0 -> 306 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h4.pngbin0 -> 293 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h5.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h6.pngbin0 -> 310 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/italic.pngbin0 -> 223 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/link.pngbin0 -> 343 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/list-bullet.pngbin0 -> 344 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/list-numeric.pngbin0 -> 357 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/picture.pngbin0 -> 606 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/preview.pngbin0 -> 537 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/quotes.pngbin0 -> 743 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/set.js49
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/style.css54
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/bold.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/code.pngbin0 -> 859 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h1.pngbin0 -> 276 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h2.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h3.pngbin0 -> 306 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h4.pngbin0 -> 293 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h5.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/italic.pngbin0 -> 223 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/link.pngbin0 -> 343 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/list-bullet.pngbin0 -> 344 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/list-numeric.pngbin0 -> 357 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/picture.pngbin0 -> 606 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/preview.pngbin0 -> 537 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/quotes.pngbin0 -> 743 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/set.js48
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/style.css53
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/bold.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/code.pngbin0 -> 859 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h1.pngbin0 -> 276 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h2.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h3.pngbin0 -> 306 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h4.pngbin0 -> 293 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h5.pngbin0 -> 304 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h6.pngbin0 -> 310 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/italic.pngbin0 -> 223 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/link.pngbin0 -> 343 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/list-bullet.pngbin0 -> 344 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/list-numeric.pngbin0 -> 357 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/paragraph.pngbin0 -> 361 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/picture.pngbin0 -> 606 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/preview.pngbin0 -> 537 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/quotes.pngbin0 -> 743 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/stroke.pngbin0 -> 269 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/set.js37
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/style.css60
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/handle.pngbin0 -> 258 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/menu.pngbin0 -> 27151 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/submenu.pngbin0 -> 240 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/style.css128
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/templates/preview.css5
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/templates/preview.html11
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/mptt_m2m_selectbox.js133
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-blockquote.pngbin0 -> 196 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h1.pngbin0 -> 166 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h2.pngbin0 -> 172 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h3.pngbin0 -> 170 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h4.pngbin0 -> 172 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h5.pngbin0 -> 172 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h6.pngbin0 -> 171 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-p.pngbin0 -> 3607 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-pre.pngbin0 -> 177 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/wymiframe.css90
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/wymiframe.html26
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.js4688
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.min.js1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.pack.js1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/bg.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/ca.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/cs.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/cy.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/de.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/en.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/es.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fa.js46
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fi.js44
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fr.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/gl.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/he.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/hr.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/hu.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/it.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nb.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nl.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nn.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pl.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pt-br.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pt.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/ru.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/sv.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/tr.js45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/zh_cn.js47
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/embed/jquery.wymeditor.embed.js52
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/fullscreen/icon_fullscreen.gifbin0 -> 509 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js127
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js57
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js91
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/resizable/readme.txt124
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/README19
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js82
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/tidy.php36
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/wand.pngbin0 -> 715 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/icons.pngbin0 -> 3651 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/skin.css134
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/skin.js35
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/icons.pngbin0 -> 3651 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/skin.css133
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/skin.js40
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/icons.pngbin0 -> 7236 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/skin.css136
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/skin.js42
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.header.gifbin0 -> 781 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.selector.silver.gifbin0 -> 1621 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.wymeditor.pngbin0 -> 498 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/icons.silver.gifbin0 -> 15382 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/skin.css131
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/skin.js30
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/COPYING674
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/README27
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.header.gifbin0 -> 781 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.selector.silver.gifbin0 -> 1621 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.wymeditor.pngbin0 -> 498 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/icons.silver.gifbin0 -> 15382 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/skin.css297
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/skin.js61
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/icons.pngbin0 -> 3651 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/skin.css134
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/skin.js39
-rw-r--r--build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/wymeditor_icon.pngbin0 -> 1028 bytes
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/404.html46
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/500.html46
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/app_index.html41
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/autocomplete_tags.js11
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/markitup.js3
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/tinymce_textareas.js23
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/wymeditor.js10
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_content_stats.html38
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_draft_gbobjects.html37
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_recent_comments.html45
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_recent_linkbacks.html31
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/base.html6
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/content_stats.html12
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/draft_gbobjects.html12
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/quickpost.html40
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/recent_comments.html12
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/recent_linkbacks.html12
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/comments/comment_authors_email.txt6
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/comments/comment_notification_email.txt14
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/comments/comment_reply_email.txt6
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp/gbobject/form.html22
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp/gbobject/posted.html13
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp_gbobject_preview.html37
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/feeds/comment_description.html1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/feeds/comment_title.html2
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/feeds/discussion_description.html1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/feeds/discussion_title.html2
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/feeds/gbobject_description.html1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/feeds/gbobject_title.html1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/feeds/pingback_description.html1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/feeds/pingback_title.html2
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/feeds/trackback_description.html1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/feeds/trackback_title.html2
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/_gbobject_detail.html149
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/_header.html56
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/_narrative_detail.html117
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/_subtype_detail.html1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/author/gbobject_list.html1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/author_list.html27
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/base.html109
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/gbobject_detail.html8
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/gbobject_list.html12
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/random_gbobjects.html4
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive.html30
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_day.html23
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_month.html31
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_year.html21
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_detail.html242
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_list.html73
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_search.html49
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_trackback.xml9
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/login.html40
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/objecttype/gbobject_list.html1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/objecttype_list.html25
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/opensearch.xml24
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/password.html35
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/rsd.xml16
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/sitemap.html70
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/skeleton.html516
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tag/gbobject_list.html1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tag_list.html24
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects.html15
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects_link.html3
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects_tree.html43
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/authors.html16
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/breadcrumbs.html7
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/calendar.html17
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/dummy.html1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/featured_gbobjects.html12
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/gbobjects.html16
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/objecttypes.html16
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/pagination.html59
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/popular_gbobjects.html16
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/random_gbobjects.html12
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_comments.html20
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_gbobjects.html12
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_linkbacks.html21
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/similar_gbobjects.html12
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/slider_gbobjects.html27
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/tag_cloud.html13
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/wlwmanifest.xml63
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectapp/wxr.xml125
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectappforms/gbobjectform.html29
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectappforms/processform.html29
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templates/objectappforms/systemform.html29
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templatetags/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templatetags/objectapp_admin_tags.py89
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templatetags/objectapp_tags.py375
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templatetags/zbreadcrumbs.py147
-rw-r--r--build/lib.linux-i686-2.6/objectapp/templatetags/zcalendar.py109
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/__init__.py104
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/admin.py133
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/comparison.py50
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/custom_spam_checker.py10
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/custom_url_shortener.py57
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/custom_views_detail_urls.py91
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/feeds.py343
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/gbobject.py331
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/managers.py296
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/metaweblog.py343
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/moderator.py186
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/objecttype.py116
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/ping.py187
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/pingback.py253
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/quick_gbobject.py120
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/signals.py154
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/sitemaps.py145
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/spam_checker.py104
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/templatetags.py590
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/url_shortener.py112
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/urls.py85
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/utils.py90
-rw-r--r--build/lib.linux-i686-2.6/objectapp/tests/views.py363
-rw-r--r--build/lib.linux-i686-2.6/objectapp/testsettings.py103
-rw-r--r--build/lib.linux-i686-2.6/objectapp/url_shortener/__init__.py88
-rw-r--r--build/lib.linux-i686-2.6/objectapp/url_shortener/backends/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/url_shortener/backends/bitly.py84
-rw-r--r--build/lib.linux-i686-2.6/objectapp/url_shortener/backends/default.py75
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/__init__.py84
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/add.py78
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/authors.py78
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/capabilities.py98
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/discussions.py73
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/feeds.py113
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/gbobjects.py114
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/objecttypes.py84
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/quick_gbobject.py72
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/search.py71
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/sitemap.py73
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/tags.py76
-rw-r--r--build/lib.linux-i686-2.6/objectapp/urls/trackback.py72
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/__init__.py1
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/add.py126
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/authors.py92
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/channels.py58
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/decorators.py151
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/gbobjects.py99
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/objecttypes.py94
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/quick_gbobject.py118
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/search.py91
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/sitemap.py77
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/tags.py97
-rw-r--r--build/lib.linux-i686-2.6/objectapp/views/trackback.py109
-rw-r--r--build/lib.linux-i686-2.6/objectapp/xmlrpc/__init__.py81
-rw-r--r--build/lib.linux-i686-2.6/objectapp/xmlrpc/metaweblog.py344
-rw-r--r--build/lib.linux-i686-2.6/objectapp/xmlrpc/pingback.py187
-rw-r--r--demo/__init__.pycbin0 -> 168 bytes
-rw-r--r--demo/dashboard.pycbin0 -> 5674 bytes
-rw-r--r--demo/demo.dbbin436224 -> 415744 bytes
-rw-r--r--demo/graphviz/__init__.pycbin0 -> 131 bytes
-rw-r--r--demo/graphviz/admin.pycbin0 -> 1802 bytes
-rw-r--r--demo/graphviz/management/__init__.pycbin0 -> 142 bytes
-rw-r--r--demo/graphviz/models.pycbin0 -> 5579 bytes
-rw-r--r--demo/grappelli/__init__.pycbin0 -> 160 bytes
-rw-r--r--demo/grappelli/dashboard/__init__.pycbin0 -> 248 bytes
-rw-r--r--demo/grappelli/dashboard/dashboards.pycbin0 -> 6983 bytes
-rw-r--r--demo/grappelli/dashboard/management/__init__.pycbin0 -> 153 bytes
-rw-r--r--demo/grappelli/dashboard/modules.pycbin0 -> 14155 bytes
-rw-r--r--demo/grappelli/dashboard/registry.pycbin0 -> 2174 bytes
-rw-r--r--demo/grappelli/dashboard/templatetags/__init__.pycbin0 -> 155 bytes
-rw-r--r--demo/grappelli/dashboard/templatetags/grp_dashboard_tags.pycbin0 -> 2444 bytes
-rw-r--r--demo/grappelli/dashboard/utils.pycbin0 -> 5848 bytes
-rw-r--r--demo/grappelli/models.pycbin0 -> 130 bytes
-rw-r--r--demo/grappelli/settings.pycbin0 -> 418 bytes
-rw-r--r--demo/grappelli/templatetags/__init__.pycbin0 -> 145 bytes
-rw-r--r--demo/grappelli/templatetags/grp_tags.pycbin0 -> 7848 bytes
-rw-r--r--demo/grappelli/urls.pycbin0 -> 633 bytes
-rw-r--r--demo/grappelli/views/__init__.pycbin0 -> 138 bytes
-rw-r--r--demo/grappelli/views/related.pycbin0 -> 4554 bytes
-rw-r--r--demo/settings.pycbin0 -> 4506 bytes
-rw-r--r--demo/urls.pycbin0 -> 2225 bytes
-rw-r--r--demo/views.pycbin0 -> 860 bytes
-rw-r--r--dist/django_gstudio-0.3.dev-py2.6.eggbin0 -> 2423354 bytes
-rw-r--r--gstudio/__init__.pycbin0 -> 378 bytes
-rw-r--r--gstudio/admin/objecttype.py1
-rw-r--r--gstudio/managers.py48
-rw-r--r--gstudio/models.py51
-rw-r--r--gstudio/search.py10
-rw-r--r--gstudio/templates/gstudio/base.html4
-rw-r--r--objectapp/admin/gbobject.py1
-rw-r--r--objectapp/models.py15
-rw-r--r--objectapp/templates/objectapp/base.html2
-rw-r--r--objectapp/urls/search.py2
-rw-r--r--objectapp/views/search.py14
1001 files changed, 133009 insertions, 49 deletions
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/__init__.py b/build/lib.linux-i686-2.6/demo/grappelli/__init__.py
new file mode 100644
index 0000000..e033499
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/__init__.py
@@ -0,0 +1 @@
+VERSION = '2.3.5' \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/dashboard/__init__.py b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/__init__.py
new file mode 100644
index 0000000..a88a662
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/__init__.py
@@ -0,0 +1,2 @@
+from grappelli.dashboard.dashboards import *
+from grappelli.dashboard.registry import *
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/dashboard/dashboards.py b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/dashboards.py
new file mode 100644
index 0000000..8c2952f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/dashboards.py
@@ -0,0 +1,257 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""
+Module where admin tools dashboard classes are defined.
+"""
+
+from django.template.defaultfilters import slugify
+from django.utils.importlib import import_module
+from django.utils.translation import ugettext_lazy as _
+from django.core.urlresolvers import reverse
+from django.contrib.contenttypes.models import ContentType
+
+from grappelli.dashboard import modules
+from grappelli.dashboard.utils import get_admin_site_name
+from django import forms
+
+class Dashboard(object):
+ """
+ Base class for dashboards.
+ The Dashboard class is a simple python list that has three additional
+ properties:
+
+ ``title``
+ The dashboard title, by default, it is displayed above the dashboard
+ in a ``h2`` tag. Default value: 'Dashboard'.
+
+ ``template``
+ The template to use to render the dashboard.
+ Default value: 'admin_tools/dashboard/dashboard.html'
+
+ ``columns``
+ An integer that represents the number of columns for the dashboard.
+ Default value: 2.
+
+ If you want to customize the look of your dashboard and it's modules, you
+ can declare css stylesheets and/or javascript files to include when
+ rendering the dashboard (these files should be placed in your
+ media path), for example::
+
+ from admin_tools.dashboard import Dashboard
+
+ class MyDashboard(Dashboard):
+ class Media:
+ css = {
+ 'all': (
+ 'css/mydashboard.css',
+ 'css/mystyles.css',
+ ),
+ }
+ js = (
+ 'js/mydashboard.js',
+ 'js/myscript.js',
+ )
+
+ Here's an example of a custom dashboard::
+
+ from django.core.urlresolvers import reverse
+ from django.utils.translation import ugettext_lazy as _
+ from admin_tools.dashboard import modules, Dashboard
+
+ class MyDashboard(Dashboard):
+
+ # we want a 3 columns layout
+ columns = 3
+
+ def __init__(self, **kwargs):
+
+ # append an app list module for "Applications"
+ self.children.append(modules.AppList(
+ title=_('Applications'),
+ exclude=('django.contrib.*',),
+ ))
+
+ # append an app list module for "Administration"
+ self.children.append(modules.AppList(
+ title=_('Administration'),
+ models=('django.contrib.*',),
+ ))
+
+ # append a recent actions module
+ self.children.append(modules.RecentActions(
+ title=_('Recent Actions'),
+ limit=5
+ ))
+
+ """
+
+ # Using Django's Media meta class
+ __metaclass__ = forms.MediaDefiningClass
+ def _media(self):
+ return forms.Media()
+ media = property(_media)
+
+ title = _('Dashboard')
+ template = 'grappelli/dashboard/dashboard.html'
+ columns = 2
+ children = None
+
+ def __init__(self, **kwargs):
+ for key in kwargs:
+ if hasattr(self.__class__, key):
+ setattr(self, key, kwargs[key])
+ self.children = self.children or []
+
+ def init_with_context(self, context):
+ """
+ Sometimes you may need to access context or request variables to build
+ your dashboard, this is what the ``init_with_context()`` method is for.
+ This method is called just before the display with a
+ ``django.template.RequestContext`` as unique argument, so you can
+ access to all context variables and to the ``django.http.HttpRequest``.
+ """
+ pass
+
+ def get_id(self):
+ """
+ Internal method used to distinguish different dashboards in js code.
+ """
+ return 'dashboard'
+
+
+class DefaultIndexDashboard(Dashboard):
+ """
+ The default dashboard displayed on the admin index page.
+ To change the default dashboard you'll have to type the following from the
+ commandline in your project root directory::
+
+ python manage.py customdashboard
+
+ And then set the `GRAPPELLI_INDEX_DASHBOARD`` settings variable to
+ point to your custom index dashboard class.
+ """
+
+ def init_with_context(self, context):
+ site_name = get_admin_site_name(context)
+ # append a link list module for "quick links"
+ self.children.append(modules.LinkList(
+ _('Quick links'),
+ layout='inline',
+ draggable=False,
+ deletable=False,
+ collapsible=False,
+ children=[
+ [_('Return to site'), '/'],
+ [_('Change password'),
+ reverse('%s:password_change' % site_name)],
+ [_('Log out'), reverse('%s:logout' % site_name)],
+ ]
+ ))
+
+ # append an app list module for "Applications"
+ self.children.append(modules.AppList(
+ _('Applications'),
+ exclude=('django.contrib.*',),
+ ))
+
+ # append an app list module for "Administration"
+ self.children.append(modules.AppList(
+ _('Administration'),
+ models=('django.contrib.*',),
+ ))
+
+ # append a recent actions module
+ self.children.append(modules.RecentActions(_('Recent Actions'), 5))
+
+ # append a feed module
+ self.children.append(modules.Feed(
+ _('Latest Django News'),
+ feed_url='http://www.djangoproject.com/rss/weblog/',
+ limit=5
+ ))
+
+ # append another link list module for "support".
+ self.children.append(modules.LinkList(
+ _('Support'),
+ children=[
+ {
+ 'title': _('Django documentation'),
+ 'url': 'http://docs.djangoproject.com/',
+ 'external': True,
+ },
+ {
+ 'title': _('Django "django-users" mailing list'),
+ 'url': 'http://groups.google.com/group/django-users',
+ 'external': True,
+ },
+ {
+ 'title': _('Django irc channel'),
+ 'url': 'irc://irc.freenode.net/django',
+ 'external': True,
+ },
+ ]
+ ))
+
+
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/__init__.py b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/__init__.py
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/commands/__init__.py b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/commands/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/commands/__init__.py
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/commands/customdashboard.py b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/commands/customdashboard.py
new file mode 100644
index 0000000..d22eba9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/management/commands/customdashboard.py
@@ -0,0 +1,93 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+# coding: utf-8
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#-----------------------------------------------------------------------------
+
+# PYTHON IMPORTS
+import os
+
+# DJANGO IMPORTS
+from django.core.management.base import BaseCommand, CommandError
+from django.template.loader import render_to_string
+
+DEFAULT_FILE = 'dashboard.py'
+
+
+class Command(BaseCommand):
+ help = ('Creates a template file containing the base code to get you '
+ 'started with your custom dashboard.')
+ args = '[file]'
+ label = 'application name'
+
+ def handle(self, file=None, **options):
+ context = {}
+ context['project'] = os.path.basename(os.getcwd())
+ tpl = ['dashboard/dashboard.txt', 'grappelli/dashboard/dashboard.txt']
+ dst = file is not None and file or DEFAULT_FILE
+ if os.path.exists(dst):
+ raise CommandError('file "%s" already exists' % dst)
+ context['file'] = os.path.basename(dst).split('.')[0]
+ open(dst, 'w').write(render_to_string(tpl, context))
+ print '"%s" written.' % os.path.join(dst)
+
+
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/dashboard/modules.py b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/modules.py
new file mode 100644
index 0000000..466cfbd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/modules.py
@@ -0,0 +1,456 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""
+Module where grappelli dashboard modules classes are defined.
+"""
+
+# DJANGO IMPORTS
+from django.utils.text import capfirst
+from django.core.urlresolvers import reverse
+from django.contrib.contenttypes.models import ContentType
+from django.utils.translation import ugettext_lazy as _
+from django.utils.itercompat import is_iterable
+
+# GRAPPELL IMPORTS
+from grappelli.dashboard.utils import AppListElementMixin
+
+
+class DashboardModule(object):
+ """
+ Base class for all dashboard modules.
+ Dashboard modules have the following properties:
+
+ ``collapsible``
+ Boolean that determines whether the module is collapsible, this
+ allows users to show/hide module content. Default: ``True``.
+
+ ``column``
+ Integer that corresponds to the column.
+ Default: None.
+
+ ``title``
+ String that contains the module title, make sure you use the django
+ gettext functions if your application is multilingual.
+ Default value: ''.
+
+ ``title_url``
+ String that contains the module title URL. If given the module
+ title will be a link to this URL. Default value: ``None``.
+
+ ``css_classes``
+ A list of css classes to be added to the module ``div`` class
+ attribute. Default value: ``None``.
+
+ ``pre_content``
+ Text or HTML content to display above the module content.
+ Default value: ``None``.
+
+ ``content``
+ The module text or HTML content. Default value: ``None``.
+
+ ``post_content``
+ Text or HTML content to display under the module content.
+ Default value: ``None``.
+
+ ``template``
+ The template to use to render the module.
+ Default value: 'grappelli/dashboard/module.html'.
+ """
+
+ template = 'grappelli/dashboard/module.html'
+ collapsible = True
+ column = None
+ show_title = True
+ title = ''
+ title_url = None
+ css_classes = None
+ pre_content = None
+ post_content = None
+ children = None
+
+ def __init__(self, title=None, **kwargs):
+ if title is not None:
+ self.title = title
+ for key in kwargs:
+ if hasattr(self.__class__, key):
+ setattr(self, key, kwargs[key])
+ self.children = self.children or []
+ self.css_classes = self.css_classes or []
+ # boolean flag to ensure that the module is initialized only once
+ self._initialized = False
+
+ def init_with_context(self, context):
+ """
+ Like for the :class:`~grappelli.dashboard.Dashboard` class, dashboard
+ modules have a ``init_with_context`` method that is called with a
+ ``django.template.RequestContext`` instance as unique argument.
+
+ This gives you enough flexibility to build complex modules, for
+ example, let's build a "history" dashboard module, that will list the
+ last ten visited pages::
+
+ from grappelli.dashboard import modules
+
+ class HistoryDashboardModule(modules.LinkList):
+ title = 'History'
+
+ def init_with_context(self, context):
+ request = context['request']
+ # we use sessions to store the visited pages stack
+ history = request.session.get('history', [])
+ for item in history:
+ self.children.append(item)
+ # add the current page to the history
+ history.insert(0, {
+ 'title': context['title'],
+ 'url': request.META['PATH_INFO']
+ })
+ if len(history) > 10:
+ history = history[:10]
+ request.session['history'] = history
+
+ """
+ pass
+
+ def is_empty(self):
+ """
+ Return True if the module has no content and False otherwise.
+ """
+
+ return self.pre_content is None and \
+ self.post_content is None and \
+ len(self.children) == 0
+
+ def render_css_classes(self):
+ """
+ Return a string containing the css classes for the module.
+ """
+
+ ret = ['dashboard-module']
+ if self.collapsible:
+ ret.append('collapsible')
+ ret += self.css_classes
+ return ' '.join(ret)
+
+
+class Group(DashboardModule):
+ """
+ Represents a group of modules.
+
+ Here's an example of modules group::
+
+ from grappelli.dashboard import modules, Dashboard
+
+ class MyDashboard(Dashboard):
+ def __init__(self, **kwargs):
+ Dashboard.__init__(self, **kwargs)
+ self.children.append(modules.Group(
+ title="My group",
+ children=[
+ modules.AppList(
+ title='Administration',
+ models=('django.contrib.*',)
+ ),
+ modules.AppList(
+ title='Applications',
+ exclude=('django.contrib.*',)
+ )
+ ]
+ ))
+
+ """
+
+ template = 'grappelli/dashboard/modules/group.html'
+
+ def init_with_context(self, context):
+ if self._initialized:
+ return
+ for module in self.children:
+ module.init_with_context(context)
+ self._initialized = True
+
+ def is_empty(self):
+ """
+ A group of modules is considered empty if it has no children or if
+ all its children are empty.
+ """
+
+ if super(Group, self).is_empty():
+ return True
+ for child in self.children:
+ if not child.is_empty():
+ return False
+ return True
+
+
+class LinkList(DashboardModule):
+ """
+ A module that displays a list of links.
+ """
+
+ title = _('Links')
+ template = 'grappelli/dashboard/modules/link_list.html'
+
+ def init_with_context(self, context):
+ if self._initialized:
+ return
+ new_children = []
+ for link in self.children:
+ if isinstance(link, (tuple, list,)):
+ link_dict = {'title': link[0], 'url': link[1]}
+ if len(link) >= 3:
+ link_dict['external'] = link[2]
+ if len(link) >= 4:
+ link_dict['description'] = link[3]
+ new_children.append(link_dict)
+ else:
+ new_children.append(link)
+ self.children = new_children
+ self._initialized = True
+
+
+class AppList(DashboardModule, AppListElementMixin):
+ """
+ Module that lists installed apps and their models.
+ """
+
+ title = _('Applications')
+ template = 'grappelli/dashboard/modules/app_list.html'
+ models = None
+ exclude = None
+
+ def __init__(self, title=None, **kwargs):
+ self.models = list(kwargs.pop('models', []))
+ self.exclude = list(kwargs.pop('exclude', []))
+ super(AppList, self).__init__(title, **kwargs)
+
+ def init_with_context(self, context):
+ if self._initialized:
+ return
+ items = self._visible_models(context['request'])
+ apps = {}
+ for model, perms in items:
+ app_label = model._meta.app_label
+ if app_label not in apps:
+ apps[app_label] = {
+ 'title': capfirst(app_label.title()),
+ 'url': self._get_admin_app_list_url(model, context),
+ 'models': []
+ }
+ model_dict = {}
+ model_dict['title'] = capfirst(model._meta.verbose_name_plural)
+ if perms['change']:
+ model_dict['change_url'] = self._get_admin_change_url(model, context)
+ if perms['add']:
+ model_dict['add_url'] = self._get_admin_add_url(model, context)
+ apps[app_label]['models'].append(model_dict)
+
+ apps_sorted = apps.keys()
+ apps_sorted.sort()
+ for app in apps_sorted:
+ # sort model list alphabetically
+ apps[app]['models'].sort(lambda x, y: cmp(x['title'], y['title']))
+ self.children.append(apps[app])
+ self._initialized = True
+
+
+class ModelList(DashboardModule, AppListElementMixin):
+ """
+ Module that lists a set of models.
+ """
+
+ template = 'grappelli/dashboard/modules/model_list.html'
+ models = None
+ exclude = None
+
+ def __init__(self, title=None, models=None, exclude=None, **kwargs):
+ self.models = list(models or [])
+ self.exclude = list(exclude or [])
+ super(ModelList, self).__init__(title, **kwargs)
+
+ def init_with_context(self, context):
+ if self._initialized:
+ return
+ items = self._visible_models(context['request'])
+ if not items:
+ return
+ for model, perms in items:
+ model_dict = {}
+ model_dict['title'] = capfirst(model._meta.verbose_name_plural)
+ if perms['change']:
+ model_dict['change_url'] = self._get_admin_change_url(model, context)
+ if perms['add']:
+ model_dict['add_url'] = self._get_admin_add_url(model, context)
+ self.children.append(model_dict)
+ self._initialized = True
+
+
+class RecentActions(DashboardModule):
+ """
+ Module that lists the recent actions for the current user.
+ """
+
+ title = _('Recent Actions')
+ template = 'grappelli/dashboard/modules/recent_actions.html'
+ limit = 10
+ include_list = None
+ exclude_list = None
+
+ def __init__(self, title=None, limit=10, include_list=None,
+ exclude_list=None, **kwargs):
+ self.include_list = include_list or []
+ self.exclude_list = exclude_list or []
+ kwargs.update({'limit': limit})
+ super(RecentActions, self).__init__(title, **kwargs)
+
+ def init_with_context(self, context):
+ if self._initialized:
+ return
+ from django.db.models import Q
+ from django.contrib.admin.models import LogEntry
+
+ request = context['request']
+
+ def get_qset(list):
+ qset = None
+ for contenttype in list:
+ if isinstance(contenttype, ContentType):
+ current_qset = Q(content_type__id=contenttype.id)
+ else:
+ try:
+ app_label, model = contenttype.split('.')
+ except:
+ raise ValueError('Invalid contenttype: "%s"' % contenttype)
+ current_qset = Q(
+ content_type__app_label=app_label,
+ content_type__model=model
+ )
+ if qset is None:
+ qset = current_qset
+ else:
+ qset = qset | current_qset
+ return qset
+
+ if request.user is None:
+ qs = LogEntry.objects.all()
+ else:
+ qs = LogEntry.objects.filter(user__id__exact=request.user.id)
+
+ if self.include_list:
+ qs = qs.filter(get_qset(self.include_list))
+ if self.exclude_list:
+ qs = qs.exclude(get_qset(self.exclude_list))
+
+ self.children = qs.select_related('content_type', 'user')[:self.limit]
+ if not len(self.children):
+ self.pre_content = _('No recent actions.')
+ self._initialized = True
+
+
+class Feed(DashboardModule):
+ """
+ Class that represents a feed dashboard module.
+ """
+
+ title = _('RSS Feed')
+ template = 'grappelli/dashboard/modules/feed.html'
+ feed_url = None
+ limit = None
+
+ def __init__(self, title=None, feed_url=None, limit=None, **kwargs):
+ kwargs.update({'feed_url': feed_url, 'limit': limit})
+ super(Feed, self).__init__(title, **kwargs)
+
+ def init_with_context(self, context):
+ if self._initialized:
+ return
+ import datetime
+ if self.feed_url is None:
+ raise ValueError('You must provide a valid feed URL')
+ try:
+ import feedparser
+ except ImportError:
+ self.children.append({
+ 'title': ('You must install the FeedParser python module'),
+ 'warning': True,
+ })
+ return
+
+ feed = feedparser.parse(self.feed_url)
+ if self.limit is not None:
+ entries = feed['entries'][:self.limit]
+ else:
+ entries = feed['entries']
+ for entry in entries:
+ entry.url = entry.link
+ try:
+ entry.date = datetime.date(*entry.updated_parsed[0:3])
+ except:
+ # no date for certain feeds
+ pass
+ self.children.append(entry)
+ self._initialized = True
+
+
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/dashboard/registry.py b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/registry.py
new file mode 100644
index 0000000..fd12d26
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/registry.py
@@ -0,0 +1,124 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+# coding: utf-8
+
+class Registry(object):
+ """
+ Registry for application dashboards.
+ """
+ registry = {}
+
+ def register(cls, klass, app_name):
+ from grappelli.dashboard.dashboards import Dashboard
+ if not issubclass(klass, Dashboard):
+ raise ValueError('%s is not an instance of Dashboard' % klass)
+ if app_name in cls.registry:
+ raise ValueError('A dashboard has already been registered for '
+ 'the application "%s"', app_name)
+ cls.registry[app_name] = klass
+ register = classmethod(register)
+
+
+def register(cls, *args, **kwargs):
+ """
+ Register a custom dashboard into the global registry.
+ """
+ Registry.register(cls, *args, **kwargs)
+
+
+def autodiscover(blacklist=[]):
+ """
+ Automagically discover custom dashboards and menus for installed apps.
+ Optionally you can pass a ``blacklist`` of apps that you don't want to
+ provide their own app index dashboard.
+ """
+ import imp
+ from django.conf import settings
+ from django.utils.importlib import import_module
+
+ blacklist.append('grappelli')
+ blacklist.append('grappelli.dashboard')
+
+ for app in settings.INSTALLED_APPS:
+ # skip blacklisted apps
+ if app in blacklist:
+ continue
+
+ # try to import the app
+ try:
+ app_path = import_module(app).__path__
+ except AttributeError:
+ continue
+
+ # try to find a app.dashboard module
+ try:
+ imp.find_module('dashboard', app_path)
+ except ImportError:
+ continue
+
+ # looks like we found it so import it !
+ import_module('%s.dashboard' % app)
+
+
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/dashboard/templatetags/__init__.py b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/templatetags/__init__.py
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/dashboard/templatetags/grp_dashboard_tags.py b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/templatetags/grp_dashboard_tags.py
new file mode 100644
index 0000000..acd4066
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/templatetags/grp_dashboard_tags.py
@@ -0,0 +1,129 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""
+Dashboard template tags, the following dashboard tags are available:
+ * ``{% grp_render_dashboard %}``
+ * ``{% grp_render_dashboard_module %}``
+
+To load the dashboard tags: ``{% load grp_dashboard_tags %}``.
+"""
+
+import math
+
+from django import template
+from django.core.urlresolvers import reverse
+
+from grappelli.dashboard.utils import get_admin_site_name, get_index_dashboard
+
+register = template.Library()
+tag_func = register.inclusion_tag('grappelli/dashboard/dummy.html', takes_context=True)
+
+
+def grp_render_dashboard(context, location='index', dashboard=None):
+ """
+ Template tag that renders the dashboard, it takes two optional arguments:
+
+ ``location``
+ The location of the dashboard, it can be 'index' (for the admin index
+ dashboard) or 'app_index' (for the app index dashboard), the default
+ value is 'index'.
+
+ ``dashboard``
+ An instance of ``Dashboard``, if not given, the dashboard is retrieved
+ with the ``get_index_dashboard`` or ``get_app_index_dashboard``
+ functions, depending on the ``location`` argument.
+ """
+ if dashboard is None:
+ dashboard = get_index_dashboard(context)
+
+ dashboard.init_with_context(context)
+
+ context.update({
+ 'template': dashboard.template,
+ 'dashboard': dashboard,
+ 'admin_url': reverse('%s:index' % get_admin_site_name(context)),
+ })
+ return context
+grp_render_dashboard = tag_func(grp_render_dashboard)
+
+
+def grp_render_dashboard_module(context, module, index=None, subindex=None):
+ """
+ Template tag that renders a given dashboard module, it takes a
+ ``DashboardModule`` instance as first parameter and an integer ``index`` as
+ second parameter, that is the index of the module in the dashboard.
+ """
+ module.init_with_context(context)
+ context.update({
+ 'template': module.template,
+ 'module': module,
+ 'index': index,
+ 'subindex': subindex,
+ 'admin_url': reverse('%s:index' % get_admin_site_name(context)),
+ })
+ return context
+grp_render_dashboard_module = tag_func(grp_render_dashboard_module)
+
+
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/dashboard/utils.py b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/utils.py
new file mode 100644
index 0000000..7cc1ff4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/dashboard/utils.py
@@ -0,0 +1,229 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""
+Admin ui common utilities.
+"""
+
+# PYTHON IMPORTS
+import types
+import warnings
+from fnmatch import fnmatch
+
+# DJANGO IMPORTS
+from django.conf import settings
+from django.contrib import admin
+from django.core.urlresolvers import reverse
+from django.utils.importlib import import_module
+
+
+def _get_dashboard_cls(dashboard_cls, context):
+ if type(dashboard_cls) is types.DictType:
+ curr_url = context.get('request').META['PATH_INFO']
+ for key in dashboard_cls:
+ admin_site_mod, admin_site_inst = key.rsplit('.', 1)
+ admin_site_mod = import_module(admin_site_mod)
+ admin_site = getattr(admin_site_mod, admin_site_inst)
+ admin_url = reverse('%s:index' % admin_site.name)
+ if curr_url.startswith(admin_url):
+ mod, inst = dashboard_cls[key].rsplit('.', 1)
+ mod = import_module(mod)
+ return getattr(mod, inst)
+ else:
+ mod, inst = dashboard_cls.rsplit('.', 1)
+ mod = import_module(mod)
+ return getattr(mod, inst)
+ raise ValueError('Dashboard matching "%s" not found' % dashboard_cls)
+
+
+def get_index_dashboard(context):
+ """
+ Returns the admin dashboard defined in settings (or the default one).
+ """
+
+ return _get_dashboard_cls(getattr(
+ settings,
+ 'GRAPPELLI_INDEX_DASHBOARD',
+ 'grappelli.dashboard.dashboards.DefaultIndexDashboard'
+ ), context)()
+
+
+def get_admin_site(context=None, request=None):
+ dashboard_cls = getattr(
+ settings,
+ 'GRAPPELLI_INDEX_DASHBOARD',
+ 'admin_tools.dashboard.dashboards.DefaultIndexDashboard'
+ )
+
+ if type(dashboard_cls) is types.DictType:
+ if context:
+ request = context.get('request')
+ curr_url = request.META['PATH_INFO']
+ for key in dashboard_cls:
+ mod, inst = key.rsplit('.', 1)
+ mod = import_module(mod)
+ admin_site = getattr(mod, inst)
+ admin_url = reverse('%s:index' % admin_site.name)
+ if curr_url.startswith(admin_url):
+ return admin_site
+ else:
+ return admin.site
+ raise ValueError('Admin site matching "%s" not found' % dashboard_cls)
+
+
+def get_admin_site_name(context):
+ return get_admin_site(context).name
+
+
+def get_avail_models(request):
+ """ Returns (model, perm,) for all models user can possibly see """
+ items = []
+ admin_site = get_admin_site(request=request)
+
+ for model, model_admin in admin_site._registry.items():
+ perms = model_admin.get_model_perms(request)
+ if True not in perms.values():
+ continue
+ items.append((model, perms,))
+ return items
+
+
+def filter_models(request, models, exclude):
+ """
+ Returns (model, perm,) for all models that match models/exclude patterns
+ and are visible by current user.
+ """
+ items = get_avail_models(request)
+ included = []
+ full_name = lambda model: '%s.%s' % (model.__module__, model.__name__)
+
+ # I beleive that that implemented
+ # O(len(patterns)*len(matched_patterns)*len(all_models))
+ # algorythm is fine for model lists because they are small and admin
+ # performance is not a bottleneck. If it is not the case then the code
+ # should be optimized.
+
+ if len(models) == 0:
+ included = items
+ else:
+ for pattern in models:
+ pattern_items = []
+ for item in items:
+ model, perms = item
+ if fnmatch(full_name(model), pattern) and item not in included:
+ pattern_items.append(item)
+ pattern_items.sort(key=lambda x:x[0]._meta.verbose_name_plural)
+ included.extend(pattern_items)
+
+ result = included[:]
+ for pattern in exclude:
+ for item in included:
+ model, perms = item
+ if fnmatch(full_name(model), pattern):
+ result.remove(item)
+ return result
+
+
+class AppListElementMixin(object):
+ """
+ Mixin class used by both the AppListDashboardModule and the
+ AppListMenuItem (to honor the DRY concept).
+ """
+
+ def _visible_models(self, request):
+
+ included = self.models[:]
+ excluded = self.exclude[:]
+ if not self.models and not self.exclude:
+ included = ["*"]
+ return filter_models(request, included, excluded)
+
+ def _get_admin_app_list_url(self, model, context):
+ """
+ Returns the admin change url.
+ """
+ app_label = model._meta.app_label
+ return reverse('%s:app_list' % get_admin_site_name(context),
+ args=(app_label,))
+
+ def _get_admin_change_url(self, model, context):
+ """
+ Returns the admin change url.
+ """
+ app_label = model._meta.app_label
+ return reverse('%s:%s_%s_changelist' % (get_admin_site_name(context),
+ app_label,
+ model.__name__.lower()))
+
+ def _get_admin_add_url(self, model, context):
+ """
+ Returns the admin add url.
+ """
+ app_label = model._meta.app_label
+ return reverse('%s:%s_%s_add' % (get_admin_site_name(context),
+ app_label,
+ model.__name__.lower()))
+
+
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/models.py b/build/lib.linux-i686-2.6/demo/grappelli/models.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/models.py
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/settings.py b/build/lib.linux-i686-2.6/demo/grappelli/settings.py
new file mode 100644
index 0000000..4854e66
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/settings.py
@@ -0,0 +1,12 @@
+# coding: utf-8
+
+# DJANGO IMPORTS
+from django.conf import settings
+
+
+# Admin Site Title
+ADMIN_HEADLINE = getattr(settings, "GRAPPELLI_ADMIN_HEADLINE", 'Grappelli')
+ADMIN_TITLE = getattr(settings, "GRAPPELLI_ADMIN_TITLE", 'Grappelli')
+
+# Link to your Main Admin Site (no slashes at start and end)
+ADMIN_URL = getattr(settings, "GRAPPELLI_ADMIN_URL", '/admin/') \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/templatetags/__init__.py b/build/lib.linux-i686-2.6/demo/grappelli/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/templatetags/__init__.py
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/templatetags/grp_tags.py b/build/lib.linux-i686-2.6/demo/grappelli/templatetags/grp_tags.py
new file mode 100644
index 0000000..4ec485e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/templatetags/grp_tags.py
@@ -0,0 +1,232 @@
+# coding: utf-8
+
+# python imports
+import re
+
+# django imports
+from django import template
+from django.contrib.contenttypes.models import ContentType
+from django.utils.formats import get_format
+from django.utils.safestring import mark_safe
+from django.db import models
+from django.contrib import admin
+from django.conf import settings
+
+# grappelli imports
+from grappelli.settings import *
+
+register = template.Library()
+
+
+# GENERIC OBJECTS
+class do_get_generic_objects(template.Node):
+
+ def __init__(self):
+ pass
+
+ def render(self, context):
+ return_string = "{"
+ for c in ContentType.objects.all().order_by('id'):
+ return_string = "%s%d: {pk: %s, app: '%s', model: '%s'}," % (return_string, c.id, c.id, c.app_label, c.model)
+ return_string = "%s}" % return_string[:-1]
+ return return_string
+
+def get_content_types(parser, token):
+ """
+ Returns a list of installed applications and models.
+ Needed for lookup of generic relationships.
+ """
+ tokens = token.contents.split()
+ return do_get_generic_objects()
+register.tag('get_content_types', get_content_types)
+
+
+# ADMIN_TITLE
+def get_admin_title():
+ """
+ Returns the Title for the Admin-Interface.
+ """
+ return ADMIN_TITLE
+register.simple_tag(get_admin_title)
+
+
+# RETURNS CURRENT LANGUAGE
+def get_lang():
+ return get_language()
+register.simple_tag(get_lang)
+
+
+# ADMIN_URL
+def get_admin_url():
+ """
+ Returns the URL for the Admin-Interface.
+ """
+ return ADMIN_URL
+register.simple_tag(get_admin_url)
+
+
+def get_date_format():
+ return get_format('DATE_INPUT_FORMATS')[0]
+register.simple_tag(get_date_format)
+
+
+def get_time_format():
+ return get_format('TIME_INPUT_FORMATS')[0]
+register.simple_tag(get_time_format)
+
+
+def get_datetime_format():
+ return get_format('DATETIME_INPUT_FORMATS')[0]
+register.simple_tag(get_datetime_format)
+
+
+def grappelli_admin_title():
+ return ADMIN_TITLE
+register.simple_tag(grappelli_admin_title)
+
+
+# SEARCH FIELDS VERBOSE
+class GetSearchFields(template.Node):
+
+ def __init__(self, opts, var_name):
+ self.opts = template.Variable(opts)
+ self.var_name = var_name
+
+ def render(self, context):
+ opts = str(self.opts.resolve(context)).split('.')
+ model = models.get_model(opts[0], opts[1])
+ try:
+ field_list = admin.site._registry[model].search_fields_verbose
+ except:
+ field_list = ""
+
+ context[self.var_name] = ", ".join(field_list)
+ return ""
+
+
+def do_get_search_fields_verbose(parser, token):
+ """
+ Get search_fields_verbose in order to display on the Changelist.
+ """
+
+ try:
+ tag, arg = token.contents.split(None, 1)
+ except:
+ raise template.TemplateSyntaxError, "%s tag requires arguments" % token.contents.split()[0]
+ m = re.search(r'(.*?) as (\w+)', arg)
+ if not m:
+ raise template.TemplateSyntaxError, "%r tag had invalid arguments" % tag
+ opts, var_name = m.groups()
+ return GetSearchFields(opts, var_name)
+
+register.tag('get_search_fields_verbose', do_get_search_fields_verbose)
+
+
+@register.filter
+def classname(obj, arg=None):
+ classname = obj.__class__.__name__.lower()
+ if arg:
+ if arg.lower() == classname:
+ return True
+ else:
+ return False
+ else:
+ return classname
+
+
+# FORMSETSORT FOR SORTABLE INLINES
+
+@register.filter
+def formsetsort(formset, arg):
+ """
+ Takes a list of formset dicts, returns that list sorted by the sortable field.
+ """
+
+ if arg:
+ sorted_list = []
+ for item in formset:
+ position = item.form[arg].data
+ if position and position != "-1":
+ sorted_list.append((int(position), item))
+ sorted_list.sort()
+ sorted_list = [item[1] for item in sorted_list]
+ for item in formset:
+ position = item.form[arg].data
+ if not position or position == "-1":
+ sorted_list.append(item)
+ else:
+ sorted_list = formset
+ return sorted_list
+
+
+# RELATED LOOKUPS
+
+def get_related_lookup_fields_fk(model_admin):
+ try:
+ value = model_admin.related_lookup_fields.get("fk", [])
+ value = mark_safe(list(value))
+ except:
+ value = []
+ return value
+
+register.simple_tag(get_related_lookup_fields_fk)
+
+
+def get_related_lookup_fields_m2m(model_admin):
+ try:
+ value = model_admin.related_lookup_fields.get("m2m", [])
+ value = mark_safe(list(value))
+ except:
+ value = []
+ return value
+
+register.simple_tag(get_related_lookup_fields_m2m)
+
+
+def get_related_lookup_fields_generic(model_admin):
+ try:
+ value = model_admin.related_lookup_fields.get("generic", [])
+ value = mark_safe(list(value))
+ except:
+ value = []
+ return value
+
+register.simple_tag(get_related_lookup_fields_generic)
+
+
+# AUTOCOMPLETES
+
+def get_autocomplete_lookup_fields_fk(model_admin):
+ try:
+ value = model_admin.autocomplete_lookup_fields.get("fk", [])
+ value = mark_safe(list(value))
+ except:
+ value = []
+ return value
+
+register.simple_tag(get_autocomplete_lookup_fields_fk)
+
+
+def get_autocomplete_lookup_fields_m2m(model_admin):
+ try:
+ value = model_admin.autocomplete_lookup_fields.get("m2m", [])
+ value = mark_safe(list(value))
+ except:
+ value = []
+ return value
+
+register.simple_tag(get_autocomplete_lookup_fields_m2m)
+
+
+def get_autocomplete_lookup_fields_generic(model_admin):
+ try:
+ value = model_admin.autocomplete_lookup_fields.get("generic", [])
+ value = mark_safe(list(value))
+ except:
+ value = []
+ return value
+
+register.simple_tag(get_autocomplete_lookup_fields_generic)
+
+
+
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/urls.py b/build/lib.linux-i686-2.6/demo/grappelli/urls.py
new file mode 100644
index 0000000..8de1470
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/urls.py
@@ -0,0 +1,79 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# coding: utf-8
+
+# DJANGO IMPORTS
+from django.conf.urls.defaults import *
+from django.conf import settings
+
+
+urlpatterns = patterns('',
+
+ # FOREIGNKEY & GENERIC LOOKUP
+ url(r'^lookup/related/$', 'grappelli.views.related.related_lookup', name="grp_related_lookup"),
+ url(r'^lookup/m2m/$', 'grappelli.views.related.m2m_lookup', name="grp_m2m_lookup"),
+ url(r'^lookup/autocomplete/$', 'grappelli.views.related.autocomplete_lookup', name="grp_autocomplete_lookup"),
+
+)
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/views/__init__.py b/build/lib.linux-i686-2.6/demo/grappelli/views/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/views/__init__.py
diff --git a/build/lib.linux-i686-2.6/demo/grappelli/views/related.py b/build/lib.linux-i686-2.6/demo/grappelli/views/related.py
new file mode 100644
index 0000000..10aa983
--- /dev/null
+++ b/build/lib.linux-i686-2.6/demo/grappelli/views/related.py
@@ -0,0 +1,177 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# coding: utf-8
+
+# PYTHON IMPORTS
+import operator
+
+# DJANGO IMPORTS
+from django.http import HttpResponse, HttpResponseForbidden, HttpResponseNotFound
+from django.db import models
+from django.db.models.query import QuerySet
+from django.views.decorators.cache import never_cache
+from django.utils.translation import ugettext as _
+from django.utils.translation import ungettext
+from django.utils.encoding import smart_str
+import django.utils.simplejson as simplejson
+
+
+def returnattr(obj, attr):
+ if callable(getattr(obj, attr)):
+ return getattr(obj, attr)()
+ return getattr(obj, attr)
+
+
+def get_label(f):
+ if getattr(f, "related_label", None):
+ return f.related_label()
+ return f.__unicode__()
+
+
+@never_cache
+def related_lookup(request):
+ if not (request.user.is_active and request.user.is_staff):
+ return HttpResponseForbidden('<h1>Permission denied</h1>')
+ data = []
+ if request.method == 'GET':
+ if request.GET.has_key('object_id') and request.GET.has_key('app_label') and request.GET.has_key('model_name'):
+ object_id = request.GET.get('object_id')
+ app_label = request.GET.get('app_label')
+ model_name = request.GET.get('model_name')
+ if object_id:
+ try:
+ model = models.get_model(app_label, model_name)
+ obj = model.objects.get(pk=object_id)
+ data.append({"value":obj.id,"label":get_label(obj)})
+ return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
+ except:
+ pass
+ data = [{"value":None,"label":""}]
+ return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
+
+
+@never_cache
+def m2m_lookup(request):
+ if not (request.user.is_active and request.user.is_staff):
+ return HttpResponseForbidden('<h1>Permission denied</h1>')
+ data = []
+ if request.method == 'GET':
+ if request.GET.has_key('object_id') and request.GET.has_key('app_label') and request.GET.has_key('model_name'):
+ object_ids = request.GET.get('object_id').split(',')
+ app_label = request.GET.get('app_label')
+ model_name = request.GET.get('model_name')
+ model = models.get_model(app_label, model_name)
+ data = []
+ if len(object_ids):
+ for obj_id in object_ids:
+ if obj_id:
+ try:
+ obj = model.objects.get(pk=obj_id)
+ data.append({"value":obj.id,"label":get_label(obj)})
+ except:
+ data.append({"value":obj_id,"label":_("?")})
+ return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
+ data = [{"value":None,"label":""}]
+ return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
+
+
+@never_cache
+def autocomplete_lookup(request):
+ if not (request.user.is_active and request.user.is_staff):
+ return HttpResponseForbidden('<h1>Permission denied</h1>')
+ data = []
+ if request.method == 'GET':
+ if request.GET.has_key('term') and request.GET.has_key('app_label') and request.GET.has_key('model_name'):
+ term = request.GET.get("term")
+ app_label = request.GET.get('app_label')
+ model_name = request.GET.get('model_name')
+ model = models.get_model(app_label, model_name)
+ filters = {}
+ # FILTER
+ if request.GET.get('query_string', None):
+ for item in request.GET.get('query_string').split("&"):
+ if item.split("=")[0] != "t":
+ filters[smart_str(item.split("=")[0])]=smart_str(item.split("=")[1])
+ # SEARCH
+ qs = model._default_manager.all()
+ for bit in term.split():
+ search = [models.Q(**{smart_str(item):smart_str(bit)}) for item in model.autocomplete_search_fields()]
+ search_qs = QuerySet(model)
+ search_qs.dup_select_related(qs)
+ search_qs = search_qs.filter(reduce(operator.or_, search))
+ qs = qs & search_qs
+ data = [{"value":f.pk,"label":u'%s' % get_label(f)} for f in qs[:10]]
+ label = ungettext(
+ '%(counter)s result',
+ '%(counter)s results',
+ len(data)) % {
+ 'counter': len(data),
+ }
+ #data.insert(0, {"value":None,"label":label})
+ return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
+ data = [{"value":None,"label":_("Server error")}]
+ return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/__init__.py b/build/lib.linux-i686-2.6/gstudio/__init__.py
new file mode 100644
index 0000000..ff60315
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/__init__.py
@@ -0,0 +1,27 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Gstudio"""
+__version__ = '0.3.dev'
+__license__ = 'BSD License'
+
+__author__ = 'gnowgi'
+__email__ = 'nagarjun@gnowledge.org'
+
+__url__ = 'http://github.com/gnowgi/django-gstudio'
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/__init__.py b/build/lib.linux-i686-2.6/gstudio/admin/__init__.py
new file mode 100644
index 0000000..030e056
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/__init__.py
@@ -0,0 +1,118 @@
+"""Admin of Gstudio"""
+from django.contrib import admin
+
+#Models import
+from gstudio.models import Objecttype
+from gstudio.models import Metatype
+from gstudio.models import Relation
+from gstudio.models import Relationtype
+from gstudio.models import Attribute
+from gstudio.models import Attributetype
+from gstudio.models import Systemtype
+from gstudio.models import Processtype
+from gstudio.models import AttributeSpecification
+from gstudio.models import RelationSpecification
+from gstudio.models import NodeSpecification
+from gstudio.models import Union
+from gstudio.models import Complement
+from gstudio.models import Intersection
+from gstudio.models import Expression
+from gstudio.models import AttributeCharField
+from gstudio.models import AttributeTextField
+from gstudio.models import AttributeIntegerField
+from gstudio.models import AttributeCommaSeparatedIntegerField
+from gstudio.models import AttributeBigIntegerField
+from gstudio.models import AttributePositiveIntegerField
+from gstudio.models import AttributeDecimalField
+from gstudio.models import AttributeFloatField
+from gstudio.models import AttributeBooleanField
+from gstudio.models import AttributeNullBooleanField
+from gstudio.models import AttributeDateField
+from gstudio.models import AttributeDateTimeField
+from gstudio.models import AttributeTimeField
+from gstudio.models import AttributeEmailField
+from gstudio.models import AttributeFileField
+from gstudio.models import AttributeFilePathField
+from gstudio.models import AttributeImageField
+from gstudio.models import AttributeURLField
+from gstudio.models import AttributeIPAddressField
+
+#Admin imports
+
+from gstudio.admin.objecttype import ObjecttypeAdmin
+from gstudio.admin.metatype import MetatypeAdmin
+from gstudio.admin.relationtype import RelationtypeAdmin
+from gstudio.admin.relation import RelationAdmin
+from gstudio.admin.attribute import AttributeAdmin
+from gstudio.admin.attributetype import AttributetypeAdmin
+from gstudio.admin.attributespecification import AttributeSpecificationAdmin
+from gstudio.admin.relationspecification import RelationSpecificationAdmin
+from gstudio.admin.nodespecification import NodeSpecificationAdmin
+from gstudio.admin.union import UnionAdmin
+from gstudio.admin.complement import ComplementAdmin
+from gstudio.admin.intersection import IntersectionAdmin
+from gstudio.admin.expression import ExpressionAdmin
+from gstudio.admin.systemtype import SystemtypeAdmin
+from gstudio.admin.processtype import ProcesstypeAdmin
+
+from gstudio.admin.attribute_charfield import AttributeCharFieldAdmin
+from gstudio.admin.attribute_textfield import AttributeTextFieldAdmin
+from gstudio.admin.attribute_integerfield import AttributeIntegerFieldAdmin
+from gstudio.admin.attribute_commaseparatedintegerfield import AttributeCommaSeparatedIntegerFieldAdmin
+from gstudio.admin.attribute_bigintegerfield import AttributeBigIntegerFieldAdmin
+from gstudio.admin.attribute_positiveintegerfield import AttributePositiveIntegerFieldAdmin
+from gstudio.admin.attribute_decimalfield import AttributeDecimalFieldAdmin
+from gstudio.admin.attribute_floatfield import AttributeFloatFieldAdmin
+from gstudio.admin.attribute_booleanfield import AttributeBooleanFieldAdmin
+from gstudio.admin.attribute_nullbooleanfield import AttributeNullBooleanFieldAdmin
+from gstudio.admin.attribute_datefield import AttributeDateFieldAdmin
+from gstudio.admin.attribute_datetimefield import AttributeDateTimeFieldAdmin
+from gstudio.admin.attribute_timefield import AttributeTimeFieldAdmin
+from gstudio.admin.attribute_emailfield import AttributeEmailFieldAdmin
+from gstudio.admin.attribute_filefield import AttributeFileFieldAdmin
+from gstudio.admin.attribute_filepathfield import AttributeFilePathFieldAdmin
+from gstudio.admin.attribute_imagefield import AttributeImageFieldAdmin
+from gstudio.admin.attribute_urlfield import AttributeURLFieldAdmin
+from gstudio.admin.attribute_ipaddressfield import AttributeIPAddressFieldAdmin
+
+
+
+
+
+admin.site.register(Objecttype, ObjecttypeAdmin)
+admin.site.register(Metatype, MetatypeAdmin)
+admin.site.register(Relationtype, RelationtypeAdmin)
+admin.site.register(Relation, RelationAdmin)
+admin.site.register(Attribute, AttributeAdmin)
+admin.site.register(Attributetype, AttributetypeAdmin)
+
+admin.site.register(Systemtype, SystemtypeAdmin)
+admin.site.register(Processtype, ProcesstypeAdmin)
+admin.site.register(AttributeSpecification, AttributeSpecificationAdmin)
+admin.site.register(RelationSpecification, RelationSpecificationAdmin)
+admin.site.register(NodeSpecification, NodeSpecificationAdmin)
+admin.site.register(Union, UnionAdmin)
+admin.site.register(Complement, ComplementAdmin)
+admin.site.register(Intersection, IntersectionAdmin)
+admin.site.register(Expression, ExpressionAdmin)
+
+admin.site.register(AttributeCharField, AttributeCharFieldAdmin)
+admin.site.register(AttributeTextField, AttributeTextFieldAdmin)
+admin.site.register(AttributeIntegerField, AttributeIntegerFieldAdmin)
+admin.site.register(AttributeCommaSeparatedIntegerField, AttributeCommaSeparatedIntegerFieldAdmin)
+admin.site.register(AttributeBigIntegerField,AttributeBigIntegerFieldAdmin)
+admin.site.register(AttributePositiveIntegerField, AttributePositiveIntegerFieldAdmin)
+admin.site.register(AttributeDecimalField, AttributeDecimalFieldAdmin)
+admin.site.register(AttributeFloatField, AttributeFloatFieldAdmin)
+admin.site.register(AttributeBooleanField, AttributeBooleanFieldAdmin)
+admin.site.register(AttributeNullBooleanField, AttributeNullBooleanFieldAdmin)
+admin.site.register(AttributeDateField, AttributeDateFieldAdmin)
+admin.site.register(AttributeDateTimeField, AttributeDateTimeFieldAdmin)
+admin.site.register(AttributeTimeField,AttributeTimeFieldAdmin)
+admin.site.register(AttributeEmailField, AttributeEmailFieldAdmin)
+admin.site.register(AttributeFileField, AttributeFileFieldAdmin)
+admin.site.register(AttributeFilePathField, AttributeFilePathFieldAdmin)
+admin.site.register(AttributeImageField, AttributeImageFieldAdmin)
+admin.site.register(AttributeURLField, AttributeURLFieldAdmin)
+admin.site.register(AttributeIPAddressField, AttributeIPAddressFieldAdmin)
+
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute.py
new file mode 100644
index 0000000..336509e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute.py
@@ -0,0 +1,20 @@
+"""MetatypeAdmin for Gstudio"""
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+from django.utils.html import escape
+from gstudio.admin.forms import AttributeAdminForm
+from gstudio.models import *
+import reversion
+
+class AttributeAdmin(reversion.VersionAdmin):
+ class Media:
+ js = ("gstudio/js/gstudiojs.js",)
+
+ def save_model(self, request, attribute, form, change):
+ attribute.title = attribute.composed_attribution
+ attribute.save()
+
+
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_bigintegerfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_bigintegerfield.py
new file mode 100644
index 0000000..53085fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_bigintegerfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeBigIntegerFieldAdminForm
+import reversion
+
+class AttributeBigIntegerFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_booleanfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_booleanfield.py
new file mode 100644
index 0000000..e6ce41f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_booleanfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeBooleanFieldAdminForm
+import reversion
+
+class AttributeBooleanFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_charfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_charfield.py
new file mode 100644
index 0000000..138d89d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_charfield.py
@@ -0,0 +1,10 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeCharFieldAdminForm
+import reversion
+
+class AttributeCharFieldAdmin(reversion.VersionAdmin):
+ pass
+
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_commaseparatedintegerfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_commaseparatedintegerfield.py
new file mode 100644
index 0000000..4202f61
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_commaseparatedintegerfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeCommaSeparatedIntegerFieldAdminForm
+import reversion
+
+class AttributeCommaSeparatedIntegerFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_datefield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_datefield.py
new file mode 100644
index 0000000..9619547
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_datefield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeDateFieldAdminForm
+import reversion
+
+class AttributeDateFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_datetimefield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_datetimefield.py
new file mode 100644
index 0000000..bdbdfa5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_datetimefield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeDateTimeFieldAdminForm
+import reversion
+
+class AttributeDateTimeFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_decimalfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_decimalfield.py
new file mode 100644
index 0000000..168ad06
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_decimalfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeDecimalFieldAdminForm
+import reversion
+
+class AttributeDecimalFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_emailfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_emailfield.py
new file mode 100644
index 0000000..8173f2c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_emailfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeEmailFieldAdminForm
+import reversion
+
+class AttributeEmailFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_filefield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_filefield.py
new file mode 100644
index 0000000..a2553c6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_filefield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeFileFieldAdminForm
+import reversion
+
+class AttributeFileFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_filepathfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_filepathfield.py
new file mode 100644
index 0000000..76d483d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_filepathfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeFilePathFieldAdminForm
+import reversion
+
+class AttributeFilePathFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_floatfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_floatfield.py
new file mode 100644
index 0000000..0f97b7c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_floatfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeFloatFieldAdminForm
+import reversion
+
+class AttributeFloatFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_imagefield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_imagefield.py
new file mode 100644
index 0000000..80515a6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_imagefield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeImageFieldAdminForm
+import reversion
+
+class AttributeImageFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_integerfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_integerfield.py
new file mode 100644
index 0000000..a170c95
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_integerfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeIntegerFieldAdminForm
+import reversion
+
+class AttributeIntegerFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_ipaddressfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_ipaddressfield.py
new file mode 100644
index 0000000..1fa9a1b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_ipaddressfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeIPAddressFieldAdminForm
+import reversion
+
+class AttributeIPAddressFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_nullbooleanfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_nullbooleanfield.py
new file mode 100644
index 0000000..fba5208
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_nullbooleanfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeNullBooleanFieldAdminForm
+import reversion
+
+class AttributeNullBooleanFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_positiveintegerfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_positiveintegerfield.py
new file mode 100644
index 0000000..1404449
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_positiveintegerfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributePositiveIntegerFieldAdminForm
+import reversion
+
+class AttributePositiveIntegerFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_textfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_textfield.py
new file mode 100644
index 0000000..7786af1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_textfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeTextFieldAdminForm
+import reversion
+
+class AttributeTextFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_timefield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_timefield.py
new file mode 100644
index 0000000..929b028
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_timefield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeTimeFieldAdminForm
+import reversion
+
+class AttributeTimeFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attribute_urlfield.py b/build/lib.linux-i686-2.6/gstudio/admin/attribute_urlfield.py
new file mode 100644
index 0000000..952beec
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attribute_urlfield.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeURLFieldAdminForm
+import reversion
+
+class AttributeURLFieldAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attributespecification.py b/build/lib.linux-i686-2.6/gstudio/admin/attributespecification.py
new file mode 100644
index 0000000..3e7f6e1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attributespecification.py
@@ -0,0 +1,10 @@
+
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import AttributeSpecificationAdminForm
+import reversion
+
+class AttributeSpecificationAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/attributetype.py b/build/lib.linux-i686-2.6/gstudio/admin/attributetype.py
new file mode 100644
index 0000000..c1f03d9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/attributetype.py
@@ -0,0 +1,352 @@
+"""AttributetypeAdmin for Gstudio"""
+from datetime import datetime
+
+from django.forms import Media
+from django.contrib import admin
+from django.contrib.auth.models import User
+from django.utils.html import strip_tags
+from django.utils.text import truncate_words
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+from django.conf import settings as project_settings
+from django.utils.translation import ugettext_lazy as _
+from django.core.urlresolvers import reverse, NoReverseMatch
+
+from tagging.models import Tag
+
+import reversion
+from gstudio import settings
+from gstudio.managers import HIDDEN
+from gstudio.managers import PUBLISHED
+from gstudio.ping import DirectoryPinger
+from gstudio.admin.forms import AttributetypeAdminForm
+
+
+
+
+class AttributetypeAdmin(reversion.VersionAdmin):
+ """Admin for Attributetype model"""
+ form = AttributetypeAdminForm
+ date_hierarchy = 'creation_date'
+ fieldsets = ((_('Attribute Definiton'), {'fields': ('title','altnames','subjecttype','applicable_node\
+types','dataType','verbose_name','null','blank','help_text','max_digits','decimal_places','auto_now','auto_now_add','upload_to','path','verify_exists','parent','slug','status') }),
+
+ (_('Content'), {'fields': ('content', 'image',),
+ 'classes': ('collapse', 'collapse-closed')}),
+
+
+ (_('Dependency'), {'fields': ('prior_nodes', 'posterior_nodes',),
+
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Options'), {'fields': ('featured', 'excerpt', 'template',
+ 'authors',
+ 'creation_date',
+ 'start_publication',
+ 'end_publication'),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Privacy'), {'fields': ('password', 'login_required',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Publication'), {'fields': ('tags',
+ 'sites')}))
+
+
+ list_filter = ('parent','metatypes', 'authors', 'status', 'featured',
+ 'login_required', 'comment_enabled', 'pingback_enabled',
+ 'creation_date', 'start_publication',
+ 'end_publication', 'sites')
+ list_display = ('get_title', 'get_authors', 'get_metatypes',
+ 'get_tags', 'get_sites',
+ 'get_comments_are_open', 'pingback_enabled',
+ 'get_is_actual', 'get_is_visible', 'get_link',
+ 'get_short_url', 'creation_date')
+ radio_fields = {'template': admin.VERTICAL}
+ filter_horizontal = ('metatypes', 'authors')
+ prepopulated_fields = {'slug': ('title', )}
+ search_fields = ('title', 'excerpt', 'content', 'tags')
+ actions = ['make_mine', 'make_published', 'make_hidden',
+ 'close_comments', 'close_pingbacks',
+ 'ping_directories', 'make_tweet', 'put_on_top']
+ actions_on_top = True
+ actions_on_bottom = True
+
+ def __init__(self, model, admin_site):
+ self.form.admin_site = admin_site
+ super(AttributetypeAdmin, self).__init__(model, admin_site)
+
+ # Custom Display
+ def get_title(self, attributetype):
+ """Return the title with word count and number of comments"""
+ title = _('%(title)s (%(word_count)i words)') % \
+ {'title': attributetype.title, 'word_count': attributetype.word_count}
+ comments = attributetype.comments.count()
+ if comments:
+ return _('%(title)s (%(comments)i comments)') % \
+ {'title': title, 'comments': comments}
+ return title
+ get_title.short_description = _('title')
+
+ def get_authors(self, attributetype):
+ """Return the authors in HTML"""
+ try:
+ authors = ['<a href="%s" target="blank">%s</a>' %
+ (reverse('gstudio_author_detail',
+ args=[author.username]),
+ author.username) for author in attributetype.authors.all()]
+ except NoReverseMatch:
+ authors = [author.username for author in attributetype.authors.all()]
+ return ', '.join(authors)
+ get_authors.allow_tags = True
+ get_authors.short_description = _('author(s)')
+
+ def get_metatypes(self, attributetype):
+ """Return the metatypes linked in HTML"""
+ try:
+ metatypes = ['<a href="%s" target="blank">%s</a>' %
+ (metatype.get_absolute_url(), metatype.title)
+ for metatype in attributetype.metatypes.all()]
+ except NoReverseMatch:
+ metatypes = [metatype.title for metatype in
+ attributetype.metatypes.all()]
+ return ', '.join(metatypes)
+ get_metatypes.allow_tags = True
+ get_metatypes.short_description = _('metatype(s)')
+
+ def get_tags(self, attributetype):
+ """Return the tags linked in HTML"""
+ try:
+ return ', '.join(['<a href="%s" target="blank">%s</a>' %
+ (reverse('gstudio_tag_detail',
+ args=[tag.name]), tag.name)
+ for tag in Tag.attributes.get_for_attribute(attributetype)])
+ except NoReverseMatch:
+ return attributetype.tags
+ get_tags.allow_tags = True
+ get_tags.short_description = _('tag(s)')
+
+ def get_sites(self, attributetype):
+ """Return the sites linked in HTML"""
+ return ', '.join(
+ ['<a href="http://%(domain)s" target="blank">%(name)s</a>' %
+ site.__dict__ for site in attributetype.sites.all()])
+ get_sites.allow_tags = True
+ get_sites.short_description = _('site(s)')
+
+ def get_comments_are_open(self, attributetype):
+ """Admin wrapper for attributetype.comments_are_open"""
+ return attributetype.comments_are_open
+ get_comments_are_open.boolean = True
+ get_comments_are_open.short_description = _('comment enabled')
+
+ def get_is_actual(self, attributetype):
+ """Admin wrapper for attributetype.is_actual"""
+ return attributetype.is_actual
+ get_is_actual.boolean = True
+ get_is_actual.short_description = _('is actual')
+
+ def get_is_visible(self, attributetype):
+ """Admin wrapper for attributetype.is_visible"""
+ return attributetype.is_visible
+ get_is_visible.boolean = True
+ get_is_visible.short_description = _('is visible')
+
+ def get_link(self, attributetype):
+ """Return a formated link to the attributetype"""
+ return u'<a href="%s" target="blank">%s</a>' % (
+ attributetype.get_absolute_url(), _('View'))
+ get_link.allow_tags = True
+ get_link.short_description = _('View on site')
+
+ def get_short_url(self, attributetype):
+ """Return the short url in HTML"""
+ short_url = attributetype.short_url
+ if not short_url:
+ return _('Unavailable')
+ return '<a href="%(url)s" target="blank">%(url)s</a>' % \
+ {'url': short_url}
+ get_short_url.allow_tags = True
+ get_short_url.short_description = _('short url')
+
+ # Custom Methods
+ def save_model(self, request, attributetype, form, change):
+ """Save the authors, update time, make an excerpt"""
+ if not form.cleaned_data.get('excerpt') and attributetype.status == PUBLISHED:
+ attributetype.excerpt = truncate_words(strip_tags(attributetype.content), 50)
+
+ if attributetype.pk and not request.user.has_perm('gstudio.can_change_author'):
+ form.cleaned_data['authors'] = attributetype.authors.all()
+
+ if not form.cleaned_data.get('authors'):
+ form.cleaned_data['authors'].append(request.user)
+
+ attributetype.last_update = datetime.now()
+ attributetype.save()
+
+ def queryset(self, request):
+ """Make special filtering by user permissions"""
+ queryset = super(AttributetypeAdmin, self).queryset(request)
+ if request.user.has_perm('gstudio.can_view_all'):
+ return queryset
+ return request.user.attributetypes.all()
+
+ def formfield_for_manytomany(self, db_field, request, **kwargs):
+ """Filters the disposable authors"""
+ if db_field.name == 'authors':
+ if request.user.has_perm('gstudio.can_change_author'):
+ kwargs['queryset'] = User.objects.filter(is_staff=True)
+ else:
+ kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
+
+ return super(AttributetypeAdmin, self).formfield_for_manytomany(
+ db_field, request, **kwargs)
+
+ def get_actions(self, request):
+ """Define user actions by permissions"""
+ actions = super(AttributetypeAdmin, self).get_actions(request)
+ if not request.user.has_perm('gstudio.can_change_author') \
+ or not request.user.has_perm('gstudio.can_view_all'):
+ del actions['make_mine']
+ if not settings.PING_DIRECTORIES:
+ del actions['ping_directories']
+ if not settings.USE_TWITTER:
+ del actions['make_tweet']
+
+ return actions
+
+ # Custom Actions
+ def make_mine(self, request, queryset):
+ """Set the attributetypes to the user"""
+ for attributetype in queryset:
+ if request.user not in attributetype.authors.all():
+ attributetype.authors.add(request.user)
+ self.message_user(
+ request, _('The selected attributetypes now belong to you.'))
+ make_mine.short_description = _('Set the attributetypes to the user')
+
+ def make_published(self, request, queryset):
+ """Set attributetypes selected as published"""
+ queryset.update(status=PUBLISHED)
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(
+ request, _('The selected attributetypes are now marked as published.'))
+ make_published.short_description = _('Set attributetypes selected as published')
+
+ def make_hidden(self, request, queryset):
+ """Set attributetypes selected as hidden"""
+ queryset.update(status=HIDDEN)
+ self.message_user(
+ request, _('The selected attributetypes are now marked as hidden.'))
+ make_hidden.short_description = _('Set attributetypes selected as hidden')
+
+ def make_tweet(self, request, queryset):
+ """Post an update on Twitter"""
+ import tweepy
+ auth = tweepy.OAuthHandler(settings.TWITTER_CONSUMER_KEY,
+ settings.TWITTER_CONSUMER_SECRET)
+ auth.set_access_token(settings.TWITTER_ACCESS_KEY,
+ settings.TWITTER_ACCESS_SECRET)
+ api = tweepy.API(auth)
+ for attributetype in queryset:
+ short_url = attributetype.short_url
+ message = '%s %s' % (attributetype.title[:139 - len(short_url)], short_url)
+ api.update_status(message)
+ self.message_user(
+ request, _('The selected attributetypes have been tweeted.'))
+ make_tweet.short_description = _('Tweet attributetypes selected')
+
+ def close_comments(self, request, queryset):
+ """Close the comments for selected attributetypes"""
+ queryset.update(comment_enabled=False)
+ self.message_user(
+ request, _('Comments are now closed for selected attributetypes.'))
+ close_comments.short_description = _('Close the comments for '\
+ 'selected attributetypes')
+
+ def close_pingbacks(self, request, queryset):
+ """Close the pingbacks for selected attributetypes"""
+ queryset.update(pingback_enabled=False)
+ self.message_user(
+ request, _('Linkbacks are now closed for selected attributetypes.'))
+ close_pingbacks.short_description = _(
+ 'Close the linkbacks for selected attributetypes')
+
+ def put_on_top(self, request, queryset):
+ """Put the selected attributetypes on top at the current date"""
+ queryset.update(creation_date=datetime.now())
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(request, _(
+ 'The selected attributetypes are now set at the current date.'))
+ put_on_top.short_description = _(
+ 'Put the selected attributetypes on top at the current date')
+
+ def ping_directories(self, request, queryset, messages=True):
+ """Ping Directories for selected attributetypes"""
+ for directory in settings.PING_DIRECTORIES:
+ pinger = DirectoryPinger(directory, queryset)
+ pinger.join()
+ if messages:
+ success = 0
+ for result in pinger.results:
+ if not result.get('flerror', True):
+ success += 1
+ else:
+ self.message_user(request,
+ '%s : %s' % (directory,
+ result['message']))
+ if success:
+ self.message_user(
+ request,
+ _('%(directory)s directory succesfully ' \
+ 'pinged %(success)d attributetypes.') %
+ {'directory': directory, 'success': success})
+ ping_directories.short_description = _(
+ 'Ping Directories for selected attributetypes')
+
+ def get_urls(self):
+ attributetype_admin_urls = super(AttributetypeAdmin, self).get_urls()
+ urls = patterns(
+ 'django.views.generic.simple',
+ url(r'^autocomplete_tags/$', 'direct_to_template',
+ {'template': 'admin/gstudio/attributetype/autocomplete_tags.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_attributetype_autocomplete_tags'),
+ url(r'^wymeditor/$', 'direct_to_template',
+ {'template': 'admin/gstudio/attributetype/wymeditor.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_attributetype_wymeditor'),
+ url(r'^markitup/$', 'direct_to_template',
+ {'template': 'admin/gstudio/attributetype/markitup.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_attributetype_markitup'),)
+ return urls + attributetype_admin_urls
+
+ def _media(self):
+ STATIC_URL = '%sgstudio/' % project_settings.STATIC_URL
+ media = super(AttributetypeAdmin, self).media + Media(
+ css={'all': ('%scss/jquery.autocomplete.css' % STATIC_URL,)},
+ js=('%sjs/jquery.js' % STATIC_URL,
+ '%sjs/jquery.bgiframe.js' % STATIC_URL,
+ '%sjs/jquery.autocomplete.js' % STATIC_URL,
+ reverse('admin:gstudio_attributetype_autocomplete_tags'),))
+
+ if settings.WYSIWYG == 'wymeditor':
+ media += Media(
+ js=('%sjs/wymeditor/jquery.wymeditor.pack.js' % STATIC_URL,
+ '%sjs/wymeditor/plugins/hovertools/'
+ 'jquery.wymeditor.hovertools.js' % STATIC_URL,
+ reverse('admin:gstudio_attributetype_wymeditor')))
+ elif settings.WYSIWYG == 'tinymce':
+ from tinymce.widgets import TinyMCE
+ media += TinyMCE().media + Media(
+ js=(reverse('tinymce-js', args=('admin/gstudio/attributetype',)),))
+ elif settings.WYSIWYG == 'markitup':
+ media += Media(
+ js=('%sjs/markitup/jquery.markitup.js' % STATIC_URL,
+ '%sjs/markitup/sets/%s/set.js' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE),
+ reverse('admin:gstudio_attributetype_markitup')),
+ css={'all': (
+ '%sjs/markitup/skins/django/style.css' % STATIC_URL,
+ '%sjs/markitup/sets/%s/style.css' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE))})
+ return media
+ media = property(_media)
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/complement.py b/build/lib.linux-i686-2.6/gstudio/admin/complement.py
new file mode 100644
index 0000000..b35ad6c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/complement.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import ComplementAdminForm
+import reversion
+
+class ComplementAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/expression.py b/build/lib.linux-i686-2.6/gstudio/admin/expression.py
new file mode 100644
index 0000000..a6a8fd2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/expression.py
@@ -0,0 +1,13 @@
+"""MetatypeAdmin for Gstudio"""
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import ExpressionAdminForm
+import reversion
+
+class ExpressionAdmin(reversion.VersionAdmin):
+ def save_model(self, request, expression, form, change):
+ expression.title = expression.composed_sentence
+ expression.save()
+
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/forms.py b/build/lib.linux-i686-2.6/gstudio/admin/forms.py
new file mode 100644
index 0000000..37b578c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/forms.py
@@ -0,0 +1,505 @@
+"""Forms for Gstudio admin"""
+from django import forms
+from django.db.models import ManyToOneRel
+from django.db.models import ManyToManyRel
+from django.contrib.sites.models import Site
+from django.utils.translation import ugettext_lazy as _
+from django.contrib.admin.widgets import RelatedFieldWidgetWrapper
+
+from gstudio.models import NID
+from gstudio.models import Nodetype
+from gstudio.models import Objecttype
+from gstudio.models import Metatype
+from gstudio.models import Relationtype
+from gstudio.models import Relation
+from gstudio.models import Attributetype
+from gstudio.models import Attribute
+from gstudio.models import AttributeSpecification
+from gstudio.models import RelationSpecification
+from gstudio.models import NodeSpecification
+from gstudio.models import Union
+from gstudio.models import Complement
+from gstudio.models import Intersection
+from gstudio.models import Expression
+
+from gstudio.models import AttributeCharField
+from gstudio.models import AttributeTextField
+from gstudio.models import AttributeIntegerField
+from gstudio.models import AttributeCommaSeparatedIntegerField
+from gstudio.models import AttributeBigIntegerField
+from gstudio.models import AttributePositiveIntegerField
+from gstudio.models import AttributeDecimalField
+from gstudio.models import AttributeFloatField
+from gstudio.models import AttributeBooleanField
+from gstudio.models import AttributeNullBooleanField
+from gstudio.models import AttributeDateField
+from gstudio.models import AttributeDateTimeField
+from gstudio.models import AttributeTimeField
+from gstudio.models import AttributeEmailField
+from gstudio.models import AttributeFileField
+from gstudio.models import AttributeFilePathField
+from gstudio.models import AttributeImageField
+from gstudio.models import AttributeURLField
+from gstudio.models import AttributeIPAddressField
+
+
+
+
+from gstudio.models import Systemtype
+from gstudio.models import Processtype
+
+
+from gstudio.admin.widgets import TreeNodeChoiceField
+from gstudio.admin.widgets import MPTTFilteredSelectMultiple
+from gstudio.admin.widgets import MPTTModelMultipleChoiceField
+from reversion.models import Version
+
+class MetatypeAdminForm(forms.ModelForm):
+ """Form for Metatype's Admin"""
+ parent = TreeNodeChoiceField(
+ label=_('parent metatype').capitalize(),
+ required=False, empty_label=_('No parent metatype'),
+ queryset=Metatype.tree.all())
+
+ def __init__(self, *args, **kwargs):
+ super(MetatypeAdminForm, self).__init__(*args, **kwargs)
+ rel = ManyToOneRel(Metatype, 'id')
+ self.fields['parent'].widget = RelatedFieldWidgetWrapper(
+ self.fields['parent'].widget, rel, self.admin_site)
+
+ def clean_parent(self):
+ """Check if metatype parent is not selfish"""
+ data = self.cleaned_data['parent']
+ if data == self.instance:
+ raise forms.ValidationError(
+ _('A metatype cannot be a parent of itself.'))
+ return data
+
+ class Meta:
+ """MetatypeAdminForm's Meta"""
+ model = Metatype
+
+
+class ObjecttypeAdminForm(forms.ModelForm):
+ """Form for Objecttype's Admin"""
+
+ parent = TreeNodeChoiceField(
+ label=_('parent nodetype').capitalize(),
+ required=False, empty_label=_('No parent nodetype'),
+ queryset=Nodetype.tree.all())
+
+ metatypes = MPTTModelMultipleChoiceField(
+ label=_('Metatypes'), required=False,
+ queryset=Metatype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('metatypes'), False,
+ attrs={'rows': '10'}))
+ priornodes = MPTTModelMultipleChoiceField(
+ label=_('priornodes'), required=False,
+ queryset=Nodetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('nodetypes'), False,
+ attrs={'rows': '10'}))
+
+ posteriornodes = MPTTModelMultipleChoiceField(
+ label=_('posteriornodes'), required=False,
+ queryset=Nodetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('nodetypes'), False,
+ attrs={'rows': '10'}))
+
+
+
+
+ def __init__(self, *args, **kwargs):
+ super(ObjecttypeAdminForm, self).__init__(*args, **kwargs)
+ meta = ManyToManyRel(Metatype, 'id')
+ prior = ManyToManyRel(Nodetype,'id')
+ post = ManyToManyRel(Nodetype,'id')
+ self.fields['metatypes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['metatypes'].widget, meta, self.admin_site)
+ self.fields['priornodes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['priornodes'].widget, prior, self.admin_site)
+ self.fields['posteriornodes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['posteriornodes'].widget, post, self.admin_site)
+
+
+
+ self.fields['sites'].initial = [Site.objects.get_current()]
+
+ def clean_parent(self):
+ """Check if an object does not become a parent of itself"""
+ data = self.cleaned_data['parent']
+ if data == self.instance:
+ raise forms.ValidationError(
+ _('An objectype cannot be parent of itself.'))
+ return data
+
+ class Meta:
+ """NodetypeAdminForm's Meta"""
+ model = Objecttype
+
+
+class RelationtypeAdminForm(forms.ModelForm):
+
+ priornodes = MPTTModelMultipleChoiceField(
+ label=_('Priornodes'), required=False,
+ queryset=Nodetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('priornodes'), False,
+ attrs={'rows': '10'}))
+ posteriornodes = MPTTModelMultipleChoiceField(
+ label=_('Prosterior Nodes'), required=False,
+ queryset=Nodetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('prosteriornode'), False,
+ attrs={'rows': '10'}))
+
+ def __init__(self, *args, **kwargs):
+ super(RelationtypeAdminForm, self).__init__(*args, **kwargs)
+ prior = ManyToManyRel(Nodetype, 'id')
+ post = ManyToManyRel(Nodetype, 'id')
+
+
+
+ self.fields['priornodes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['priornodes'].widget, prior, self.admin_site)
+ self.fields['posteriornodes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['posteriornodes'].widget, post, self.admin_site)
+
+
+
+
+ class Meta:
+ """MetatypeAdminForm's Meta"""
+ model = Relationtype
+
+
+class RelationAdminForm(forms.ModelForm):
+
+
+ def ApplicableNodeTypes_filter(self):
+ choice = 'NT'
+ if choice == 'ED':
+ nid = 'Edge'
+ if choice == 'ND':
+ nid = 'Node'
+ if choice == 'NT':
+ nid = 'Nodetype'
+ if choice == 'ET':
+ nid = 'Edgetype'
+ if choice == 'OT':
+ nid = 'Objecttype'
+ if choice == 'RT':
+ nid = 'Relationtype'
+ if choice == 'MT':
+ nid = 'Metatype'
+ if choice == 'AT':
+ nid = 'Attributetype'
+ if choice == 'RN':
+ nid = 'Relation'
+ if choice == 'AS':
+ nid = 'Attributes'
+ if choice == 'ST':
+ nid = 'Systemtype'
+ if choice == 'SY':
+ nid = 'System'
+
+ node = NID.objects.get(Objecttype)
+ vrs = Version.objects.filter(type=0 , object_id=node.id)
+ vrs = vrs[0]
+ AppNode = vrs.object._meta.module_name
+ AppNodeList = AppNode.objects.all()
+ return AppNodeList
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ class Meta:
+ """MetatypeAdminForm's Meta"""
+ model = Relation
+
+
+class ProcesstypeAdminForm(forms.ModelForm):
+
+ priornodes = MPTTModelMultipleChoiceField(
+ label=_('Priornodes'), required=False,
+ queryset=Nodetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('priornodes'), False,
+ attrs={'rows': '10'}))
+ posteriornodes = MPTTModelMultipleChoiceField(
+ label=_('Prosterior Nodes'), required=False,
+ queryset=Nodetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('prosteriornode'), False,
+ attrs={'rows': '10'}))
+ attributetype_set = MPTTModelMultipleChoiceField(
+ label=_('Attributetype Sets'), required=False,
+ queryset=Attributetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('Attributetype Set'), False,
+ attrs={'rows': '10'}))
+ relationtype_set = MPTTModelMultipleChoiceField(
+ label=_('Relationtype Set'), required=False,
+ queryset=Relationtype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('Relationtype Set'), False,
+ attrs={'rows': '10'}))
+
+
+ def __init__(self, *args, **kwargs):
+ super(ProcesstypeAdminForm, self).__init__(*args, **kwargs)
+ prior = ManyToManyRel(Nodetype, 'id')
+ post = ManyToManyRel(Nodetype, 'id')
+ atype = ManyToManyRel(Attributetype, 'id')
+ rtype = ManyToManyRel(Relationtype, 'id')
+
+
+ self.fields['priornodes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['priornodes'].widget, prior, self.admin_site)
+ self.fields['posteriornodes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['posteriornodes'].widget, post, self.admin_site)
+ self.fields['attributetype_set'].widget = RelatedFieldWidgetWrapper(
+ self.fields['attributetype_set'].widget, atype, self.admin_site)
+ self.fields['relationtype_set'].widget = RelatedFieldWidgetWrapper(
+ self.fields['relationtype_set'].widget, rtype, self.admin_site)
+
+
+
+
+ class Meta:
+ """SystemAdminForm's Meta"""
+ model = Processtype
+
+class AttributetypeAdminForm(forms.ModelForm):
+ priornodes = MPTTModelMultipleChoiceField(
+ label=_('Priornodes'), required=False,
+ queryset=Nodetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('priornodes'), False,
+ attrs={'rows': '10'}))
+ posteriornodes = MPTTModelMultipleChoiceField(
+ label=_('Posterior Nodes'), required=False,
+ queryset=Nodetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('posteriornodes'), False,
+ attrs={'rows': '10'}))
+ def __init__(self, *args, **kwargs):
+ super(AttributetypeAdminForm, self).__init__(*args, **kwargs)
+ prior = ManyToManyRel(Nodetype, 'id')
+ post = ManyToManyRel(Nodetype, 'id')
+
+
+ self.fields['priornodes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['priornodes'].widget, prior, self.admin_site)
+ self.fields['posteriornodes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['posteriornodes'].widget, post, self.admin_site)
+
+
+
+ class Meta:
+ """MetatypeAdminForm's Meta"""
+ model = Attributetype
+
+
+class AttributeAdminForm(forms.ModelForm):
+
+ def subject_filter(attr):
+ """
+ returns applicable selection of nodes for selecting objects
+ """
+ for each in Objecttype.objects.all():
+ if attr.subjecttype.id == each.id:
+ return each.get_members
+
+ def __init__(self, *args, **kwargs):
+ super(AttributeAdminForm, self).__init__(*args, **kwargs)
+ self.fields["subject"].queryset = subject_filter(attr)
+
+
+ class Meta:
+ """MetatypeAdminForm's Meta"""
+ model = Attribute
+
+
+
+class SystemtypeAdminForm(forms.ModelForm):
+ nodetype_set = MPTTModelMultipleChoiceField(
+ label=_('Nodetypeset'), required=False,
+ queryset=Nodetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('Nodetypesets'), False,
+ attrs={'rows': '10'}))
+ relationtype_set = MPTTModelMultipleChoiceField(
+ label=_('Relationtypeset'), required=False,
+ queryset=Relationtype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('Relationtypesets'), False,
+ attrs={'rows': '10'}))
+ attributetype_set = MPTTModelMultipleChoiceField(
+ label=_('Attributetypeset'), required=False,
+ queryset=Attributetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('Attributetypesets'), False,
+ attrs={'rows': '10'}))
+ metatype_set = MPTTModelMultipleChoiceField(
+ label=_('Metatypeset'), required=False,
+ queryset=Metatype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('metatypesets'), False,
+ attrs={'rows': '10'}))
+ processtype_set = MPTTModelMultipleChoiceField(
+ label=_('Processtypeset'), required=False,
+ queryset=Processtype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('Processtypesets'), False,
+ attrs={'rows': '10'}))
+
+ priornodes = MPTTModelMultipleChoiceField(
+ label=_('priornodes'), required=False,
+ queryset=Nodetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('nodetypes'), False,
+ attrs={'rows': '10'}))
+
+ posteriornodes = MPTTModelMultipleChoiceField(
+ label=_('posteriornodes'), required=False,
+ queryset=Nodetype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('nodetypes'), False,
+ attrs={'rows': '10'}))
+ def __init__(self, *args, **kwargs):
+ super(SystemtypeAdminForm, self).__init__(*args, **kwargs)
+ ot = ManyToManyRel(Nodetype,'id')
+ rt = ManyToManyRel(Relationtype,'id')
+ at = ManyToManyRel(Attributetype,'id')
+ mt = ManyToManyRel(Metatype,'id')
+ pt = ManyToManyRel(Processtype,'id')
+ prior = ManyToManyRel(Nodetype,'id')
+ post = ManyToManyRel(Nodetype,'id')
+
+ self.fields['nodetype_set'].widget = RelatedFieldWidgetWrapper(
+ self.fields['nodetype_set'].widget, ot, self.admin_site)
+ self.fields['relationtype_set'].widget = RelatedFieldWidgetWrapper(
+ self.fields['relationtype_set'].widget, rt, self.admin_site)
+ self.fields['attributetype_set'].widget = RelatedFieldWidgetWrapper(
+ self.fields['attributetype_set'].widget, at, self.admin_site)
+ self.fields['metatype_set'].widget = RelatedFieldWidgetWrapper(
+ self.fields['metatype_set'].widget, mt, self.admin_site)
+ self.fields['processtype_set'].widget = RelatedFieldWidgetWrapper(
+ self.fields['processtype_set'].widget, pt, self.admin_site)
+ self.fields['priornodes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['priornodes'].widget, prior, self.admin_site)
+ self.fields['posteriornodes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['posteriornodes'].widget, post, self.admin_site)
+
+
+
+
+ class Meta:
+ """SystemAdminForm's Meta"""
+ model = Systemtype
+
+
+class AttributeSpecificationAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeSpecification
+
+class RelationSpecificationAdminForm(forms.ModelForm):
+ class Meta:
+ model = RelationSpecification
+
+class NodeSpecificationAdminForm(forms.ModelForm):
+ class Meta:
+ model = NodeSpecification
+
+class UnionAdminForm(forms.ModelForm):
+ class Meta:
+ model = Union
+
+class ComplementAdminForm(forms.ModelForm):
+ class Meta:
+ model = Complement
+
+
+
+class IntersectionAdminForm(forms.ModelForm):
+ class Meta:
+ model = Intersection
+
+
+class ExpressionAdminForm(forms.ModelForm):
+ class Meta:
+ model = Expression
+
+### Datatypes here ###
+
+class AttributeCharFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeCharField
+
+class AttributeTextFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeTextField
+
+class AttributeIntegerFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeIntegerField
+
+class AttributeCommaSeparatedIntegerFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeCommaSeparatedIntegerField
+class AttributeBigIntegerFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeBigIntegerField
+class AttributePositiveIntegerFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributePositiveIntegerField
+
+class AttributeDecimalFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeDecimalField
+class AttributeFloatFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeFloatField
+class AttributeBooleanFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeBooleanField
+
+class AttributeNullBooleanFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeNullBooleanField
+class AttributeDateFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeDateField
+class AttributeDateTimeFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeDateField
+
+class AttributeTimeFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeTimeField
+
+class AttributeEmailFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeEmailField
+class AttributeFileFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeFileField
+class AttributeFilePathFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeFilePathField
+class AttributeImageFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeImageField
+
+class AttributeURLFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeURLField
+class AttributeIPAddressFieldAdminForm(forms.ModelForm):
+ class Meta:
+ model = AttributeIPAddressField
+
+
+
+
+
+
+
+
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/intersection.py b/build/lib.linux-i686-2.6/gstudio/admin/intersection.py
new file mode 100644
index 0000000..6e9dd3e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/intersection.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import IntersectionAdminForm
+import reversion
+
+class IntersectionAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/metatype.py b/build/lib.linux-i686-2.6/gstudio/admin/metatype.py
new file mode 100644
index 0000000..bb24fc7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/metatype.py
@@ -0,0 +1,30 @@
+"""MetatypeAdmin for Gstudio"""
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import MetatypeAdminForm
+import reversion
+
+class MetatypeAdmin(reversion.VersionAdmin):
+ """Admin for Metatype model"""
+ form = MetatypeAdminForm
+ fields = ('title','altnames', 'parent', 'description', 'slug')
+ list_display = ('title', 'slug', 'get_tree_path', 'description')
+ prepopulated_fields = {'slug': ('title', )}
+ search_fields = ('title', 'description')
+ list_filter = ('parent',)
+
+ def __init__(self, model, admin_site):
+ self.form.admin_site = admin_site
+ super(MetatypeAdmin, self).__init__(model, admin_site)
+
+ def get_tree_path(self, metatype):
+ """Return the metatype's tree path in HTML"""
+ try:
+ return '<a href="%s" target="blank">/%s/</a>' % \
+ (metatype.get_absolute_url(), metatype.tree_path)
+ except NoReverseMatch:
+ return '/%s/' % metatype.tree_path
+ get_tree_path.allow_tags = True
+ get_tree_path.short_description = _('tree path')
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/nodespecification.py b/build/lib.linux-i686-2.6/gstudio/admin/nodespecification.py
new file mode 100644
index 0000000..aaf784e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/nodespecification.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import NodeSpecificationAdminForm
+import reversion
+
+class NodeSpecificationAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/objecttype.py b/build/lib.linux-i686-2.6/gstudio/admin/objecttype.py
new file mode 100644
index 0000000..c98a0d7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/objecttype.py
@@ -0,0 +1,346 @@
+"""ObjecttypeAdmin for Gstudio"""
+from datetime import datetime
+from django.forms import Media
+from django.contrib import admin
+from django.contrib.auth.models import User
+from django.utils.html import strip_tags
+from django.utils.text import truncate_words
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+from django.conf import settings as project_settings
+from django.utils.translation import ugettext_lazy as _
+from django.core.urlresolvers import reverse, NoReverseMatch
+
+from tagging.models import Tag
+
+import reversion
+from gstudio import settings
+from gstudio.managers import HIDDEN
+from gstudio.managers import PUBLISHED
+from gstudio.ping import DirectoryPinger
+from gstudio.admin.forms import ObjecttypeAdminForm
+
+
+
+
+class ObjecttypeAdmin(reversion.VersionAdmin):
+ """Admin for Objecttype model"""
+ form = ObjecttypeAdminForm
+ date_hierarchy = 'creation_date'
+ fieldsets = ((_('Neighbourhood'), {'fields': ('title','altnames','plural','parent','slug',
+ 'metatypes','tags','image', 'status','content')}),
+ (_('Dependency'), {'fields': ('prior_nodes', 'posterior_nodes',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Options'), {'fields': ('featured', 'excerpt', 'template',
+ 'authors',
+ 'rurl',
+ 'creation_date',
+ 'start_publication',
+ 'end_publication'),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Privacy'), {'fields': ('password', 'login_required',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Discussion'), {'fields': ('comment_enabled',
+ 'pingback_enabled','sites'),'classes': ('collapse', 'collapse-closed')}),
+
+ )
+ list_filter = ('parent','metatypes', 'authors', 'status', 'featured',
+ 'login_required', 'comment_enabled', 'pingback_enabled',
+ 'creation_date', 'start_publication',
+ 'end_publication', 'sites')
+ list_display = ('get_title', 'get_authors', 'get_metatypes',
+ 'get_tags', 'get_sites',
+ 'get_comments_are_open', 'pingback_enabled',
+ 'get_is_actual', 'get_is_visible', 'get_link',
+ 'get_short_url', 'creation_date')
+ radio_fields = {'template': admin.VERTICAL}
+ filter_horizontal = ('metatypes', 'authors' )
+ prepopulated_fields = {'slug': ('title', )}
+ search_fields = ('title', 'excerpt', 'content', 'tags')
+ actions = ['make_mine', 'make_published', 'make_hidden',
+ 'close_comments', 'close_pingbacks',
+ 'ping_directories', 'make_tweet', 'put_on_top']
+ actions_on_top = True
+ actions_on_bottom = True
+
+ def __init__(self, model, admin_site):
+ self.form.admin_site = admin_site
+ super(ObjecttypeAdmin, self).__init__(model, admin_site)
+
+ # Custom Display
+ def get_title(self, nodetype):
+ """Return the title with word count and number of comments"""
+ title = _('%(title)s (%(word_count)i words)') % \
+ {'title': nodetype.title, 'word_count': nodetype.word_count}
+ comments = nodetype.comments.count()
+ if comments:
+ return _('%(title)s (%(comments)i comments)') % \
+ {'title': title, 'comments': comments}
+ return title
+ get_title.short_description = _('title')
+
+ def get_authors(self, nodetype):
+ """Return the authors in HTML"""
+ try:
+ authors = ['<a href="%s" target="blank">%s</a>' %
+ (reverse('gstudio_author_detail',
+ args=[author.username]),
+ author.username) for author in nodetype.authors.all()]
+ except NoReverseMatch:
+ authors = [author.username for author in nodetype.authors.all()]
+ return ', '.join(authors)
+ get_authors.allow_tags = True
+ get_authors.short_description = _('author(s)')
+
+ def get_metatypes(self, nodetype):
+ """Return the metatypes linked in HTML"""
+ try:
+ metatypes = ['<a href="%s" target="blank">%s</a>' %
+ (metatype.get_absolute_url(), metatype.title)
+ for metatype in nodetype.metatypes.all()]
+ except NoReverseMatch:
+ metatypes = [metatype.title for metatype in
+ nodetype.metatypes.all()]
+ return ', '.join(metatypes)
+ get_metatypes.allow_tags = True
+ get_metatypes.short_description = _('metatype(s)')
+
+ def get_tags(self, nodetype):
+ """Return the tags linked in HTML"""
+ try:
+ return ', '.join(['<a href="%s" target="blank">%s</a>' %
+ (reverse('gstudio_tag_detail',
+ args=[tag.name]), tag.name)
+ for tag in Tag.objects.get_for_object(nodetype)])
+ except NoReverseMatch:
+ return nodetype.tags
+ get_tags.allow_tags = True
+ get_tags.short_description = _('tag(s)')
+
+ def get_sites(self, nodetype):
+ """Return the sites linked in HTML"""
+ return ', '.join(
+ ['<a href="http://%(domain)s" target="blank">%(name)s</a>' %
+ site.__dict__ for site in nodetype.sites.all()])
+ get_sites.allow_tags = True
+ get_sites.short_description = _('site(s)')
+
+ def get_comments_are_open(self, nodetype):
+ """Admin wrapper for nodetype.comments_are_open"""
+ return nodetype.comments_are_open
+ get_comments_are_open.boolean = True
+ get_comments_are_open.short_description = _('comment enabled')
+
+ def get_is_actual(self, nodetype):
+ """Admin wrapper for nodetype.is_actual"""
+ return nodetype.is_actual
+ get_is_actual.boolean = True
+ get_is_actual.short_description = _('is actual')
+
+ def get_is_visible(self, nodetype):
+ """Admin wrapper for nodetype.is_visible"""
+ return nodetype.is_visible
+ get_is_visible.boolean = True
+ get_is_visible.short_description = _('is visible')
+
+ def get_link(self, nodetype):
+ """Return a formated link to the nodetype"""
+ return u'<a href="%s" target="blank">%s</a>' % (
+ nodetype.get_absolute_url(), _('View'))
+ get_link.allow_tags = True
+ get_link.short_description = _('View on site')
+
+ def get_short_url(self, nodetype):
+ """Return the short url in HTML"""
+ short_url = nodetype.short_url
+ if not short_url:
+ return _('Unavailable')
+ return '<a href="%(url)s" target="blank">%(url)s</a>' % \
+ {'url': short_url}
+ get_short_url.allow_tags = True
+ get_short_url.short_description = _('short url')
+
+ # Custom Methods
+ def save_model(self, request, nodetype, form, change):
+ """Save the authors, update time, make an excerpt"""
+ if not form.cleaned_data.get('excerpt') and nodetype.status == PUBLISHED:
+ nodetype.excerpt = truncate_words(strip_tags(nodetype.content), 50)
+
+ if nodetype.pk and not request.user.has_perm('gstudio.can_change_author'):
+ form.cleaned_data['authors'] = nodetype.authors.all()
+
+ if not form.cleaned_data.get('authors'):
+ form.cleaned_data['authors'].append(request.user)
+
+ nodetype.last_update = datetime.now()
+ nodetype.save()
+
+ def queryset(self, request):
+ """Make special filtering by user permissions"""
+ queryset = super(ObjecttypeAdmin, self).queryset(request)
+ if request.user.has_perm('gstudio.can_view_all'):
+ return queryset
+ return request.user.nodetypes.all()
+
+ def formfield_for_manytomany(self, db_field, request, **kwargs):
+ """Filters the disposable authors"""
+ if db_field.name == 'authors':
+ if request.user.has_perm('gstudio.can_change_author'):
+ kwargs['queryset'] = User.objects.filter(is_staff=True)
+ else:
+ kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
+
+ return super(ObjecttypeAdmin, self).formfield_for_manytomany(
+ db_field, request, **kwargs)
+
+ def get_actions(self, request):
+ """Define user actions by permissions"""
+ actions = super(ObjecttypeAdmin, self).get_actions(request)
+ if not request.user.has_perm('gstudio.can_change_author') \
+ or not request.user.has_perm('gstudio.can_view_all'):
+ del actions['make_mine']
+ if not settings.PING_DIRECTORIES:
+ del actions['ping_directories']
+ if not settings.USE_TWITTER:
+ del actions['make_tweet']
+
+ return actions
+
+ # Custom Actions
+ def make_mine(self, request, queryset):
+ """Set the nodetypes to the user"""
+ for nodetype in queryset:
+ if request.user not in nodetype.authors.all():
+ nodetype.authors.add(request.user)
+ self.message_user(
+ request, _('The selected nodetypes now belong to you.'))
+ make_mine.short_description = _('Set the nodetypes to the user')
+
+ def make_published(self, request, queryset):
+ """Set nodetypes selected as published"""
+ queryset.update(status=PUBLISHED)
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(
+ request, _('The selected nodetypes are now marked as published.'))
+ make_published.short_description = _('Set nodetypes selected as published')
+
+ def make_hidden(self, request, queryset):
+ """Set nodetypes selected as hidden"""
+ queryset.update(status=HIDDEN)
+ self.message_user(
+ request, _('The selected nodetypes are now marked as hidden.'))
+ make_hidden.short_description = _('Set nodetypes selected as hidden')
+
+ def make_tweet(self, request, queryset):
+ """Post an update on Twitter"""
+ import tweepy
+ auth = tweepy.OAuthHandler(settings.TWITTER_CONSUMER_KEY,
+ settings.TWITTER_CONSUMER_SECRET)
+ auth.set_access_token(settings.TWITTER_ACCESS_KEY,
+ settings.TWITTER_ACCESS_SECRET)
+ api = tweepy.API(auth)
+ for nodetype in queryset:
+ short_url = nodetype.short_url
+ message = '%s %s' % (nodetype.title[:139 - len(short_url)], short_url)
+ api.update_status(message)
+ self.message_user(
+ request, _('The selected nodetypes have been tweeted.'))
+ make_tweet.short_description = _('Tweet nodetypes selected')
+
+ def close_comments(self, request, queryset):
+ """Close the comments for selected nodetypes"""
+ queryset.update(comment_enabled=False)
+ self.message_user(
+ request, _('Comments are now closed for selected nodetypes.'))
+ close_comments.short_description = _('Close the comments for '\
+ 'selected nodetypes')
+
+ def close_pingbacks(self, request, queryset):
+ """Close the pingbacks for selected nodetypes"""
+ queryset.update(pingback_enabled=False)
+ self.message_user(
+ request, _('Linkbacks are now closed for selected nodetypes.'))
+ close_pingbacks.short_description = _(
+ 'Close the linkbacks for selected nodetypes')
+
+ def put_on_top(self, request, queryset):
+ """Put the selected nodetypes on top at the current date"""
+ queryset.update(creation_date=datetime.now())
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(request, _(
+ 'The selected nodetypes are now set at the current date.'))
+ put_on_top.short_description = _(
+ 'Put the selected nodetypes on top at the current date')
+
+ def ping_directories(self, request, queryset, messages=True):
+ """Ping Directories for selected nodetypes"""
+ for directory in settings.PING_DIRECTORIES:
+ pinger = DirectoryPinger(directory, queryset)
+ pinger.join()
+ if messages:
+ success = 0
+ for result in pinger.results:
+ if not result.get('flerror', True):
+ success += 1
+ else:
+ self.message_user(request,
+ '%s : %s' % (directory,
+ result['message']))
+ if success:
+ self.message_user(
+ request,
+ _('%(directory)s directory succesfully ' \
+ 'pinged %(success)d nodetypes.') %
+ {'directory': directory, 'success': success})
+ ping_directories.short_description = _(
+ 'Ping Directories for selected nodetypes')
+
+ def get_urls(self):
+ nodetype_admin_urls = super(ObjecttypeAdmin, self).get_urls()
+ urls = patterns(
+ 'django.views.generic.simple',
+ url(r'^autocomplete_tags/$', 'direct_to_template',
+ {'template': 'admin/gstudio/nodetype/autocomplete_tags.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_nodetype_autocomplete_tags'),
+ url(r'^wymeditor/$', 'direct_to_template',
+ {'template': 'admin/gstudio/nodetype/wymeditor.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_nodetype_wymeditor'),
+ url(r'^markitup/$', 'direct_to_template',
+ {'template': 'admin/gstudio/nodetype/markitup.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_nodetype_markitup'),)
+ return urls + nodetype_admin_urls
+
+ def _media(self):
+ STATIC_URL = '%sgstudio/' % project_settings.STATIC_URL
+ media = super(ObjecttypeAdmin, self).media + Media(
+ css={'all': ('%scss/jquery.autocomplete.css' % STATIC_URL,)},
+ js=('%sjs/jquery.js' % STATIC_URL,
+ '%sjs/jquery.bgiframe.js' % STATIC_URL,
+ '%sjs/jquery.autocomplete.js' % STATIC_URL,
+ reverse('admin:gstudio_nodetype_autocomplete_tags'),))
+
+ if settings.WYSIWYG == 'wymeditor':
+ media += Media(
+ js=('%sjs/wymeditor/jquery.wymeditor.pack.js' % STATIC_URL,
+ '%sjs/wymeditor/plugins/hovertools/'
+ 'jquery.wymeditor.hovertools.js' % STATIC_URL,
+ reverse('admin:gstudio_nodetype_wymeditor')))
+ elif settings.WYSIWYG == 'tinymce':
+ from tinymce.widgets import TinyMCE
+ media += TinyMCE().media + Media(
+ js=(reverse('tinymce-js', args=('admin/gstudio/nodetype',)),))
+ elif settings.WYSIWYG == 'markitup':
+ media += Media(
+ js=('%sjs/markitup/jquery.markitup.js' % STATIC_URL,
+ '%sjs/markitup/sets/%s/set.js' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE),
+ reverse('admin:gstudio_nodetype_markitup')),
+ css={'all': (
+ '%sjs/markitup/skins/django/style.css' % STATIC_URL,
+ '%sjs/markitup/sets/%s/style.css' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE))})
+ return media
+ media = property(_media)
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/processtype.py b/build/lib.linux-i686-2.6/gstudio/admin/processtype.py
new file mode 100644
index 0000000..72a795b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/processtype.py
@@ -0,0 +1,349 @@
+"""AttributetypeAdmin for Gstudio"""
+from datetime import datetime
+
+from django.forms import Media
+from django.contrib import admin
+from django.contrib.auth.models import User
+from django.utils.html import strip_tags
+from django.utils.text import truncate_words
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+from django.conf import settings as project_settings
+from django.utils.translation import ugettext_lazy as _
+from django.core.urlresolvers import reverse, NoReverseMatch
+
+from tagging.models import Tag
+
+import reversion
+from gstudio import settings
+from gstudio.managers import HIDDEN
+from gstudio.managers import PUBLISHED
+from gstudio.ping import DirectoryPinger
+from gstudio.admin.forms import ProcesstypeAdminForm
+
+
+
+
+class ProcesstypeAdmin(reversion.VersionAdmin):
+ """Admin for Processtype model"""
+ form = ProcesstypeAdminForm
+ date_hierarchy = 'creation_date'
+ fieldsets = ((_('Neighbourhood'), {'fields': ('title','altnames' ,'content', 'parent',
+ 'image', 'slug','status')}),
+ (_('Processtype Definiton'), {'fields': ('attributetype_set','relationtype_set'),
+ 'classes': ('collapse', 'collapse-closed')}),
+
+ (_('Dependency'), {'fields': ('prior_nodes', 'posterior_nodes',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Options'), {'fields': ('featured', 'excerpt', 'template',
+ 'authors',
+ 'creation_date',
+ 'start_publication',
+ 'end_publication'),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Privacy'), {'fields': ('password', 'login_required',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Publication'), {'fields': ('tags',
+ 'sites')}))
+
+
+ list_filter = ('parent','metatypes', 'authors', 'status', 'featured',
+ 'login_required', 'comment_enabled', 'pingback_enabled',
+ 'creation_date', 'start_publication',
+ 'end_publication', 'sites')
+ list_display = ('get_title', 'get_authors', 'get_metatypes',
+ 'get_tags', 'get_sites',
+ 'get_comments_are_open', 'pingback_enabled',
+ 'get_is_actual', 'get_is_visible', 'get_link',
+ 'get_short_url', 'creation_date')
+ radio_fields = {'template': admin.VERTICAL}
+ filter_horizontal = ('metatypes', 'authors')
+ prepopulated_fields = {'slug': ('title', )}
+ search_fields = ('title', 'excerpt', 'content', 'tags')
+ actions = ['make_mine', 'make_published', 'make_hidden',
+ 'close_comments', 'close_pingbacks',
+ 'ping_directories', 'make_tweet', 'put_on_top']
+ actions_on_top = True
+ actions_on_bottom = True
+
+ def __init__(self, model, admin_site):
+ self.form.admin_site = admin_site
+ super(ProcesstypeAdmin, self).__init__(model, admin_site)
+
+ # Custom Display
+ def get_title(self, processtype):
+ """Return the title with word count and number of comments"""
+ title = _('%(title)s (%(word_count)i words)') % \
+ {'title': processtype.title, 'word_count': processtype.word_count}
+ comments = processtype.comments.count()
+ if comments:
+ return _('%(title)s (%(comments)i comments)') % \
+ {'title': title, 'comments': comments}
+ return title
+ get_title.short_description = _('title')
+
+ def get_authors(self, processtype):
+ """Return the authors in HTML"""
+ try:
+ authors = ['<a href="%s" target="blank">%s</a>' %
+ (reverse('gstudio_author_detail',
+ args=[author.username]),
+ author.username) for author in processtype.authors.all()]
+ except NoReverseMatch:
+ authors = [author.username for author in processtype.authors.all()]
+ return ', '.join(authors)
+ get_authors.allow_tags = True
+ get_authors.short_description = _('author(s)')
+
+ def get_metatypes(self, processtype):
+ """Return the metatypes linked in HTML"""
+ try:
+ metatypes = ['<a href="%s" target="blank">%s</a>' %
+ (metatype.get_absolute_url(), metatype.title)
+ for metatype in processtype.metatypes.all()]
+ except NoReverseMatch:
+ metatypes = [metatype.title for metatype in
+ processtype.metatypes.all()]
+ return ', '.join(metatypes)
+ get_metatypes.allow_tags = True
+ get_metatypes.short_description = _('metatype(s)')
+
+ def get_tags(self, processtype):
+ """Return the tags linked in HTML"""
+ try:
+ return ', '.join(['<a href="%s" target="blank">%s</a>' %
+ (reverse('gstudio_tag_detail',
+ args=[tag.name]), tag.name)
+ for tag in Tag.processs.get_for_process(processtype)])
+ except NoReverseMatch:
+ return processtype.tags
+ get_tags.allow_tags = True
+ get_tags.short_description = _('tag(s)')
+
+ def get_sites(self, processtype):
+ """Return the sites linked in HTML"""
+ return ', '.join(
+ ['<a href="http://%(domain)s" target="blank">%(name)s</a>' %
+ site.__dict__ for site in processtype.sites.all()])
+ get_sites.allow_tags = True
+ get_sites.short_description = _('site(s)')
+
+ def get_comments_are_open(self, processtype):
+ """Admin wrapper for processtype.comments_are_open"""
+ return processtype.comments_are_open
+ get_comments_are_open.boolean = True
+ get_comments_are_open.short_description = _('comment enabled')
+
+ def get_is_actual(self, processtype):
+ """Admin wrapper for processtype.is_actual"""
+ return processtype.is_actual
+ get_is_actual.boolean = True
+ get_is_actual.short_description = _('is actual')
+
+ def get_is_visible(self, processtype):
+ """Admin wrapper for processtype.is_visible"""
+ return processtype.is_visible
+ get_is_visible.boolean = True
+ get_is_visible.short_description = _('is visible')
+
+ def get_link(self, processtype):
+ """Return a formated link to the processtype"""
+ return u'<a href="%s" target="blank">%s</a>' % (
+ processtype.get_absolute_url(), _('View'))
+ get_link.allow_tags = True
+ get_link.short_description = _('View on site')
+
+ def get_short_url(self, processtype):
+ """Return the short url in HTML"""
+ short_url = processtype.short_url
+ if not short_url:
+ return _('Unavailable')
+ return '<a href="%(url)s" target="blank">%(url)s</a>' % \
+ {'url': short_url}
+ get_short_url.allow_tags = True
+ get_short_url.short_description = _('short url')
+
+ # Custom Methods
+ def save_model(self, request, processtype, form, change):
+ """Save the authors, update time, make an excerpt"""
+ if not form.cleaned_data.get('excerpt') and processtype.status == PUBLISHED:
+ processtype.excerpt = truncate_words(strip_tags(processtype.content), 50)
+
+ if processtype.pk and not request.user.has_perm('gstudio.can_change_author'):
+ form.cleaned_data['authors'] = processtype.authors.all()
+
+ if not form.cleaned_data.get('authors'):
+ form.cleaned_data['authors'].append(request.user)
+
+ processtype.last_update = datetime.now()
+ processtype.save()
+
+ def queryset(self, request):
+ """Make special filtering by user permissions"""
+ queryset = super(ProcesstypeAdmin, self).queryset(request)
+ if request.user.has_perm('gstudio.can_view_all'):
+ return queryset
+ return request.user.processtypes.all()
+
+ def formfield_for_manytomany(self, db_field, request, **kwargs):
+ """Filters the disposable authors"""
+ if db_field.name == 'authors':
+ if request.user.has_perm('gstudio.can_change_author'):
+ kwargs['queryset'] = User.objects.filter(is_staff=True)
+ else:
+ kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
+
+ return super(ProcesstypeAdmin, self).formfield_for_manytomany(
+ db_field, request, **kwargs)
+
+ def get_actions(self, request):
+ """Define user actions by permissions"""
+ actions = super(ProcesstypeAdmin, self).get_actions(request)
+ if not request.user.has_perm('gstudio.can_change_author') \
+ or not request.user.has_perm('gstudio.can_view_all'):
+ del actions['make_mine']
+ if not settings.PING_DIRECTORIES:
+ del actions['ping_directories']
+ if not settings.USE_TWITTER:
+ del actions['make_tweet']
+
+ return actions
+
+ # Custom Actions
+ def make_mine(self, request, queryset):
+ """Set the processtypes to the user"""
+ for processtype in queryset:
+ if request.user not in processtype.authors.all():
+ processtype.authors.add(request.user)
+ self.message_user(
+ request, _('The selected processtypes now belong to you.'))
+ make_mine.short_description = _('Set the processtypes to the user')
+
+ def make_published(self, request, queryset):
+ """Set processtypes selected as published"""
+ queryset.update(status=PUBLISHED)
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(
+ request, _('The selected processtypes are now marked as published.'))
+ make_published.short_description = _('Set processtypes selected as published')
+
+ def make_hidden(self, request, queryset):
+ """Set processtypes selected as hidden"""
+ queryset.update(status=HIDDEN)
+ self.message_user(
+ request, _('The selected processtypes are now marked as hidden.'))
+ make_hidden.short_description = _('Set processtypes selected as hidden')
+
+ def make_tweet(self, request, queryset):
+ """Post an update on Twitter"""
+ import tweepy
+ auth = tweepy.OAuthHandler(settings.TWITTER_CONSUMER_KEY,
+ settings.TWITTER_CONSUMER_SECRET)
+ auth.set_access_token(settings.TWITTER_ACCESS_KEY,
+ settings.TWITTER_ACCESS_SECRET)
+ api = tweepy.API(auth)
+ for processtype in queryset:
+ short_url = processtype.short_url
+ message = '%s %s' % (processtype.title[:139 - len(short_url)], short_url)
+ api.update_status(message)
+ self.message_user(
+ request, _('The selected processtypes have been tweeted.'))
+ make_tweet.short_description = _('Tweet processtypes selected')
+
+ def close_comments(self, request, queryset):
+ """Close the comments for selected processtypes"""
+ queryset.update(comment_enabled=False)
+ self.message_user(
+ request, _('Comments are now closed for selected processtypes.'))
+ close_comments.short_description = _('Close the comments for '\
+ 'selected processtypes')
+
+ def close_pingbacks(self, request, queryset):
+ """Close the pingbacks for selected processtypes"""
+ queryset.update(pingback_enabled=False)
+ self.message_user(
+ request, _('Linkbacks are now closed for selected processtypes.'))
+ close_pingbacks.short_description = _(
+ 'Close the linkbacks for selected processtypes')
+
+ def put_on_top(self, request, queryset):
+ """Put the selected processtypes on top at the current date"""
+ queryset.update(creation_date=datetime.now())
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(request, _(
+ 'The selected processtypes are now set at the current date.'))
+ put_on_top.short_description = _(
+ 'Put the selected processtypes on top at the current date')
+
+ def ping_directories(self, request, queryset, messages=True):
+ """Ping Directories for selected processtypes"""
+ for directory in settings.PING_DIRECTORIES:
+ pinger = DirectoryPinger(directory, queryset)
+ pinger.join()
+ if messages:
+ success = 0
+ for result in pinger.results:
+ if not result.get('flerror', True):
+ success += 1
+ else:
+ self.message_user(request,
+ '%s : %s' % (directory,
+ result['message']))
+ if success:
+ self.message_user(
+ request,
+ _('%(directory)s directory succesfully ' \
+ 'pinged %(success)d processtypes.') %
+ {'directory': directory, 'success': success})
+ ping_directories.short_description = _(
+ 'Ping Directories for selected processtypes')
+
+ def get_urls(self):
+ processtype_admin_urls = super(ProcesstypeAdmin, self).get_urls()
+ urls = patterns(
+ 'django.views.generic.simple',
+ url(r'^autocomplete_tags/$', 'direct_to_template',
+ {'template': 'admin/gstudio/processtype/autocomplete_tags.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_processtype_autocomplete_tags'),
+ url(r'^wymeditor/$', 'direct_to_template',
+ {'template': 'admin/gstudio/processtype/wymeditor.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_processtype_wymeditor'),
+ url(r'^markitup/$', 'direct_to_template',
+ {'template': 'admin/gstudio/processtype/markitup.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_processtype_markitup'),)
+ return urls + processtype_admin_urls
+
+ def _media(self):
+ STATIC_URL = '%sgstudio/' % project_settings.STATIC_URL
+ media = super(ProcesstypeAdmin, self).media + Media(
+ css={'all': ('%scss/jquery.autocomplete.css' % STATIC_URL,)},
+ js=('%sjs/jquery.js' % STATIC_URL,
+ '%sjs/jquery.bgiframe.js' % STATIC_URL,
+ '%sjs/jquery.autocomplete.js' % STATIC_URL,
+ reverse('admin:gstudio_processtype_autocomplete_tags'),))
+
+ if settings.WYSIWYG == 'wymeditor':
+ media += Media(
+ js=('%sjs/wymeditor/jquery.wymeditor.pack.js' % STATIC_URL,
+ '%sjs/wymeditor/plugins/hovertools/'
+ 'jquery.wymeditor.hovertools.js' % STATIC_URL,
+ reverse('admin:gstudio_processtype_wymeditor')))
+ elif settings.WYSIWYG == 'tinymce':
+ from tinymce.widgets import TinyMCE
+ media += TinyMCE().media + Media(
+ js=(reverse('tinymce-js', args=('admin/gstudio/processtype',)),))
+ elif settings.WYSIWYG == 'markitup':
+ media += Media(
+ js=('%sjs/markitup/jquery.markitup.js' % STATIC_URL,
+ '%sjs/markitup/sets/%s/set.js' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE),
+ reverse('admin:gstudio_processtype_markitup')),
+ css={'all': (
+ '%sjs/markitup/skins/django/style.css' % STATIC_URL,
+ '%sjs/markitup/sets/%s/style.css' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE))})
+ return media
+ media = property(_media)
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/relation.py b/build/lib.linux-i686-2.6/gstudio/admin/relation.py
new file mode 100644
index 0000000..04b4e8b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/relation.py
@@ -0,0 +1,13 @@
+"""MetatypeAdmin for Gstudio"""
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import RelationAdminForm
+import reversion
+
+class RelationAdmin(reversion.VersionAdmin):
+ def save_model(self, request, relation, form, change):
+ relation.title = relation.composed_sentence
+ relation.save()
+
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/relationspecification.py b/build/lib.linux-i686-2.6/gstudio/admin/relationspecification.py
new file mode 100644
index 0000000..5da162b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/relationspecification.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import RelationSpecificationAdminForm
+import reversion
+
+class RelationSpecificationAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/relationtype.py b/build/lib.linux-i686-2.6/gstudio/admin/relationtype.py
new file mode 100644
index 0000000..374f9a8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/relationtype.py
@@ -0,0 +1,362 @@
+"""RelationtypeAdmin for Gstudio"""
+from datetime import datetime
+from django.forms import Media
+from django.contrib import admin
+from django.contrib.auth.models import User
+from django.utils.html import strip_tags
+from django.utils.text import truncate_words
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+from django.conf import settings as project_settings
+from django.utils.translation import ugettext_lazy as _
+from django.core.urlresolvers import reverse, NoReverseMatch
+
+from tagging.models import Tag
+
+import reversion
+from gstudio import settings
+from gstudio.managers import HIDDEN
+from gstudio.managers import PUBLISHED
+from gstudio.ping import DirectoryPinger
+from gstudio.admin.forms import RelationtypeAdminForm
+
+
+
+
+class RelationtypeAdmin(reversion.VersionAdmin):
+ """Admin for Relationtype model"""
+ form = RelationtypeAdminForm
+ date_hierarchy = 'creation_date'
+ fieldsets = ((
+ (_('Neighbourhood Definiton'), {'fields': (
+ 'title',
+ 'inverse',
+ 'altnames',
+ 'parent',
+ 'slug',
+
+ 'left_subjecttype',
+ 'left_applicable_nodetypes',
+ 'left_cardinality',
+ 'right_subjecttype',
+ 'right_applicable_nodetypes',
+ 'right_cardinality',
+ 'is_symmetrical',
+ 'is_reflexive',
+ 'is_transitive')
+ }),
+ (_('Content'), {'fields': ('content', 'image',),
+ 'classes': ('collapse', 'collapse-closed')}),
+
+
+ (_('Dependency'), {'fields': ('prior_nodes', 'posterior_nodes',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Options'), {'fields': ('featured', 'excerpt', 'template',
+ 'authors',
+ 'creation_date',
+ 'start_publication',
+ 'end_publication'),
+ 'classes': ('collapse', 'collapse-closed')}),
+ ))
+
+
+ list_filter = ('parent','metatypes', 'authors', 'status', 'featured',
+ 'login_required', 'comment_enabled', 'pingback_enabled',
+ 'creation_date', 'start_publication',
+ 'end_publication', 'sites')
+ list_display = ('get_title', 'get_authors', 'get_metatypes',
+ 'get_tags', 'get_sites',
+ 'get_comments_are_open', 'pingback_enabled',
+ 'get_is_actual', 'get_is_visible', 'get_link',
+ 'get_short_url', 'creation_date')
+ radio_fields = {'template': admin.VERTICAL}
+ filter_horizontal = ('metatypes', 'authors')
+ prepopulated_fields = {'slug': ('title', )}
+ search_fields = ('title', 'excerpt', 'content', 'tags')
+ actions = ['make_mine', 'make_published', 'make_hidden',
+ 'close_comments', 'close_pingbacks',
+ 'ping_directories', 'make_tweet', 'put_on_top']
+ actions_on_top = True
+ actions_on_bottom = True
+
+ def __init__(self, model, admin_site):
+ self.form.admin_site = admin_site
+ super(RelationtypeAdmin, self).__init__(model, admin_site)
+
+ # Custom Display
+ def get_title(self, relationtype):
+ """Return the title with word count and number of comments"""
+ title = _('%(title)s (%(word_count)i words)') % \
+ {'title': relationtype.title, 'word_count': relationtype.word_count}
+ comments = relationtype.comments.count()
+ if comments:
+ return _('%(title)s (%(comments)i comments)') % \
+ {'title': title, 'comments': comments}
+ return title
+ get_title.short_description = _('title')
+
+ def get_authors(self, relationtype):
+ """Return the authors in HTML"""
+ try:
+ authors = ['<a href="%s" target="blank">%s</a>' %
+ (reverse('gstudio_author_detail',
+ args=[author.username]),
+ author.username) for author in relationtype.authors.all()]
+ except NoReverseMatch:
+ authors = [author.username for author in relationtype.authors.all()]
+ return ', '.join(authors)
+ get_authors.allow_tags = True
+ get_authors.short_description = _('author(s)')
+
+ def get_metatypes(self, relationtype):
+ """Return the metatypes linked in HTML"""
+ try:
+ metatypes = ['<a href="%s" target="blank">%s</a>' %
+ (metatype.get_absolute_url(), metatype.title)
+ for metatype in relationtype.metatypes.all()]
+ except NoReverseMatch:
+ metatypes = [metatype.title for metatype in
+ relationtype.metatypes.all()]
+ return ', '.join(metatypes)
+ get_metatypes.allow_tags = True
+ get_metatypes.short_description = _('metatype(s)')
+
+ def get_tags(self, relationtype):
+ """Return the tags linked in HTML"""
+ try:
+ return ', '.join(['<a href="%s" target="blank">%s</a>' %
+ (reverse('gstudio_tag_detail',
+ args=[tag.name]), tag.name)
+ for tag in Tag.relations.get_for_relation(relationtype)])
+ except NoReverseMatch:
+ return relationtype.tags
+ get_tags.allow_tags = True
+ get_tags.short_description = _('tag(s)')
+
+ def get_sites(self, relationtype):
+ """Return the sites linked in HTML"""
+ return ', '.join(
+ ['<a href="http://%(domain)s" target="blank">%(name)s</a>' %
+ site.__dict__ for site in relationtype.sites.all()])
+ get_sites.allow_tags = True
+ get_sites.short_description = _('site(s)')
+
+ def get_comments_are_open(self, relationtype):
+ """Admin wrapper for relationtype.comments_are_open"""
+ return relationtype.comments_are_open
+ get_comments_are_open.boolean = True
+ get_comments_are_open.short_description = _('comment enabled')
+
+ def get_is_actual(self, relationtype):
+ """Admin wrapper for relationtype.is_actual"""
+ return relationtype.is_actual
+ get_is_actual.boolean = True
+ get_is_actual.short_description = _('is actual')
+
+ def get_is_visible(self, relationtype):
+ """Admin wrapper for relationtype.is_visible"""
+ return relationtype.is_visible
+ get_is_visible.boolean = True
+ get_is_visible.short_description = _('is visible')
+
+ def get_link(self, relationtype):
+ """Return a formated link to the relationtype"""
+ return u'<a href="%s" target="blank">%s</a>' % (
+ relationtype.get_absolute_url(), _('View'))
+ get_link.allow_tags = True
+ get_link.short_description = _('View on site')
+
+ def get_short_url(self, relationtype):
+ """Return the short url in HTML"""
+ short_url = relationtype.short_url
+ if not short_url:
+ return _('Unavailable')
+ return '<a href="%(url)s" target="blank">%(url)s</a>' % \
+ {'url': short_url}
+ get_short_url.allow_tags = True
+ get_short_url.short_description = _('short url')
+
+ # Custom Methods
+ def save_model(self, request, relationtype, form, change):
+ """Save the authors, update time, make an excerpt"""
+ if not form.cleaned_data.get('excerpt') and relationtype.status == PUBLISHED:
+ relationtype.excerpt = truncate_words(strip_tags(relationtype.content), 50)
+
+ if relationtype.pk and not request.user.has_perm('gstudio.can_change_author'):
+ form.cleaned_data['authors'] = relationtype.authors.all()
+
+ if not form.cleaned_data.get('authors'):
+ form.cleaned_data['authors'].append(request.user)
+
+ relationtype.last_update = datetime.now()
+ relationtype.save()
+
+ def queryset(self, request):
+ """Make special filtering by user permissions"""
+ queryset = super(RelationtypeAdmin, self).queryset(request)
+ if request.user.has_perm('gstudio.can_view_all'):
+ return queryset
+ return request.user.relationtypes.all()
+
+ def formfield_for_manytomany(self, db_field, request, **kwargs):
+ """Filters the disposable authors"""
+ if db_field.name == 'authors':
+ if request.user.has_perm('gstudio.can_change_author'):
+ kwargs['queryset'] = User.objects.filter(is_staff=True)
+ else:
+ kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
+
+ return super(RelationtypeAdmin, self).formfield_for_manytomany(
+ db_field, request, **kwargs)
+
+ def get_actions(self, request):
+ """Define user actions by permissions"""
+ actions = super(RelationtypeAdmin, self).get_actions(request)
+ if not request.user.has_perm('gstudio.can_change_author') \
+ or not request.user.has_perm('gstudio.can_view_all'):
+ del actions['make_mine']
+ if not settings.PING_DIRECTORIES:
+ del actions['ping_directories']
+ if not settings.USE_TWITTER:
+ del actions['make_tweet']
+
+ return actions
+
+ # Custom Actions
+ def make_mine(self, request, queryset):
+ """Set the relationtypes to the user"""
+ for relationtype in queryset:
+ if request.user not in relationtype.authors.all():
+ relationtype.authors.add(request.user)
+ self.message_user(
+ request, _('The selected relationtypes now belong to you.'))
+ make_mine.short_description = _('Set the relationtypes to the user')
+
+ def make_published(self, request, queryset):
+ """Set relationtypes selected as published"""
+ queryset.update(status=PUBLISHED)
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(
+ request, _('The selected relationtypes are now marked as published.'))
+ make_published.short_description = _('Set relationtypes selected as published')
+
+ def make_hidden(self, request, queryset):
+ """Set relationtypes selected as hidden"""
+ queryset.update(status=HIDDEN)
+ self.message_user(
+ request, _('The selected relationtypes are now marked as hidden.'))
+ make_hidden.short_description = _('Set relationtypes selected as hidden')
+
+ def make_tweet(self, request, queryset):
+ """Post an update on Twitter"""
+ import tweepy
+ auth = tweepy.OAuthHandler(settings.TWITTER_CONSUMER_KEY,
+ settings.TWITTER_CONSUMER_SECRET)
+ auth.set_access_token(settings.TWITTER_ACCESS_KEY,
+ settings.TWITTER_ACCESS_SECRET)
+ api = tweepy.API(auth)
+ for relationtype in queryset:
+ short_url = relationtype.short_url
+ message = '%s %s' % (relationtype.title[:139 - len(short_url)], short_url)
+ api.update_status(message)
+ self.message_user(
+ request, _('The selected relationtypes have been tweeted.'))
+ make_tweet.short_description = _('Tweet relationtypes selected')
+
+ def close_comments(self, request, queryset):
+ """Close the comments for selected relationtypes"""
+ queryset.update(comment_enabled=False)
+ self.message_user(
+ request, _('Comments are now closed for selected relationtypes.'))
+ close_comments.short_description = _('Close the comments for '\
+ 'selected relationtypes')
+
+ def close_pingbacks(self, request, queryset):
+ """Close the pingbacks for selected relationtypes"""
+ queryset.update(pingback_enabled=False)
+ self.message_user(
+ request, _('Linkbacks are now closed for selected relationtypes.'))
+ close_pingbacks.short_description = _(
+ 'Close the linkbacks for selected relationtypes')
+
+ def put_on_top(self, request, queryset):
+ """Put the selected relationtypes on top at the current date"""
+ queryset.update(creation_date=datetime.now())
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(request, _(
+ 'The selected relationtypes are now set at the current date.'))
+ put_on_top.short_description = _(
+ 'Put the selected relationtypes on top at the current date')
+
+ def ping_directories(self, request, queryset, messages=True):
+ """Ping Directories for selected relationtypes"""
+ for directory in settings.PING_DIRECTORIES:
+ pinger = DirectoryPinger(directory, queryset)
+ pinger.join()
+ if messages:
+ success = 0
+ for result in pinger.results:
+ if not result.get('flerror', True):
+ success += 1
+ else:
+ self.message_user(request,
+ '%s : %s' % (directory,
+ result['message']))
+ if success:
+ self.message_user(
+ request,
+ _('%(directory)s directory succesfully ' \
+ 'pinged %(success)d relationtypes.') %
+ {'directory': directory, 'success': success})
+ ping_directories.short_description = _(
+ 'Ping Directories for selected relationtypes')
+
+ def get_urls(self):
+ relationtype_admin_urls = super(RelationtypeAdmin, self).get_urls()
+ urls = patterns(
+ 'django.views.generic.simple',
+ url(r'^autocomplete_tags/$', 'direct_to_template',
+ {'template': 'admin/gstudio/relationtype/autocomplete_tags.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_relationtype_autocomplete_tags'),
+ url(r'^wymeditor/$', 'direct_to_template',
+ {'template': 'admin/gstudio/relationtype/wymeditor.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_relationtype_wymeditor'),
+ url(r'^markitup/$', 'direct_to_template',
+ {'template': 'admin/gstudio/relationtype/markitup.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_relationtype_markitup'),)
+ return urls + relationtype_admin_urls
+
+ def _media(self):
+ STATIC_URL = '%sgstudio/' % project_settings.STATIC_URL
+ media = super(RelationtypeAdmin, self).media + Media(
+ css={'all': ('%scss/jquery.autocomplete.css' % STATIC_URL,)},
+ js=('%sjs/jquery.js' % STATIC_URL,
+ '%sjs/jquery.bgiframe.js' % STATIC_URL,
+ '%sjs/jquery.autocomplete.js' % STATIC_URL,
+ reverse('admin:gstudio_relationtype_autocomplete_tags'),))
+
+ if settings.WYSIWYG == 'wymeditor':
+ media += Media(
+ js=('%sjs/wymeditor/jquery.wymeditor.pack.js' % STATIC_URL,
+ '%sjs/wymeditor/plugins/hovertools/'
+ 'jquery.wymeditor.hovertools.js' % STATIC_URL,
+ reverse('admin:gstudio_relationtype_wymeditor')))
+ elif settings.WYSIWYG == 'tinymce':
+ from tinymce.widgets import TinyMCE
+ media += TinyMCE().media + Media(
+ js=(reverse('tinymce-js', args=('admin/gstudio/relationtype',)),))
+ elif settings.WYSIWYG == 'markitup':
+ media += Media(
+ js=('%sjs/markitup/jquery.markitup.js' % STATIC_URL,
+ '%sjs/markitup/sets/%s/set.js' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE),
+ reverse('admin:gstudio_relationtype_markitup')),
+ css={'all': (
+ '%sjs/markitup/skins/django/style.css' % STATIC_URL,
+ '%sjs/markitup/sets/%s/style.css' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE))})
+ return media
+ media = property(_media)
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/systemtype.py b/build/lib.linux-i686-2.6/gstudio/admin/systemtype.py
new file mode 100644
index 0000000..8a12856
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/systemtype.py
@@ -0,0 +1,352 @@
+"""AttributetypeAdmin for Gstudio"""
+from datetime import datetime
+
+from django.forms import Media
+from django.contrib import admin
+from django.contrib.auth.models import User
+from django.utils.html import strip_tags
+from django.utils.text import truncate_words
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+from django.conf import settings as project_settings
+from django.utils.translation import ugettext_lazy as _
+from django.core.urlresolvers import reverse, NoReverseMatch
+
+from tagging.models import Tag
+
+import reversion
+from gstudio import settings
+from gstudio.managers import HIDDEN
+from gstudio.managers import PUBLISHED
+from gstudio.ping import DirectoryPinger
+from gstudio.admin.forms import SystemtypeAdminForm
+
+
+
+
+class SystemtypeAdmin(reversion.VersionAdmin):
+ """Admin for Systemtype model"""
+ form = SystemtypeAdminForm
+ date_hierarchy = 'creation_date'
+
+ fieldsets = ((_('Neighbourhood'), {'fields': ('title', 'altnames','content', 'parent','image', 'slug','status')}),
+ (_('Systemtype definiton'), {'fields': (
+ 'nodetype_set',
+ 'relationtype_set',
+ 'attributetype_set',
+ 'metatype_set',
+ 'processtype_set')}),
+ (_('Dependency'), {'fields': ('prior_nodes', 'posterior_nodes',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Options'), {'fields': ('featured', 'excerpt', 'template',
+ 'authors',
+ 'creation_date',
+ 'start_publication',
+ 'end_publication'),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Privacy'), {'fields': ('password', 'login_required',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Publication'), {'fields': ('tags',
+ 'sites')}))
+
+
+ list_filter = ('parent','metatypes', 'authors', 'status', 'featured',
+ 'login_required', 'comment_enabled', 'pingback_enabled',
+ 'creation_date', 'start_publication',
+ 'end_publication', 'sites')
+ list_display = ('get_title', 'get_authors', 'get_metatypes',
+ 'get_tags', 'get_sites',
+ 'get_comments_are_open', 'pingback_enabled',
+ 'get_is_actual', 'get_is_visible', 'get_link',
+ 'get_short_url', 'creation_date')
+ radio_fields = {'template': admin.VERTICAL}
+ filter_horizontal = ('metatypes', 'authors')
+ prepopulated_fields = {'slug': ('title', )}
+ search_fields = ('title', 'excerpt', 'content', 'tags')
+ actions = ['make_mine', 'make_published', 'make_hidden',
+ 'close_comments', 'close_pingbacks',
+ 'ping_directories', 'make_tweet', 'put_on_top']
+ actions_on_top = True
+ actions_on_bottom = True
+
+ def __init__(self, model, admin_site):
+ self.form.admin_site = admin_site
+ super(SystemtypeAdmin, self).__init__(model, admin_site)
+
+ # Custom Display
+ def get_title(self, systemtype):
+ """Return the title with word count and number of comments"""
+ title = _('%(title)s (%(word_count)i words)') % \
+ {'title': systemtype.title, 'word_count': systemtype.word_count}
+ comments = systemtype.comments.count()
+ if comments:
+ return _('%(title)s (%(comments)i comments)') % \
+ {'title': title, 'comments': comments}
+ return title
+ get_title.short_description = _('title')
+
+ def get_authors(self, systemtype):
+ """Return the authors in HTML"""
+ try:
+ authors = ['<a href="%s" target="blank">%s</a>' %
+ (reverse('gstudio_author_detail',
+ args=[author.username]),
+ author.username) for author in systemtype.authors.all()]
+ except NoReverseMatch:
+ authors = [author.username for author in systemtype.authors.all()]
+ return ', '.join(authors)
+ get_authors.allow_tags = True
+ get_authors.short_description = _('author(s)')
+
+ def get_metatypes(self, systemtype):
+ """Return the metatypes linked in HTML"""
+ try:
+ metatypes = ['<a href="%s" target="blank">%s</a>' %
+ (metatype.get_absolute_url(), metatype.title)
+ for metatype in systemtype.metatypes.all()]
+ except NoReverseMatch:
+ metatypes = [metatype.title for metatype in
+ systemtype.metatypes.all()]
+ return ', '.join(metatypes)
+ get_metatypes.allow_tags = True
+ get_metatypes.short_description = _('metatype(s)')
+
+ def get_tags(self, systemtype):
+ """Return the tags linked in HTML"""
+ try:
+ return ', '.join(['<a href="%s" target="blank">%s</a>' %
+ (reverse('gstudio_tag_detail',
+ args=[tag.name]), tag.name)
+ for tag in Tag.systems.get_for_system(systemtype)])
+ except NoReverseMatch:
+ return systemtype.tags
+ get_tags.allow_tags = True
+ get_tags.short_description = _('tag(s)')
+
+ def get_sites(self, systemtype):
+ """Return the sites linked in HTML"""
+ return ', '.join(
+ ['<a href="http://%(domain)s" target="blank">%(name)s</a>' %
+ site.__dict__ for site in systemtype.sites.all()])
+ get_sites.allow_tags = True
+ get_sites.short_description = _('site(s)')
+
+ def get_comments_are_open(self, systemtype):
+ """Admin wrapper for systemtype.comments_are_open"""
+ return systemtype.comments_are_open
+ get_comments_are_open.boolean = True
+ get_comments_are_open.short_description = _('comment enabled')
+
+ def get_is_actual(self, systemtype):
+ """Admin wrapper for systemtype.is_actual"""
+ return systemtype.is_actual
+ get_is_actual.boolean = True
+ get_is_actual.short_description = _('is actual')
+
+ def get_is_visible(self, systemtype):
+ """Admin wrapper for systemtype.is_visible"""
+ return systemtype.is_visible
+ get_is_visible.boolean = True
+ get_is_visible.short_description = _('is visible')
+
+ def get_link(self, systemtype):
+ """Return a formated link to the systemtype"""
+ return u'<a href="%s" target="blank">%s</a>' % (
+ systemtype.get_absolute_url(), _('View'))
+ get_link.allow_tags = True
+ get_link.short_description = _('View on site')
+
+ def get_short_url(self, systemtype):
+ """Return the short url in HTML"""
+ short_url = systemtype.short_url
+ if not short_url:
+ return _('Unavailable')
+ return '<a href="%(url)s" target="blank">%(url)s</a>' % \
+ {'url': short_url}
+ get_short_url.allow_tags = True
+ get_short_url.short_description = _('short url')
+
+ # Custom Methods
+ def save_model(self, request, systemtype, form, change):
+ """Save the authors, update time, make an excerpt"""
+ if not form.cleaned_data.get('excerpt') and systemtype.status == PUBLISHED:
+ systemtype.excerpt = truncate_words(strip_tags(systemtype.content), 50)
+
+ if systemtype.pk and not request.user.has_perm('gstudio.can_change_author'):
+ form.cleaned_data['authors'] = systemtype.authors.all()
+
+ if not form.cleaned_data.get('authors'):
+ form.cleaned_data['authors'].append(request.user)
+
+ systemtype.last_update = datetime.now()
+ systemtype.save()
+
+ def queryset(self, request):
+ """Make special filtering by user permissions"""
+ queryset = super(SystemtypeAdmin, self).queryset(request)
+ if request.user.has_perm('gstudio.can_view_all'):
+ return queryset
+ return request.user.systemtypes.all()
+
+ def formfield_for_manytomany(self, db_field, request, **kwargs):
+ """Filters the disposable authors"""
+ if db_field.name == 'authors':
+ if request.user.has_perm('gstudio.can_change_author'):
+ kwargs['queryset'] = User.objects.filter(is_staff=True)
+ else:
+ kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
+
+ return super(SystemtypeAdmin, self).formfield_for_manytomany(
+ db_field, request, **kwargs)
+
+ def get_actions(self, request):
+ """Define user actions by permissions"""
+ actions = super(SystemtypeAdmin, self).get_actions(request)
+ if not request.user.has_perm('gstudio.can_change_author') \
+ or not request.user.has_perm('gstudio.can_view_all'):
+ del actions['make_mine']
+ if not settings.PING_DIRECTORIES:
+ del actions['ping_directories']
+ if not settings.USE_TWITTER:
+ del actions['make_tweet']
+
+ return actions
+
+ # Custom Actions
+ def make_mine(self, request, queryset):
+ """Set the systemtypes to the user"""
+ for systemtype in queryset:
+ if request.user not in systemtype.authors.all():
+ systemtype.authors.add(request.user)
+ self.message_user(
+ request, _('The selected systemtypes now belong to you.'))
+ make_mine.short_description = _('Set the systemtypes to the user')
+
+ def make_published(self, request, queryset):
+ """Set systemtypes selected as published"""
+ queryset.update(status=PUBLISHED)
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(
+ request, _('The selected systemtypes are now marked as published.'))
+ make_published.short_description = _('Set systemtypes selected as published')
+
+ def make_hidden(self, request, queryset):
+ """Set systemtypes selected as hidden"""
+ queryset.update(status=HIDDEN)
+ self.message_user(
+ request, _('The selected systemtypes are now marked as hidden.'))
+ make_hidden.short_description = _('Set systemtypes selected as hidden')
+
+ def make_tweet(self, request, queryset):
+ """Post an update on Twitter"""
+ import tweepy
+ auth = tweepy.OAuthHandler(settings.TWITTER_CONSUMER_KEY,
+ settings.TWITTER_CONSUMER_SECRET)
+ auth.set_access_token(settings.TWITTER_ACCESS_KEY,
+ settings.TWITTER_ACCESS_SECRET)
+ api = tweepy.API(auth)
+ for systemtype in queryset:
+ short_url = systemtype.short_url
+ message = '%s %s' % (systemtype.title[:139 - len(short_url)], short_url)
+ api.update_status(message)
+ self.message_user(
+ request, _('The selected systemtypes have been tweeted.'))
+ make_tweet.short_description = _('Tweet systemtypes selected')
+
+ def close_comments(self, request, queryset):
+ """Close the comments for selected systemtypes"""
+ queryset.update(comment_enabled=False)
+ self.message_user(
+ request, _('Comments are now closed for selected systemtypes.'))
+ close_comments.short_description = _('Close the comments for '\
+ 'selected systemtypes')
+
+ def close_pingbacks(self, request, queryset):
+ """Close the pingbacks for selected systemtypes"""
+ queryset.update(pingback_enabled=False)
+ self.message_user(
+ request, _('Linkbacks are now closed for selected systemtypes.'))
+ close_pingbacks.short_description = _(
+ 'Close the linkbacks for selected systemtypes')
+
+ def put_on_top(self, request, queryset):
+ """Put the selected systemtypes on top at the current date"""
+ queryset.update(creation_date=datetime.now())
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(request, _(
+ 'The selected systemtypes are now set at the current date.'))
+ put_on_top.short_description = _(
+ 'Put the selected systemtypes on top at the current date')
+
+ def ping_directories(self, request, queryset, messages=True):
+ """Ping Directories for selected systemtypes"""
+ for directory in settings.PING_DIRECTORIES:
+ pinger = DirectoryPinger(directory, queryset)
+ pinger.join()
+ if messages:
+ success = 0
+ for result in pinger.results:
+ if not result.get('flerror', True):
+ success += 1
+ else:
+ self.message_user(request,
+ '%s : %s' % (directory,
+ result['message']))
+ if success:
+ self.message_user(
+ request,
+ _('%(directory)s directory succesfully ' \
+ 'pinged %(success)d systemtypes.') %
+ {'directory': directory, 'success': success})
+ ping_directories.short_description = _(
+ 'Ping Directories for selected systemtypes')
+
+ def get_urls(self):
+ systemtype_admin_urls = super(SystemtypeAdmin, self).get_urls()
+ urls = patterns(
+ 'django.views.generic.simple',
+ url(r'^autocomplete_tags/$', 'direct_to_template',
+ {'template': 'admin/gstudio/systemtype/autocomplete_tags.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_systemtype_autocomplete_tags'),
+ url(r'^wymeditor/$', 'direct_to_template',
+ {'template': 'admin/gstudio/systemtype/wymeditor.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_systemtype_wymeditor'),
+ url(r'^markitup/$', 'direct_to_template',
+ {'template': 'admin/gstudio/systemtype/markitup.js',
+ 'mimetype': 'application/javascript'},
+ name='gstudio_systemtype_markitup'),)
+ return urls + systemtype_admin_urls
+
+ def _media(self):
+ STATIC_URL = '%sgstudio/' % project_settings.STATIC_URL
+ media = super(SystemtypeAdmin, self).media + Media(
+ css={'all': ('%scss/jquery.autocomplete.css' % STATIC_URL,)},
+ js=('%sjs/jquery.js' % STATIC_URL,
+ '%sjs/jquery.bgiframe.js' % STATIC_URL,
+ '%sjs/jquery.autocomplete.js' % STATIC_URL,
+ reverse('admin:gstudio_systemtype_autocomplete_tags'),))
+
+ if settings.WYSIWYG == 'wymeditor':
+ media += Media(
+ js=('%sjs/wymeditor/jquery.wymeditor.pack.js' % STATIC_URL,
+ '%sjs/wymeditor/plugins/hovertools/'
+ 'jquery.wymeditor.hovertools.js' % STATIC_URL,
+ reverse('admin:gstudio_systemtype_wymeditor')))
+ elif settings.WYSIWYG == 'tinymce':
+ from tinymce.widgets import TinyMCE
+ media += TinyMCE().media + Media(
+ js=(reverse('tinymce-js', args=('admin/gstudio/systemtype',)),))
+ elif settings.WYSIWYG == 'markitup':
+ media += Media(
+ js=('%sjs/markitup/jquery.markitup.js' % STATIC_URL,
+ '%sjs/markitup/sets/%s/set.js' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE),
+ reverse('admin:gstudio_systemtype_markitup')),
+ css={'all': (
+ '%sjs/markitup/skins/django/style.css' % STATIC_URL,
+ '%sjs/markitup/sets/%s/style.css' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE))})
+ return media
+ media = property(_media)
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/union.py b/build/lib.linux-i686-2.6/gstudio/admin/union.py
new file mode 100644
index 0000000..0836936
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/union.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.core.urlresolvers import NoReverseMatch
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.admin.forms import UnionAdminForm
+import reversion
+
+class UnionAdmin(reversion.VersionAdmin):
+ pass
diff --git a/build/lib.linux-i686-2.6/gstudio/admin/widgets.py b/build/lib.linux-i686-2.6/gstudio/admin/widgets.py
new file mode 100644
index 0000000..bc6a962
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/admin/widgets.py
@@ -0,0 +1,107 @@
+"""Widgets for Gstudio admin"""
+from itertools import chain
+
+from django import forms
+from django.conf import settings
+from django.contrib.admin import widgets
+from django.utils.html import escape
+from django.utils.html import conditional_escape
+from django.utils.encoding import smart_unicode
+from django.utils.encoding import force_unicode
+
+
+class TreeNodeChoiceField(forms.ModelChoiceField):
+ """Duplicating the TreeNodeChoiceField bundled in django-mptt
+ to avoid conflict with the TreeNodeChoiceField bundled in django-cms..."""
+ def __init__(self, level_indicator=u'|--', *args, **kwargs):
+ self.level_indicator = level_indicator
+ if kwargs.get('required', True) and not 'empty_label' in kwargs:
+ kwargs['empty_label'] = None
+ super(TreeNodeChoiceField, self).__init__(*args, **kwargs)
+
+ def label_from_instance(self, obj):
+ """Creates labels which represent the tree level of each node
+ when generating option labels."""
+ return u'%s %s' % (self.level_indicator * getattr(
+ obj, obj._mptt_meta.level_attr), smart_unicode(obj))
+
+
+class MPTTModelChoiceIterator(forms.models.ModelChoiceIterator):
+ """MPTT version of ModelChoiceIterator"""
+ def choice(self, obj):
+ """Overriding choice method"""
+ tree_id = getattr(obj, self.queryset.model._mptt_meta.tree_id_attr, 0)
+ left = getattr(obj, self.queryset.model._mptt_meta.left_attr, 0)
+ return super(MPTTModelChoiceIterator,
+ self).choice(obj) + ((tree_id, left),)
+
+
+class MPTTModelMultipleChoiceField(forms.ModelMultipleChoiceField):
+ """MPTT version of ModelMultipleChoiceField"""
+ def __init__(self, level_indicator=u'|--', *args, **kwargs):
+ self.level_indicator = level_indicator
+ super(MPTTModelMultipleChoiceField, self).__init__(*args, **kwargs)
+
+ def label_from_instance(self, obj):
+ """Creates labels which represent the tree level of each node
+ when generating option labels."""
+ return u'%s %s' % (self.level_indicator * getattr(
+ obj, obj._mptt_meta.level_attr), smart_unicode(obj))
+
+ def _get_choices(self):
+ """Overriding _get_choices"""
+ if hasattr(self, '_choices'):
+ return self._choices
+ return MPTTModelChoiceIterator(self)
+
+ choices = property(_get_choices, forms.ChoiceField._set_choices)
+
+
+class MPTTFilteredSelectMultiple(widgets.FilteredSelectMultiple):
+ """MPTT version of FilteredSelectMultiple"""
+ def __init__(self, verbose_name, is_stacked, attrs=None, choices=()):
+ super(MPTTFilteredSelectMultiple, self).__init__(
+ verbose_name, is_stacked, attrs, choices)
+
+ def render_options(self, choices, selected_choices):
+ """
+ This is copy'n'pasted from django.forms.widgets Select(Widget)
+ change to the for loop and render_option so they will unpack
+ and use our extra tuple of mptt sort fields (if you pass in
+ some default choices for this field, make sure they have the
+ extra tuple too!)
+ """
+ def render_option(option_value, option_label, sort_fields):
+ """Inner scope render_option"""
+ option_value = force_unicode(option_value)
+ selected_html = (option_value in selected_choices) \
+ and u' selected="selected"' or ''
+ return u'<option value="%s" data-tree-id="%s" ' \
+ 'data-left-value="%s"%s>%s</option>' % (
+ escape(option_value),
+ sort_fields[0],
+ sort_fields[1],
+ selected_html,
+ conditional_escape(force_unicode(option_label)),
+ )
+ # Normalize to strings.
+ selected_choices = set([force_unicode(v) for v in selected_choices])
+ output = []
+ for option_value, option_label, sort_fields in chain(
+ self.choices, choices):
+ if isinstance(option_label, (list, tuple)):
+ output.append(u'<optgroup label="%s">' % escape(
+ force_unicode(option_value)))
+ for option in option_label:
+ output.append(render_option(*option))
+ output.append(u'</optgroup>')
+ else:
+ output.append(render_option(option_value, option_label,
+ sort_fields))
+ return u'\n'.join(output)
+
+ class Media:
+ """MPTTFilteredSelectMultiple's Media"""
+ js = (settings.ADMIN_MEDIA_PREFIX + 'js/core.js',
+ settings.STATIC_URL + 'gstudio/js/mptt_m2m_selectbox.js',
+ settings.ADMIN_MEDIA_PREFIX + 'js/SelectFilter2.js',)
diff --git a/build/lib.linux-i686-2.6/gstudio/comparison.py b/build/lib.linux-i686-2.6/gstudio/comparison.py
new file mode 100644
index 0000000..45b139f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/comparison.py
@@ -0,0 +1,140 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Comparison tools for Gstudio
+Based on clustered_models app"""
+from math import sqrt
+
+from gstudio.settings import F_MIN
+from gstudio.settings import F_MAX
+
+
+def pearson_score(list1, list2):
+ """Compute the pearson score between 2 lists of vectors"""
+ sum1 = sum(list1)
+ sum2 = sum(list2)
+ sum_sq1 = sum([pow(l, 2) for l in list1])
+ sum_sq2 = sum([pow(l, 2) for l in list2])
+
+ prod_sum = sum([list1[i] * list2[i] for i in range(len(list1))])
+
+ num = prod_sum - (sum1 * sum2 / len(list1))
+ den = sqrt((sum_sq1 - pow(sum1, 2) / len(list1)) *
+ (sum_sq2 - pow(sum2, 2) / len(list2)))
+ if den == 0:
+ return 0.0
+ return 1.0 - num / den
+
+
+class ClusteredModel(object):
+ """Wrapper around Model class
+ building a dataset of instances"""
+
+ def __init__(self, queryset, fields=['id']):
+ self.fields = fields
+ self.queryset = queryset
+
+ def dataset(self):
+ """Generate a dataset with the queryset
+ and specified fields"""
+ dataset = {}
+ for item in self.queryset.filter():
+ dataset[item] = ' '.join([unicode(item.__dict__[field])
+ for field in self.fields])
+ return dataset
+
+
+class VectorBuilder(object):
+ """Build a list of vectors based on datasets"""
+
+ def __init__(self, queryset, fields):
+ self.key = ''
+ self.columns = []
+ self.dataset = {}
+ self.clustered_model = ClusteredModel(queryset, fields)
+ self.build_dataset()
+
+ def build_dataset(self):
+ """Generate whole dataset"""
+ data = {}
+ words_total = {}
+
+ model_data = self.clustered_model.dataset()
+ for instance, words in model_data.items():
+ words_item_total = {}
+ for word in words.split():
+ words_total.setdefault(word, 0)
+ words_item_total.setdefault(word, 0)
+ words_total[word] += 1
+ words_item_total[word] += 1
+ data[instance] = words_item_total
+
+ top_words = []
+ for word, count in words_total.items():
+ frequency = float(count) / len(data)
+ if frequency > F_MIN and frequency < F_MAX:
+ top_words.append(word)
+
+ self.dataset = {}
+ self.columns = top_words
+ for instance in data.keys():
+ self.dataset[instance] = [data[instance].get(word, 0)
+ for word in top_words]
+ self.key = self.generate_key()
+
+ def generate_key(self):
+ """Generate key for this list of vectors"""
+ return self.clustered_model.queryset.count()
+
+ def flush(self):
+ """Flush the dataset"""
+ if self.key != self.generate_key():
+ self.build_dataset()
+
+ def __call__(self):
+ self.flush()
+ return self.columns, self.dataset
diff --git a/build/lib.linux-i686-2.6/gstudio/context_processors.py b/build/lib.linux-i686-2.6/gstudio/context_processors.py
new file mode 100644
index 0000000..5274038
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/context_processors.py
@@ -0,0 +1,24 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Context Processors for Gstudio"""
+from gstudio import __version__
+
+
+def version(request):
+ """Adds version of Gstudio to the context"""
+ return {'GSTUDIO_VERSION': __version__}
diff --git a/build/lib.linux-i686-2.6/gstudio/feeds.py b/build/lib.linux-i686-2.6/gstudio/feeds.py
new file mode 100644
index 0000000..940903f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/feeds.py
@@ -0,0 +1,351 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Feeds for Gstudio"""
+from urlparse import urljoin
+from BeautifulSoup import BeautifulSoup
+
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+from django.shortcuts import get_object_or_404
+from django.utils.feedgenerator import Atom1Feed
+from django.utils.translation import ugettext as _
+from django.contrib.syndication.views import Feed
+from django.core.urlresolvers import NoReverseMatch
+from django.core.exceptions import ObjectDoesNotExist
+
+from tagging.models import Tag
+from tagging.models import TaggedItem
+
+from gstudio.models import Nodetype
+from gstudio.settings import COPYRIGHT
+from gstudio.settings import PROTOCOL
+from gstudio.settings import FEEDS_FORMAT
+from gstudio.settings import FEEDS_MAX_ITEMS
+from gstudio.managers import nodetypes_published
+from gstudio.views.metatypes import get_metatype_or_404
+from gstudio.templatetags.gstudio_tags import get_gravatar
+
+
+class GstudioFeed(Feed):
+ """Base Feed for Gstudio"""
+ feed_copyright = COPYRIGHT
+
+ def __init__(self):
+ self.site = Site.objects.get_current()
+ self.site_url = '%s://%s' % (PROTOCOL, self.site.domain)
+ if FEEDS_FORMAT == 'atom':
+ self.feed_type = Atom1Feed
+ self.subtitle = self.description
+
+
+class NodetypeFeed(GstudioFeed):
+ """Base Nodetype Feed"""
+ title_template = 'feeds/nodetype_title.html'
+ description_template = 'feeds/nodetype_description.html'
+
+ def item_pubdate(self, item):
+ """Publication date of a nodetype"""
+ return item.creation_date
+
+ def item_metatypes(self, item):
+ """Nodetype's metatypes"""
+ return [metatype.title for metatype in item.metatypes.all()]
+
+ def item_author_name(self, item):
+ """Returns the first author of a nodetype"""
+ if item.authors.count():
+ self.item_author = item.authors.all()[0]
+ return self.item_author.username
+
+ def item_author_email(self, item):
+ """Returns the first author's email"""
+ return self.item_author.email
+
+ def item_author_link(self, item):
+ """Returns the author's URL"""
+ try:
+ author_url = reverse('gstudio_author_detail',
+ args=[self.item_author.username])
+ return self.site_url + author_url
+ except NoReverseMatch:
+ return self.site_url
+
+ def item_enclosure_url(self, item):
+ """Returns an image for enclosure"""
+ if item.image:
+ return item.image.url
+
+ img = BeautifulSoup(item.html_content).find('img')
+ if img:
+ return urljoin(self.site_url, img['src'])
+
+ def item_enclosure_length(self, item):
+ """Hardcoded enclosure length"""
+ return '100000'
+
+ def item_enclosure_mime_type(self, item):
+ """Hardcoded enclosure mimetype"""
+ return 'image/jpeg'
+
+
+class LatestNodetypes(NodetypeFeed):
+ """Feed for the latest nodetypes"""
+
+ def link(self):
+ """URL of latest nodetypes"""
+ return reverse('gstudio_nodetype_archive_index')
+
+ def items(self):
+ """Items are published nodetypes"""
+ return Nodetype.published.all()[:FEEDS_MAX_ITEMS]
+
+ def title(self):
+ """Title of the feed"""
+ return '%s - %s' % (self.site.name, _('Latest nodetypes'))
+
+ def description(self):
+ """Description of the feed"""
+ return _('The latest nodetypes for the site %s') % self.site.name
+
+
+class MetatypeNodetypes(NodetypeFeed):
+ """Feed filtered by a metatype"""
+
+ def get_object(self, request, path):
+ """Retrieve the metatype by his path"""
+ return get_metatype_or_404(path)
+
+ def items(self, obj):
+ """Items are the published nodetypes of the metatype"""
+ return obj.nodetypes_published()[:FEEDS_MAX_ITEMS]
+
+ def link(self, obj):
+ """URL of the metatype"""
+ return obj.get_absolute_url()
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Nodetypes for the metatype %s') % obj.title
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest nodetypes for the metatype %s') % obj.title
+
+
+class AuthorNodetypes(NodetypeFeed):
+ """Feed filtered by an author"""
+
+ def get_object(self, request, username):
+ """Retrieve the author by his username"""
+ return get_object_or_404(User, username=username)
+
+ def items(self, obj):
+ """Items are the published nodetypes of the author"""
+ return nodetypes_published(obj.nodetypes)[:FEEDS_MAX_ITEMS]
+
+ def link(self, obj):
+ """URL of the author"""
+ return reverse('gstudio_author_detail', args=[obj.username])
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Nodetypes for author %s') % obj.username
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest nodetypes by %s') % obj.username
+
+
+class TagNodetypes(NodetypeFeed):
+ """Feed filtered by a tag"""
+
+ def get_object(self, request, slug):
+ """Retrieve the tag by his name"""
+ return get_object_or_404(Tag, name=slug)
+
+ def items(self, obj):
+ """Items are the published nodetypes of the tag"""
+ return TaggedItem.objects.get_by_model(
+ Nodetype.published.all(), obj)[:FEEDS_MAX_ITEMS]
+
+ def link(self, obj):
+ """URL of the tag"""
+ return reverse('gstudio_tag_detail', args=[obj.name])
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Nodetypes for the tag %s') % obj.name
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest nodetypes for the tag %s') % obj.name
+
+
+class SearchNodetypes(NodetypeFeed):
+ """Feed filtered by a search pattern"""
+
+ def get_object(self, request):
+ """The GET parameter 'pattern' is the object"""
+ pattern = request.GET.get('pattern', '')
+ if len(pattern) < 3:
+ raise ObjectDoesNotExist
+ return pattern
+
+ def items(self, obj):
+ """Items are the published nodetypes founds"""
+ return Nodetype.published.search(obj)[:FEEDS_MAX_ITEMS]
+
+ def link(self, obj):
+ """URL of the search request"""
+ return '%s?pattern=%s' % (reverse('gstudio_nodetype_search'), obj)
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _("Results of the search for '%s'") % obj
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _("The nodetypes containing the pattern '%s'") % obj
+
+
+class NodetypeDiscussions(GstudioFeed):
+ """Feed for discussions in a nodetype"""
+ title_template = 'feeds/discussion_title.html'
+ description_template = 'feeds/discussion_description.html'
+
+ def get_object(self, request, year, month, day, slug):
+ """Retrieve the discussions by nodetype's slug"""
+ return get_object_or_404(Nodetype.published, slug=slug,
+ creation_date__year=year,
+ creation_date__month=month,
+ creation_date__day=day)
+
+ def items(self, obj):
+ """Items are the discussions on the nodetype"""
+ return obj.discussions[:FEEDS_MAX_ITEMS]
+
+ def item_pubdate(self, item):
+ """Publication date of a discussion"""
+ return item.submit_date
+
+ def item_link(self, item):
+ """URL of the discussion"""
+ return item.get_absolute_url()
+
+ def link(self, obj):
+ """URL of the nodetype"""
+ return obj.get_absolute_url()
+
+ def item_author_name(self, item):
+ """Author of the discussion"""
+ return item.userinfo['name']
+
+ def item_author_email(self, item):
+ """Author's email of the discussion"""
+ return item.userinfo['email']
+
+ def item_author_link(self, item):
+ """Author's URL of the discussion"""
+ return item.userinfo['url']
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Discussions on %s') % obj.title
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest discussions for the nodetype %s') % obj.title
+
+
+class NodetypeComments(NodetypeDiscussions):
+ """Feed for comments in a nodetype"""
+ title_template = 'feeds/comment_title.html'
+ description_template = 'feeds/comment_description.html'
+
+ def items(self, obj):
+ """Items are the comments on the nodetype"""
+ return obj.comments[:FEEDS_MAX_ITEMS]
+
+ def item_link(self, item):
+ """URL of the comment"""
+ return item.get_absolute_url('#comment_%(id)s')
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Comments on %s') % obj.title
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest comments for the nodetype %s') % obj.title
+
+ def item_enclosure_url(self, item):
+ """Returns a gravatar image for enclosure"""
+ return get_gravatar(item.userinfo['email'])
+
+ def item_enclosure_length(self, item):
+ """Hardcoded enclosure length"""
+ return '100000'
+
+ def item_enclosure_mime_type(self, item):
+ """Hardcoded enclosure mimetype"""
+ return 'image/jpeg'
+
+
+class NodetypePingbacks(NodetypeDiscussions):
+ """Feed for pingbacks in a nodetype"""
+ title_template = 'feeds/pingback_title.html'
+ description_template = 'feeds/pingback_description.html'
+
+ def items(self, obj):
+ """Items are the pingbacks on the nodetype"""
+ return obj.pingbacks[:FEEDS_MAX_ITEMS]
+
+ def item_link(self, item):
+ """URL of the pingback"""
+ return item.get_absolute_url('#pingback_%(id)s')
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Pingbacks on %s') % obj.title
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest pingbacks for the nodetype %s') % obj.title
+
+
+class NodetypeTrackbacks(NodetypeDiscussions):
+ """Feed for trackbacks in a nodetype"""
+ title_template = 'feeds/trackback_title.html'
+ description_template = 'feeds/trackback_description.html'
+
+ def items(self, obj):
+ """Items are the trackbacks on the nodetype"""
+ return obj.trackbacks[:FEEDS_MAX_ITEMS]
+
+ def item_link(self, item):
+ """URL of the trackback"""
+ return item.get_absolute_url('#trackback_%(id)s')
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Trackbacks on %s') % obj.title
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest trackbacks for the nodetype %s') % obj.title
diff --git a/build/lib.linux-i686-2.6/gstudio/forms.py b/build/lib.linux-i686-2.6/gstudio/forms.py
new file mode 100644
index 0000000..c4a1a0d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/forms.py
@@ -0,0 +1,94 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+from gstudio.models import *
+from django.forms import ModelForm
+from django.contrib.admin import widgets
+
+class MetatypeForm(ModelForm):
+
+ class Meta:
+ model = Metatype
+
+class ObjecttypeForm(ModelForm):
+
+
+
+
+
+
+ class Meta:
+ model = Objecttype
+ fields = ('title', 'altnames','plural','parent','slug','metatypes','tags',
+ 'status','content','prior_nodes','posterior_nodes','password','login_required','sites')
+
+class AttributetypeForm(ModelForm):
+
+ class Meta:
+ model = Attributetype
+ fields =('title','altnames','subjecttype','applicable_nodetypes','dataType',
+ 'slug','status','content','prior_nodes','posterior_nodes','password','login_required','sites')
+
+class RelationtypeForm(ModelForm):
+
+ class Meta:
+ model = Relationtype
+ fields =('title','altnames','slug','inverse','left_subjecttype','left_applicable_nodetypes','right_subjecttype',
+ 'right_applicable_nodetypes','content','prior_nodes','posterior_nodes','sites')
+class SystemtypeForm(ModelForm):
+
+ class Meta:
+ model =Systemtype
+ fields =('title','altnames','content','parent','slug','status','nodetype_set','relationtype_set','attributetype_set','metatype_set','processtype_set',
+ 'prior_nodes','posterior_nodes','sites')
+
+
+class ProcesstypeForm(ModelForm):
+
+ class Meta:
+ model =Processtype
+ fields =('title','altnames','content','parent','slug','status','changing_attributetype_set','changing_relationtype_set',
+ 'prior_nodes','posterior_nodes','sites')
+
+
+class RelationForm(ModelForm):
+ class Meta:
+ model = Relation
+
+class AttributeForm(ModelForm):
+ def __init__(self, *args, **kwargs):
+ super(AttributeForm, self).__init__(*args, **kwargs)
+ self.fields['last_update'].widget = widgets.AdminSplitDateTime()
+ self.fields['creation_date'].widget = widgets.AdminSplitDateTime()
+
+ class Meta:
+ model = Attribute
+
+
+class ComplementForm(ModelForm):
+ class Meta:
+ model = Complement
+
+class UnionForm(ModelForm):
+ class Meta:
+ model = Union
+
+class IntersectionForm(ModelForm):
+ class Meta:
+ model = Intersection
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/gnowql.py b/build/lib.linux-i686-2.6/gstudio/gnowql.py
new file mode 100644
index 0000000..92edd82
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/gnowql.py
@@ -0,0 +1,85 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+from gstudio.models import *
+from objectapp.models import *
+from reversion.models import Version
+
+MAP = (
+ ('objecttype','Objecttype'),
+ ('gbobject', 'Gbobject')
+ )
+
+
+def get_slug(name):
+ """
+ returns the uri of the node.
+ """
+ try:
+ """
+ note: its very good to use only the meta information given for Version data,
+ individual object information is best retrieved from the main table.
+ # Also Version.object.meta contains a lot of valuable information about the model.
+ """
+ node = NID.objects.get(title=str(name))
+ # Retrieving only the relevant tupleset for the versioned objects
+ vrs = Version.objects.filter(type=0 , object_id=node.id)
+ vrs = vrs[0]
+
+ except:
+ return "The item was not found."
+
+ return vrs.object.get_absolute_url()
+
+def get_nodetype(name):
+ """
+ returns the model the id belongs to.
+ """
+ try:
+ """
+ ALGO: get object id, go to version model, return for the given id.
+ """
+ node = NID.objects.get(title=str(name))
+ # Retrieving only the relevant tupleset for the versioned objects
+ vrs = Version.objects.filter(type=0 , object_id=node.id)
+ # Returned value is a list, so splice it .
+ vrs = vrs[0]
+
+ except:
+ return "The item was not found."
+
+ return vrs.object._meta.module_name
+
+
+
+def get_node(name):
+ """
+ returns a reference to the model object
+ """
+ nt = get_nodetype(name)
+ node = NID.objects.get(title=str(name))
+ this_id = node.id
+ if (nt == 'gbobject'):
+ return Gbobject.objects.get(id=this_id)
+
+ if (nt == 'objecttype'):
+ return Objecttype.objects.get(id=this_id)
+
+ if (nt == 'metatype'):
+ return Metatype.objects.get(id=this_id)
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/bl/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/bl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..4e248d1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/bl/LC_MESSAGES/django.po
@@ -0,0 +1,1299 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:25+0530\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr ""
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr ""
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr ""
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr ""
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr ""
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr ""
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr ""
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr ""
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr ""
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr ""
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr ""
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr ""
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr ""
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr ""
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr ""
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr ""
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr ""
+
+#: models.py:197
+msgid "description"
+msgstr ""
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr ""
+
+#: models.py:283
+msgid "metatype"
+msgstr ""
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr ""
+
+#: models.py:298
+msgid "content"
+msgstr ""
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr ""
+
+#: models.py:310
+msgid "used for illustration"
+msgstr ""
+
+#: models.py:312
+msgid "excerpt"
+msgstr ""
+
+#: models.py:313
+msgid "optional element"
+msgstr ""
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr ""
+
+#: models.py:316
+msgid "member of metatypes"
+msgstr ""
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr ""
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr ""
+
+#: models.py:331
+msgid "featured"
+msgstr ""
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr ""
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr ""
+
+#: models.py:335
+msgid "creation date"
+msgstr ""
+
+#: models.py:337
+msgid "last update"
+msgstr ""
+
+#: models.py:338
+msgid "start publication"
+msgstr ""
+
+#: models.py:339
+msgid "date start publish"
+msgstr ""
+
+#: models.py:341
+msgid "end publication"
+msgstr ""
+
+#: models.py:342
+msgid "date end publish"
+msgstr ""
+
+#: models.py:345
+msgid "sites publication"
+msgstr ""
+
+#: models.py:349
+msgid "login required"
+msgstr ""
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr ""
+
+#: models.py:352
+msgid "password"
+msgstr ""
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr ""
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr ""
+
+#: models.py:358
+msgid "Default template"
+msgstr ""
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr ""
+
+#: models.py:568
+msgid "node type"
+msgstr ""
+
+#: models.py:569
+msgid "node types"
+msgstr ""
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+msgid "relation type"
+msgstr ""
+
+#: models.py:609
+msgid "relation types"
+msgstr ""
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+msgid "attribute types"
+msgstr ""
+
+#: models.py:686
+msgid "relation"
+msgstr ""
+
+#: models.py:687
+msgid "relations"
+msgstr ""
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr ""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr ""
+
+#: admin/forms.py:82
+msgid "A metatype cannot be a parent of itself."
+msgstr ""
+
+#: admin/forms.py:94
+msgid "parent nodetype"
+msgstr ""
+
+#: admin/forms.py:95
+msgid "No parent nodetype"
+msgstr ""
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr ""
+
+#: admin/forms.py:116
+msgid "An objectype cannot be parent of itself."
+msgstr ""
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr ""
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr ""
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr ""
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr ""
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr ""
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr ""
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr ""
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr ""
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr ""
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr ""
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr ""
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr ""
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr ""
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr ""
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr ""
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr ""
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr ""
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr ""
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr ""
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr ""
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr ""
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr ""
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr ""
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr ""
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr ""
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr ""
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+msgid "Random node types"
+msgstr ""
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr ""
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr ""
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr ""
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr ""
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr ""
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr ""
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr ""
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr ""
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr ""
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr ""
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr ""
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr ""
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr ""
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr ""
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr ""
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr ""
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr ""
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+msgid "Recent node types"
+msgstr ""
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr ""
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr ""
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr ""
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr ""
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr ""
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr ""
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr ""
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr ""
+
+#: templates/gstudio/base.html:68
+msgid "Popular node types"
+msgstr ""
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr ""
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr ""
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr ""
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr ""
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr ""
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr ""
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:46
+msgid "Next node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:60
+msgid "Previous node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:73
+msgid "Related node types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:84
+msgid "Similar node types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:212
+msgid "Edit the node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr ""
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr ""
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr ""
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr ""
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr ""
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:19
+msgid "No tags yet."
+msgstr ""
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+msgid "No node types yet."
+msgstr ""
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr ""
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+msgid "No subtypes yet."
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:10
+msgid "More recent node types"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr ""
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr ""
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr ""
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr ""
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr ""
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr ""
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr ""
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/de/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/gstudio/locale/de/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..5f8a2bc
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/de/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/de/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/de/LC_MESSAGES/django.po
new file mode 100644
index 0000000..68a3415
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/de/LC_MESSAGES/django.po
@@ -0,0 +1,1341 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011.
+# Julien Fache <fastomas42@gmail.com>, 2011.
+# madcad <mail@mad-cad.net>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-gstudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:24+0530\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fastomas42@gmail.com>\n"
+"Language-Team: German (http://www.transifex.net/projects/p/django-gstudio/"
+"team/de/)\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr "Neuste Einträge"
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr "Die neusten Einträge der Seite %s"
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr "Einträge der Kategorie %s"
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr "Die neusten Einträge in Kategorie %s"
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr "Einträge für Autor %s"
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr "Die neuesten Einträge von %s"
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr "Einträge für den Tag %s"
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr "Die neuen Einträge für den Tag %s"
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr "Kommentare auf %s"
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr "Die neusten Kommentare für die Einträge %s"
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr "Kommentar für %s"
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr "Die neusten Kommentare für die Einträge %s"
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks für %s"
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr "Die neusten Pingbacks für Eintrag %s"
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks für %s"
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr "Die neusten Trackbacks für Eintrag %s"
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr "Entwurf"
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr "Versteckt"
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr "Veröffentlicht"
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr "Titel"
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr "Für die Veröffentlichung benutzt"
+
+#: models.py:197
+msgid "description"
+msgstr "Beschreibung"
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr "Übergeordnete Kategorie"
+
+#: models.py:283
+msgid "metatype"
+msgstr "Kategorie"
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr "Kategorien"
+
+#: models.py:298
+msgid "content"
+msgstr "Inhalt"
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr "Bild"
+
+#: models.py:310
+msgid "used for illustration"
+msgstr "Als Abbildung benutzt"
+
+#: models.py:312
+msgid "excerpt"
+msgstr "Auszug"
+
+#: models.py:313
+msgid "optional element"
+msgstr "Optionales Element"
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr "Tags"
+
+#: models.py:316
+#, fuzzy
+msgid "member of metatypes"
+msgstr "Anzahl der Einträge"
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr "Verwandte Einträge"
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr "Autoren"
+
+#: models.py:331
+msgid "featured"
+msgstr "empfohlenen"
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr "Kommentare aktiviert"
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr "Linkback aktiviert"
+
+#: models.py:335
+msgid "creation date"
+msgstr "Erstellungsdatum"
+
+#: models.py:337
+msgid "last update"
+msgstr "Letzte Änderung"
+
+#: models.py:338
+msgid "start publication"
+msgstr "Veröffentlichungsbeginn"
+
+#: models.py:339
+msgid "date start publish"
+msgstr "Datum der ersten Veröffentlichung"
+
+#: models.py:341
+msgid "end publication"
+msgstr "Veröffentlichungsende"
+
+#: models.py:342
+msgid "date end publish"
+msgstr "Datum des Veröffentlichungsende"
+
+#: models.py:345
+msgid "sites publication"
+msgstr "Veröffentlich auf Seiten"
+
+#: models.py:349
+msgid "login required"
+msgstr "Anmeldung erfolderlich"
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr "Nur authentifizierte Benutzer können den Eintrag lesen "
+
+#: models.py:352
+msgid "password"
+msgstr "Passwort"
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr "Eintrag mit Passwort schützen"
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr "Template"
+
+#: models.py:358
+msgid "Default template"
+msgstr "Standard-Template"
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr "Template, mit dem dieser Eintrag dargestellt wird"
+
+#: models.py:568
+#, fuzzy
+msgid "node type"
+msgstr "Eintrag"
+
+#: models.py:569
+#, fuzzy
+msgid "node types"
+msgstr "Einträge"
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+#, fuzzy
+msgid "relation type"
+msgstr "Erstellungsdatum"
+
+#: models.py:609
+#, fuzzy
+msgid "relation types"
+msgstr "Erstellungsdatum"
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+#, fuzzy
+msgid "attribute types"
+msgstr "Neuste Einträge"
+
+#: models.py:686
+#, fuzzy
+msgid "relation"
+msgstr "Erstellungsdatum"
+
+#: models.py:687
+#, fuzzy
+msgid "relations"
+msgstr "Erstellungsdatum"
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Neuer Kommentar zu \"%(title)s\""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr "Keine Hauptkategorie"
+
+#: admin/forms.py:82
+#, fuzzy
+msgid "A metatype cannot be a parent of itself."
+msgstr "Eine Kategorie kann auf selbst sein referenzieren."
+
+#: admin/forms.py:94
+#, fuzzy
+msgid "parent nodetype"
+msgstr "Nächster Eintrag"
+
+#: admin/forms.py:95
+#, fuzzy
+msgid "No parent nodetype"
+msgstr "Keine Hauptkategorie"
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr "Kategorien"
+
+#: admin/forms.py:116
+#, fuzzy
+msgid "An objectype cannot be parent of itself."
+msgstr "Eine Kategorie kann auf selbst sein referenzieren."
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr "Pfad"
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Inhalt"
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr "Optionen"
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr "Privatsphäre"
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr "Diskussion"
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr "Veröffentlichung"
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i Wörter)"
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i Kommentare)"
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr "Autor(en)"
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr "Kategorie(n)"
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr "Tag(s)"
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr "Seite(n)"
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr "Ist aktuell"
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr "Ist sichtbar"
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr "Im Browser öffnen"
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr "Nicht verfügbar"
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr "Kurze URL"
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr "Ausgewählte Einträge dem aktuellem Benutzer zuordnen"
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr "Ausgewählte Einträge als öffentlich markieren"
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr "Ausgewählte Einträge als unsichtbar markieren"
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr "Ausgewählte Einträge twittern"
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr "Kommentare für ausgewählte Einträge deaktivieren"
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr "Schließen der Linkbacks für die ausgewählte Einträge"
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr "Setzen Sie die ausgewählten Einträge auf das aktuelle Datum"
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr "%(directory)s Verzeichnis erfolgreich angepingt %(success)d Einträge."
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr "Verzeichnisdienste mit ausgewählten Einträgen anpingen"
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr "Gstudio App Hook"
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr "Einträge"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Sortierung"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Fortgeschritten"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr "Ausgewählte Einträge"
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+#, fuzzy
+msgid "Random node types"
+msgstr "Zufällige Einträge"
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr "Gstudio Eintragsmenü"
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr "Gstudio Kategorie Menü"
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr "Gstudio Autor Menü"
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Autoren"
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr "Gstudio Tag Menu"
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Tags"
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr "Liste der Einträge (Standard)"
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr "Eintragsdetail"
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr "Unterkategorien mit einbeziehen"
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr "Anzahl der Einträge"
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr "Template zur Anzeige des Plugins"
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr "%s Einträge"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Fehler 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Seite nicht gefunden"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+"Entschuldigung, aber die angeforderte Seite konnte nicht gefunden werden."
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr "Nützliche Links"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr "Blog Index"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr "Sitemap"
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+#, fuzzy
+msgid "Recent node types"
+msgstr "Neuste Einträge"
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr "Suche"
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr "Schlüsselwörter..."
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr "Fehler 500"
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr "Server-Fehler"
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Es ist ein Fehler aufgetreten. Der Server-Admin wurde umgehend benachrichtig "
+"und wird sich in Kürze um den Fehler kümmern. Wir danken für Ihr Verständnis."
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Inhalt"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr "Diskussionen"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr " %(nodetypes)s Einträge"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s Kommentare"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr " %(metatypes)s Kategorien"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr " %(pingbacks)s Pingbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr " %(tags)s Tags"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr " %(trackbacks)s Trackbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr " %(authors)s Autoren"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr " %(rejects)s abgelehnt"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr "Eintrag bearbeiten"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr "am"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr "Vorschau"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr "Kein Entwurfs Einträge."
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr "Alle Eintragsentwürfe anziegen"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "in"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Ihre Meinung zu"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Kommentar bearbeiten"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Keine Kommentare vorhanden."
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Verwalten Sie die Kommentare"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "mache eine LinkBack auf"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Bearbeiten Sie den LinkBack"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Keine Linkbacks."
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Heute"
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr "Eintragsentwürfe"
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Schnelles Veröffentlichen"
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Titel"
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Als Entwurf speichern"
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Zurücksetzen"
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Veröffentlichen"
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr "Neueste Kommentare"
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr "Aktuelle Linkbacks"
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr "Kommentarvorschau"
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Bitte korrigieren Sie folgenden Fehler."
+msgstr[1] "Bitte korrigieren Sie folgende Fehler."
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr "Kommentarvorschau einblenden"
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr "Kommentar schreiben"
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr "Abschicken"
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Danke für Ihren Kommentar"
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr "Zur Liste der Einträge zurückkehren"
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr "Zeige Einträge von %(author)s"
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr "Keine Tags"
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr "Kurze URL"
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] " %(comment_count)s Kommentar"
+msgstr[1] " %(comment_count)s Kommentare"
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr "Kommentare deaktiviert."
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] " %(pingback_count)s Pingback"
+msgstr[1] " %(pingback_count)s Pingbacks"
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] " %(trackback_count)s Trackback"
+msgstr[1] " %(trackback_count)s Trackbacks"
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr "Autorenliste"
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] " %(nodetype_count)s Eintrag"
+msgstr[1] " %(nodetype_count)s Einträge"
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Keine Autoren vorhanden."
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr "RSS-Feed der neuesten Einträge"
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+"Sie können, um Worte oder Sätze, \"Anführungszeichen\" für genaue Sätze und/"
+"oder die UND / ODER boolschen Operatoren mit Klammern für komplexe Suche "
+"kombiniert verwenden."
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr "Kalender"
+
+#: templates/gstudio/base.html:68
+#, fuzzy
+msgid "Popular node types"
+msgstr "Beliebte Einträge"
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr "Archiv"
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr "Werkzeuge"
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr "Dashboard"
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr "Schreibe einen Eintrag"
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr "Abmelden"
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr "Anmeldung erforderlich"
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+"Ihr Benutzername und Passwort stimmen nicht überein. Bitte versuchen Sie es "
+"erneut."
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr "Sie müssen eingeloggt sein um diesen Eintrag zu sehen."
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr "Login"
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr "Kategorieliste"
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr "Keine Kategorien vorhanden."
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr "Tagesarchiv"
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Monatliche Archive"
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr "RSS-Feed der Diskussionen auf"
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr "RSS-Feed mit Kommentaren zu"
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr "RSS-Feed auf den Pingbacks"
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr "RSS-Feed auf Trackbacks ist an."
+
+#: templates/gstudio/nodetype_detail.html:46
+#, fuzzy
+msgid "Next node type"
+msgstr "Nächster Eintrag"
+
+#: templates/gstudio/nodetype_detail.html:60
+#, fuzzy
+msgid "Previous node type"
+msgstr "Vorheriger Eintrag"
+
+#: templates/gstudio/nodetype_detail.html:73
+#, fuzzy
+msgid "Related node types"
+msgstr "Verwandte Einträge"
+
+#: templates/gstudio/nodetype_detail.html:84
+#, fuzzy
+msgid "Similar node types"
+msgstr "Ähnliche Einträge"
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr "Kommentare"
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr "Pingbacks sind aktiviert."
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr "Pingbacks sind deaktiviert."
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr "Trackback-URL"
+
+#: templates/gstudio/nodetype_detail.html:212
+#, fuzzy
+msgid "Edit the node type"
+msgstr "Eintrag bearbeiten"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr "RSS-Feed"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr "Kategorie"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr "Tag"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr "Autor"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr "Seite"
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr "Einträge von %(author)s"
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr "Kategorie bearbeiten"
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr "Tag bearbeiten"
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr "Autor bearbeiten"
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "RSS-Feed mit Suchergebnissen zu"
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] "%(nodetype_count)s Eintrag gefunden"
+msgstr[1] "%(nodetype_count)s Einträge gefunden"
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr "Nichts gefunden."
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr "Passwort erforderlich"
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "Das Kennwort ist ungültig. Bitte versuchen Sie es erneut."
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr "Sie benötigen ein Passwort um diesen Eintrag lesen zu können."
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr "Passwort"
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr "Gültig"
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr "Einträge pro Kategorien"
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr "Kommentar"
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr "Keine Einträge vorhanden."
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr "Alle Einträge"
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Tag-Liste"
+
+#: templates/gstudio/tag_list.html:19
+#, fuzzy
+msgid "No tags yet."
+msgstr "Keine Kategorien vorhanden."
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+#, fuzzy
+msgid "No node types yet."
+msgstr "Keine Einträge vorhanden."
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr "Kein Archiv vorhanden."
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, fuzzy, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] " %(nodetype_count)s Eintrag"
+msgstr[1] " %(nodetype_count)s Einträge"
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+#, fuzzy
+msgid "No subtypes yet."
+msgstr "Keine Einträge vorhanden."
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Seite %(current_page)s von %(total_page)s "
+
+#: templates/gstudio/tags/pagination.html:10
+#, fuzzy
+msgid "More recent node types"
+msgstr "Mehr neuste Einträge"
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr "Einträge der Seite"
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr "Mehr alte Einträge"
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkback auf"
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr "Keine ähnlichen Einträge."
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr "Der Suchbegriff ist zu kurz"
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Kein Suchbegriff gegeben"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Benutzername ist falsch."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Kennwort ist ungültig."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Benutzerkonto nicht verfügbar."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "Benutzer kann nicht %s."
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr "Kein Titel"
+
+#~ msgid "Written by"
+#~ msgstr "Geschrieben von"
+
+#~ msgid "Be first to comment!"
+#~ msgstr "Schreiben den ersten Kommentar!"
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/es/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/gstudio/locale/es/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..0a7c8bd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/es/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/es/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/es/LC_MESSAGES/django.po
new file mode 100644
index 0000000..22ea810
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/es/LC_MESSAGES/django.po
@@ -0,0 +1,1375 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# igalarzab <igalarzab@gmail.com>, 2011.
+# Julien Fache <fastomas42@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-gstudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:24+0530\n"
+"PO-Revision-Date: 2011-04-23 12:47+0000\n"
+"Last-Translator: igalarzab <igalarzab@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr "Últimas entradas"
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr "Las últimas entradas del sitio %s"
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr "Entradas de la categoría %s"
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr "Las últimas entradas de la categoría %s"
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr "Entradas del autor %s"
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr "Las últimas entradas de %s"
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr "Entradas del tag %s"
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr "Las últimas entradas del tag %s"
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr "Resultados de la búsqueda '%s'"
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr "Entradas que contienen el patron '%s'"
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr "Debate en %s"
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr "Los últimos debates de la entrada %s"
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr "Comentarios en %s"
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr "Los últimos comentarios de la entrada %s"
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks en %s"
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr "Los últimos pingbacks de la entrada %s"
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks en %s"
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr "Los últimos trackbacks de la entrada %s"
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr "borrador"
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr "oculto"
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr "publicado"
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr "título"
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr "usado para la publicación"
+
+#: models.py:197
+msgid "description"
+msgstr "descripción"
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr "categoría padre"
+
+#: models.py:283
+msgid "metatype"
+msgstr "categoría"
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr "categorías"
+
+#: models.py:298
+msgid "content"
+msgstr "contenido"
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr "imagen"
+
+#: models.py:310
+msgid "used for illustration"
+msgstr "utilizado como ilustración"
+
+#: models.py:312
+msgid "excerpt"
+msgstr "extracto"
+
+#: models.py:313
+msgid "optional element"
+msgstr "elemento opcional"
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr "tags"
+
+#: models.py:316
+#, fuzzy
+msgid "member of metatypes"
+msgstr "Número de entradas"
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr "entradas relacionadas"
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr "autores"
+
+#: models.py:331
+msgid "featured"
+msgstr "destacada"
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr "comentarios habilitados"
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr "linkbacks habilitados"
+
+#: models.py:335
+msgid "creation date"
+msgstr "fecha de creación"
+
+#: models.py:337
+msgid "last update"
+msgstr "última actualización"
+
+#: models.py:338
+msgid "start publication"
+msgstr "comienzo de la publicación"
+
+#: models.py:339
+msgid "date start publish"
+msgstr "fecha de comienzo de la publicación"
+
+#: models.py:341
+msgid "end publication"
+msgstr "fin de la publicación"
+
+#: models.py:342
+msgid "date end publish"
+msgstr "Fecha de cierre de la publicación"
+
+#: models.py:345
+msgid "sites publication"
+msgstr "publicaciones del sitio"
+
+#: models.py:349
+msgid "login required"
+msgstr "identificación requerida"
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr "sólo los usuarios identificados pueden ver la entrada"
+
+#: models.py:352
+msgid "password"
+msgstr "contraseña"
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr "protege la entrada con una contraseña"
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr "plantilla"
+
+#: models.py:358
+msgid "Default template"
+msgstr "Plantilla predeterminada"
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr "plantilla usada para la entrada"
+
+#: models.py:568
+#, fuzzy
+msgid "node type"
+msgstr "entrada"
+
+#: models.py:569
+#, fuzzy
+msgid "node types"
+msgstr "entradas"
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+#, fuzzy
+msgid "relation type"
+msgstr "fecha de creación"
+
+#: models.py:609
+#, fuzzy
+msgid "relation types"
+msgstr "fecha de creación"
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+#, fuzzy
+msgid "attribute types"
+msgstr "Últimas entradas"
+
+#: models.py:686
+#, fuzzy
+msgid "relation"
+msgstr "fecha de creación"
+
+#: models.py:687
+#, fuzzy
+msgid "relations"
+msgstr "fecha de creación"
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+#, fuzzy
+msgid "system type"
+msgstr "la categoría"
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Nuevo comentario en \"%(title)s\""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr "No hay categoría padre"
+
+#: admin/forms.py:82
+#, fuzzy
+msgid "A metatype cannot be a parent of itself."
+msgstr "Una categoría no puede ser padre de si misma."
+
+#: admin/forms.py:94
+#, fuzzy
+msgid "parent nodetype"
+msgstr "Siguiente entrada"
+
+#: admin/forms.py:95
+#, fuzzy
+msgid "No parent nodetype"
+msgstr "No hay categoría padre"
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr "Categorías"
+
+#: admin/forms.py:116
+#, fuzzy
+msgid "An objectype cannot be parent of itself."
+msgstr "Una categoría no puede ser padre de si misma."
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr "árbol de categorías"
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Contenido"
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr "Opciones"
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr "Privacidad"
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr "Debates"
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr "Publicación"
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i palabras)"
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i comentarios)"
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr "autor(es)"
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr "categoría(s)"
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr "tag(s)"
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr "sitio(s)"
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr "es actual?"
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr "es visible?"
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr "Ver"
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr "Ver en el sitio"
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr "No disponible"
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr "url corta"
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr "Las entradas seleccionadas ahora son tuyas."
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr "Asignar las entradas al usuario"
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr "Las entradas seleccionadas han sido marcadas como publicadas."
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr "Publicar las entradas seleccionadas"
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr "Las entradas seleccionadas han sido marcadas como ocultas."
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr "Ocultar las entradas seleccionadas"
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr "Las entradas marcadas han sido twitteadas."
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr "Twittear las entradas seleccionadas"
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr "Los comentarios en las entradas marcadas han sido cerrados."
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr "Cerrar los comentarios de las entradas seleccionadas"
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr "Los linkbacks en las entradas marcadas han sido cerrados."
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr "Cerrar los linkbacks de las entradas seleccionadas"
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+"Las fechas de las entradas seleccionadas han sido puestas al momento actual."
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr "Poner las fechas de las entradas seleccionadas al momento actual"
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr ""
+"El directorio %(directory)s ha realizado un ping correctamente a %(success)d "
+"entradas."
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr "Ping directorios para las entradas seleccionadas"
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr "Aplicación Gstudio"
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr "entradas"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Ordenaci´n"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Avanzado"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr "Entradas seleccionadas"
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+#, fuzzy
+msgid "Random node types"
+msgstr "Entradas al azar"
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr "Menú de entradas Gstudio "
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr "Menú Categoría Gstudio"
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr "Menú Autor Gstudio"
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Autores"
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr "Menú Tag Gstudio"
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Tags"
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr "Lista de entradas (por defecto)"
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr "Detalle de la entrada"
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr "incluir subcategorías"
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr "Número de entradas"
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr "Plantilla utilizada para mostrar el plugin "
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr "%s entradas"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Error 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "La página solicitada no pudo ser encontrada."
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr "Enlaces útiles"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr "Inicio del blog"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr "Sitemap"
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+#, fuzzy
+msgid "Recent node types"
+msgstr "Entradas recientes"
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr "Buscar"
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr "Palabras clave..."
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr "Error 500"
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr "Error del Servidor"
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ha ocurrido un error. Ha sido reportado al administrador de la web por "
+"email. Intentaremos solucionarlo con la mayor brevedad posible. Gracias por "
+"tu paciencia."
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Contenido"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr "Debates"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr "%(nodetypes)s entradas"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s comentarios"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr "%(metatypes)s categorías"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s pingbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s tags"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s trackbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s autores"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s rechazadas"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr "Editar la entrada"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr "en"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr "Previsualizar"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr "No hay borradores."
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr "Ver todos los borradores"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "en"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Comentarios en"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Editar el comentario"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Editar"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "No hay comentarios."
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Administra los comentarios"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "Crea un linkback en"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Edita el linkback"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "No hay linkbacks."
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Hoy"
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr "Borradores"
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Publicación rápida"
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Título"
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Guardado como borrador"
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Resetear"
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Publicar"
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr "Comentarios recientes"
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr "Linkbacks recientes"
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr "Previsualizar el comentario"
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Por favor corrije el siguiente error."
+msgstr[1] "Por favor corrige los siguientes errores."
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr "Previsualización del comentario"
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr "Escribe un comentario"
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr "Post"
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Gracias por el comentario"
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr "Volver a la lista de entradas"
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr "Mostrar las entradas de %(author)s"
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr "Sin tags"
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr "Url corta"
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s comentario"
+msgstr[1] "%(comment_count)s commentarios"
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr "Los comentarios están deshabilitados."
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingback"
+msgstr[1] "%(pingback_count)s pingbacks"
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackback"
+msgstr[1] "%(trackback_count)s trackbacks"
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr "Lista de autores"
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] "%(nodetype_count)s entrada"
+msgstr[1] "%(nodetype_count)s entradas"
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr "No hay autores."
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr "Feed RSS de las últimas entradas"
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+"Puedes usar - para excluir palabras o frases, &quot;comillas dobles&quot; "
+"para buscar frases exactas, y las operaciones booleanas AND/OR combinada con "
+"paréntesis para realizar búsquedas complejas."
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr "Calendario"
+
+#: templates/gstudio/base.html:68
+#, fuzzy
+msgid "Popular node types"
+msgstr "Entradas populares"
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr "Archivos"
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr "Herramientas"
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr "Panel de control"
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr "Escribe una entrada"
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr "Desconectar"
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr "Identificación requerida"
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+"Tu nombre de usuario y contraseña no son correctos. Vuelve a intentarlo."
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr "Necesitas estar identificado para ver esta entrada."
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr "Login"
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr "Lista de categorías"
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr "No hay categorías."
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr "Archivos diarios"
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Archivos Mensuales"
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr "Feed RSS de los debates en"
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr "Feed RSS de comentarios en"
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr "Feed RSS de pingbacks en"
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr "Feed RSS de trackbacks en"
+
+#: templates/gstudio/nodetype_detail.html:46
+#, fuzzy
+msgid "Next node type"
+msgstr "Siguiente entrada"
+
+#: templates/gstudio/nodetype_detail.html:60
+#, fuzzy
+msgid "Previous node type"
+msgstr "Entrada anterior"
+
+#: templates/gstudio/nodetype_detail.html:73
+#, fuzzy
+msgid "Related node types"
+msgstr "Entradas relacionadas"
+
+#: templates/gstudio/nodetype_detail.html:84
+#, fuzzy
+msgid "Similar node types"
+msgstr "Entradas similares"
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr "Comentarios"
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr "Los pingbacks están abiertos."
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr "Los pingbacks están cerrados."
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr "URL del trackback"
+
+#: templates/gstudio/nodetype_detail.html:212
+#, fuzzy
+msgid "Edit the node type"
+msgstr "Editar la entrada"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr "Últimas entradas de"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr "la categoría"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr "el tag"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr "el autor"
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr "página"
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr "Feed RSS"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr "Categoría"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr "Tag"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr "Autor"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr "Página"
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr "Entradas de %(author)s"
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr "Editar la categoría"
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr "Editar el tag"
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr "Editar el autor"
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr "Resultados de la búsqueda para"
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "Feed RSS de la búsqueda de"
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] "%(nodetype_count)s entrada encontrada"
+msgstr[1] "%(nodetype_count)s entradas encontradas"
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr "No hubo resultados."
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr "Contraseña requerida"
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "La contraseña proporcionada no es válida. Vuelve a intentarlo."
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr "Necesitas una contraseña para ver esta entrada."
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr "Contraseña"
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr "Válido"
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr "Entradas de la categoría"
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr "comentario"
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr "No hay entradas."
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr "Todas las entradas"
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Lista de tags"
+
+#: templates/gstudio/tag_list.html:19
+#, fuzzy
+msgid "No tags yet."
+msgstr "No hay categorías."
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+#, fuzzy
+msgid "No node types yet."
+msgstr "No hay entradas."
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr "No hay archivos."
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, fuzzy, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] "%(nodetype_count)s entrada"
+msgstr[1] "%(nodetype_count)s entradas"
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+#, fuzzy
+msgid "No subtypes yet."
+msgstr "No hay entradas."
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Página %(current_page)s de %(total_page)s"
+
+#: templates/gstudio/tags/pagination.html:10
+#, fuzzy
+msgid "More recent node types"
+msgstr "Entradas más recientes"
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr "Página de entradas"
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr "Entradas más antiguas"
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkbacks en"
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr "No hay entradas similares"
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr "La cadena es muy corta"
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr "No se encuentra cadena"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "El nombre de usuario es incorrecto."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "La contraseña es incorrecta."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "El nombre de usuario no está disponible."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "El usuario no puede ser %s."
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr "No hay título"
+
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgid "IP"
+#~ msgstr "IP"
+
+#~ msgid "Comment"
+#~ msgstr "Comentario"
+
+#~ msgid "View this comment"
+#~ msgstr "Ver este comentario"
+
+#~ msgid "Flag this comment"
+#~ msgstr "Marcar este comentario"
+
+#~ msgid "Delete this comment"
+#~ msgstr "Borrar este comentario"
+
+#~ msgid "Approve this comment"
+#~ msgstr "Aprobar este comentario"
+
+#~ msgid "Written by"
+#~ msgstr "Escrito por"
+
+#~ msgid "Written on"
+#~ msgstr "Escrito en"
+
+#~ msgid "Be first to comment!"
+#~ msgstr "¡Se el primero en escribir un comentario!"
+
+#~ msgid "View site"
+#~ msgstr "Ver la web"
+
+#~ msgid "Admin. site"
+#~ msgstr "Panel de administración"
+
+#~ msgid "Manage comments"
+#~ msgstr "Administrar comentarios"
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/fr/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/gstudio/locale/fr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..480a582
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/fr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/fr/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/fr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..58fa87a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/fr/LC_MESSAGES/django.po
@@ -0,0 +1,1373 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Julien Fache <fantomas42@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-gstudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:24+0530\n"
+"PO-Revision-Date: 2011-04-12 18:22+0000\n"
+"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr "Derniers articles"
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr "Les dernières actualités du site %s"
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr "Actualités pour la catégorie : %s"
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr "Les dernières actualités pour la catégorie : %s"
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr "L'actualité par %s"
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr "Les dernières actualités par %s"
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr "Actualités pour le tag : %s"
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr "Les dernières actualités pour le tag : %s"
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr "Résultats de recherche pour '%s'"
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr "Les dernières actualités contenant le motif '%s'"
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr "Discussions sur %s"
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr "Les dernières discussions sur l'actualité : %s"
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr "Commentaires sur : %s"
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr "Les derniers commentaires sur l'actualité : %s"
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks sur %s"
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr "Les derniers pingbacks sur l'actualité : %s"
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks sur %s"
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr "Les derniers trackbacks sur l'actualité : %s"
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr "Brouillon"
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr "Non publié"
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr "Publié"
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr "titre"
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr "Utilisé pour la publication."
+
+#: models.py:197
+msgid "description"
+msgstr "description"
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr "catégorie parente"
+
+#: models.py:283
+msgid "metatype"
+msgstr "catégorie"
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr "catégories"
+
+#: models.py:298
+msgid "content"
+msgstr "contenu"
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr "image"
+
+#: models.py:310
+msgid "used for illustration"
+msgstr "Utilisée comme illustration."
+
+#: models.py:312
+msgid "excerpt"
+msgstr "extrait"
+
+#: models.py:313
+msgid "optional element"
+msgstr "Elément optionnel."
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr "tags"
+
+#: models.py:316
+#, fuzzy
+msgid "member of metatypes"
+msgstr "nombre d'articles"
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr "articles associés"
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr "auteurs"
+
+#: models.py:331
+msgid "featured"
+msgstr "favori ?"
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr "commentaires ?"
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr "liens entrants ?"
+
+#: models.py:335
+msgid "creation date"
+msgstr "date de création"
+
+#: models.py:337
+msgid "last update"
+msgstr "mise à jour"
+
+#: models.py:338
+msgid "start publication"
+msgstr "démarrage"
+
+#: models.py:339
+msgid "date start publish"
+msgstr "Date utilisé pour démarrer la publication."
+
+#: models.py:341
+msgid "end publication"
+msgstr "arrêt"
+
+#: models.py:342
+msgid "date end publish"
+msgstr "Date utilisé pour arrêter la publication."
+
+#: models.py:345
+msgid "sites publication"
+msgstr "sites publiés"
+
+#: models.py:349
+msgid "login required"
+msgstr "identification requise"
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr "Seuls les visiteurs authentifiés peuvent voir l'article."
+
+#: models.py:352
+msgid "password"
+msgstr "mot de passe"
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr "Protège l'article avec un mot de passe."
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr "modèle"
+
+#: models.py:358
+msgid "Default template"
+msgstr "Modèle par défaut"
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr "Modèle utilisé pour afficher l'article."
+
+#: models.py:568
+#, fuzzy
+msgid "node type"
+msgstr "article"
+
+#: models.py:569
+#, fuzzy
+msgid "node types"
+msgstr "articles"
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+#, fuzzy
+msgid "relation type"
+msgstr "date de création"
+
+#: models.py:609
+#, fuzzy
+msgid "relation types"
+msgstr "date de création"
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+#, fuzzy
+msgid "attribute types"
+msgstr "Derniers articles"
+
+#: models.py:686
+#, fuzzy
+msgid "relation"
+msgstr "date de création"
+
+#: models.py:687
+#, fuzzy
+msgid "relations"
+msgstr "date de création"
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+#, fuzzy
+msgid "system type"
+msgstr "la catégorie"
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Nouveau commentaire posté sur \"%(title)s\""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr "Aucune catégorie parente"
+
+#: admin/forms.py:82
+#, fuzzy
+msgid "A metatype cannot be a parent of itself."
+msgstr "Une catégorie ne peut être parente d'elle même."
+
+#: admin/forms.py:94
+#, fuzzy
+msgid "parent nodetype"
+msgstr "Article suivant"
+
+#: admin/forms.py:95
+#, fuzzy
+msgid "No parent nodetype"
+msgstr "Aucune catégorie parente"
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr "Catégories"
+
+#: admin/forms.py:116
+#, fuzzy
+msgid "An objectype cannot be parent of itself."
+msgstr "Une catégorie ne peut être parente d'elle même."
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr "arborescense"
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Contenu"
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr "Options"
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr "Confidentialité"
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr "Discussion"
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr "Publication"
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i mots)"
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i commentaires)"
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr "auteur(s)"
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr "Catégorie(s)"
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr "Tag(s)"
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr "Site(s)"
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr "En cours ?"
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr "Visible ?"
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr "Consulter"
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr "Voir sur le site"
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr "Indisponible"
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr "url raccourcie"
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr "Les articles sélectionnés vous appartiennent désormais."
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr "Acquérir les articles"
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr "Les articles sélectionnés sont désormais marqués comme publiés."
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr "Publier les articles sélectionnés"
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr "Les articles sélectionnés sont désormais marqués comme cachés."
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr "Masquer les articles sélectionnés"
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr "Les articles sélectionnés ont été twittés."
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr "Tweeter les articles sélectionnés"
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr "Les commentaires sont désormais fermés pour les articles sélectionnés."
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr "Fermer les commentaires pour les articles sélectionnés"
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+"Les liens entrants sont désormais fermés pour les articles sélectionnés."
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr "Fermer les liens entrants pour les articles sélectionnés"
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr "Les articles sélectionnés sont désormais à la date du jour."
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr "Remonter les articles sélectionnés à la date du jour"
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr "%(directory)s a été pingé avec succès pour %(success)d articles."
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr "Pinger les articles dans les annuaires."
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr "Application Gstudio"
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr "articles"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Répartition"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Avancé"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr "Selection d'articles"
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+#, fuzzy
+msgid "Random node types"
+msgstr "Articles au hasard"
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr "Menu Article Gstudio"
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr "Menu Catégorie Gstudio"
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr "Menu Auteur Gstudio"
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Auteurs"
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr "Menu Tag Gstudio"
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Tags"
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr "Article en liste (par défaut)"
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr "Article détaillé"
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr "inclure les sous-catégories ?"
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr "nombre d'articles"
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr "Modèle utilisé pour afficher le plugin."
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr "%s articles"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Erreur 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Cette page n'a pas été trouvée"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Désolé, mais la page demandée est introuvable."
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr "Liens utiles"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr "Accueil du blog"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr "Carte du site"
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+#, fuzzy
+msgid "Recent node types"
+msgstr "Articles récents"
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr "Recherche"
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr "Mots-clefs..."
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr "Erreur 500"
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr "Erreur du serveur"
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Une erreur est survenue. Elle a été transmise par courriel aux "
+"administrateurs du site et sera corrigée dans les meilleurs délais. Merci "
+"pour votre patience."
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Contenus"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr "Discussions"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr "%(nodetypes)s articles"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s commentaires"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr "%(metatypes)s catégories"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s pingbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s tags"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s trackbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s auteurs"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s rejetées"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr "Editer l'article"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr "le"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr "Prévisualiser"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr "Aucun brouillon actuellement"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr "Voir tous les articles en brouillon"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "sous"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Commentaire sur"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Editer le commentaire"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Editer"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Pas de commentaires."
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Gérer les commentaires"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "a fait un lien sur"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Editer le lien entrant"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Aucun lien entrant actuellement"
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Aujourd'hui"
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr "Brouillons en cours"
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Publication rapide"
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Titre"
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Enregistrer en brouillon"
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Réinitialiser"
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Publier"
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr "Derniers commentaires"
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr "Derniers liens entrants"
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr "Prévisualiser le commentaire"
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Veuillez corriger l'erreur suivante."
+msgstr[1] "Veuillez corriger les erreurs suivantes. "
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr "Prévisualisation du commentaire"
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr "Poster un commentaire"
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr "Poster"
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Merci pour votre commentaire"
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr "Retourner à la liste des articles"
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr "Voir les articles de %(author)s"
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr "Pas de tags"
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr "Url raccourcie"
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s commentaire "
+msgstr[1] "%(comment_count)s commentaires"
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr "Les commentaires sont fermés."
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingback"
+msgstr[1] "%(pingback_count)s pingbacks"
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackback"
+msgstr[1] "%(trackback_count)s trackbacks"
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr "Liste des auteurs"
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] "%(nodetype_count)s article"
+msgstr[1] "%(nodetype_count)s articles"
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Pas encore d'auteurs."
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr "Flux RSS des derniers articles"
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+"Vous pouvez utiliser le - pour exclure des mots ou des expressions, les "
+"&quot;double guillemets&quot; pour les expressions exactes et les opérateurs "
+"booléens AND/OR combinés avec des parenthèses pour les recherches complexes."
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr "Calendrier"
+
+#: templates/gstudio/base.html:68
+#, fuzzy
+msgid "Popular node types"
+msgstr "Articles populaires"
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr "Archives"
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr "Outils"
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr "Tableau de bord"
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr "Poster un article"
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr "Déconnexion"
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr "Identification requise"
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+"Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez "
+"réessayer."
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr "Vous devez être identifé pour voir cet article."
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr "Connexion"
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr "Liste des catégories"
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr "Pas encore de catégories."
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr "Archives journalières"
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Archives mensuelles"
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr "Flux RSS des discussions sur"
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr "Flux RSS des commentaires sur"
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr "Flux RSS des pingbacks sur"
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr "Flux RSS des trackbacks sur"
+
+#: templates/gstudio/nodetype_detail.html:46
+#, fuzzy
+msgid "Next node type"
+msgstr "Article suivant"
+
+#: templates/gstudio/nodetype_detail.html:60
+#, fuzzy
+msgid "Previous node type"
+msgstr "Article précédent"
+
+#: templates/gstudio/nodetype_detail.html:73
+#, fuzzy
+msgid "Related node types"
+msgstr "Articles associés"
+
+#: templates/gstudio/nodetype_detail.html:84
+#, fuzzy
+msgid "Similar node types"
+msgstr "Articles similaires"
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr "Commentaires"
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr "Les pingbacks sont ouverts."
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr "Les pingbacks sont fermés."
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr "URL de Trackback"
+
+#: templates/gstudio/nodetype_detail.html:212
+#, fuzzy
+msgid "Edit the node type"
+msgstr "Editer l'article"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr "Derniers articles pour"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr "la catégorie"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr "le tag"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr "l'auteur"
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr "page"
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr "Flux RSS"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr "Catégorie"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr "Tag"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr "Auteur"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr "Page"
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr "L'actualité par %(author)s"
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr "Editer la catégorie"
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr "Editer le tag"
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr "Editer l'auteur"
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr "Résultats de recherche pour"
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "Flux RSS des résultats de recherche pour"
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] "%(nodetype_count)s article trouvé."
+msgstr[1] "%(nodetype_count)s articles trouvés."
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr "Aucun article trouvé."
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr "Mot de passe requis"
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "Le mot de passe fournis est non valide. Veuillez réessayer."
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr "Vous devez fournir un mot de passe pour voir cet article."
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr "Mot de passe"
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr "Valider"
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr "Articles par catégories"
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr "commentaire"
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr "Pas encore d'articles."
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr "Tous les articles"
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Liste des tags"
+
+#: templates/gstudio/tag_list.html:19
+#, fuzzy
+msgid "No tags yet."
+msgstr "Pas encore de catégories."
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+#, fuzzy
+msgid "No node types yet."
+msgstr "Pas encore d'articles."
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr "Pas encore d'archives."
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, fuzzy, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] "%(nodetype_count)s article"
+msgstr[1] "%(nodetype_count)s articles"
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+#, fuzzy
+msgid "No subtypes yet."
+msgstr "Pas encore d'articles."
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Page %(current_page)s sur %(total_page)s"
+
+#: templates/gstudio/tags/pagination.html:10
+#, fuzzy
+msgid "More recent node types"
+msgstr "Articles plus récents"
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr "Articles page"
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr "Articles plus anciens"
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Pingback sur"
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr "Pas d'articles similaires."
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr "Le motif de recherche est trop court !"
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Aucun motif de recherche !"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Le nom d'utilisateur est incorrect."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Le mot de passe est invalide."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Compte utilisateur non valable."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "L'utilisateur ne peut %s."
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr "Aucun titre"
+
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgid "IP"
+#~ msgstr "IP"
+
+#~ msgid "Comment"
+#~ msgstr "Commentaire"
+
+#~ msgid "View this comment"
+#~ msgstr "Voir ce commentaire"
+
+#~ msgid "Flag this comment"
+#~ msgstr "Signaler ce commentaire"
+
+#~ msgid "Delete this comment"
+#~ msgstr "Supprimer ce commentaire"
+
+#~ msgid "Approve this comment"
+#~ msgstr "Approuver ce commentaire"
+
+#~ msgid "Written by"
+#~ msgstr "Ecrit par"
+
+#~ msgid "Written on"
+#~ msgstr "Ecrit le"
+
+#~ msgid "Be first to comment!"
+#~ msgstr "Soyez le premier à commenter !"
+
+#~ msgid "View site"
+#~ msgstr "Voir le site"
+
+#~ msgid "Admin. site"
+#~ msgstr "Admin. site"
+
+#~ msgid "Manage comments"
+#~ msgstr "Gérer les commentaires"
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/hi/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/hi/LC_MESSAGES/django.po
new file mode 100644
index 0000000..b264c0d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/hi/LC_MESSAGES/django.po
@@ -0,0 +1,1300 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:25+0530\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr ""
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr ""
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr ""
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr ""
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr ""
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr ""
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr ""
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr ""
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr ""
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr ""
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr ""
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr ""
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr ""
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr ""
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr ""
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr ""
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr ""
+
+#: models.py:197
+msgid "description"
+msgstr ""
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr ""
+
+#: models.py:283
+msgid "metatype"
+msgstr ""
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr ""
+
+#: models.py:298
+msgid "content"
+msgstr ""
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr ""
+
+#: models.py:310
+msgid "used for illustration"
+msgstr ""
+
+#: models.py:312
+msgid "excerpt"
+msgstr ""
+
+#: models.py:313
+msgid "optional element"
+msgstr ""
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr ""
+
+#: models.py:316
+msgid "member of metatypes"
+msgstr ""
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr ""
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr ""
+
+#: models.py:331
+msgid "featured"
+msgstr ""
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr ""
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr ""
+
+#: models.py:335
+msgid "creation date"
+msgstr ""
+
+#: models.py:337
+msgid "last update"
+msgstr ""
+
+#: models.py:338
+msgid "start publication"
+msgstr ""
+
+#: models.py:339
+msgid "date start publish"
+msgstr ""
+
+#: models.py:341
+msgid "end publication"
+msgstr ""
+
+#: models.py:342
+msgid "date end publish"
+msgstr ""
+
+#: models.py:345
+msgid "sites publication"
+msgstr ""
+
+#: models.py:349
+msgid "login required"
+msgstr ""
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr ""
+
+#: models.py:352
+msgid "password"
+msgstr ""
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr ""
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr ""
+
+#: models.py:358
+msgid "Default template"
+msgstr ""
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr ""
+
+#: models.py:568
+msgid "node type"
+msgstr ""
+
+#: models.py:569
+msgid "node types"
+msgstr ""
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+msgid "relation type"
+msgstr ""
+
+#: models.py:609
+msgid "relation types"
+msgstr ""
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+msgid "attribute types"
+msgstr ""
+
+#: models.py:686
+msgid "relation"
+msgstr ""
+
+#: models.py:687
+msgid "relations"
+msgstr ""
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr ""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr ""
+
+#: admin/forms.py:82
+msgid "A metatype cannot be a parent of itself."
+msgstr ""
+
+#: admin/forms.py:94
+msgid "parent nodetype"
+msgstr ""
+
+#: admin/forms.py:95
+msgid "No parent nodetype"
+msgstr ""
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr ""
+
+#: admin/forms.py:116
+msgid "An objectype cannot be parent of itself."
+msgstr ""
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr ""
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr ""
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr ""
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr ""
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr ""
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr ""
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr ""
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr ""
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr ""
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr ""
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr ""
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr ""
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr ""
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr ""
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr ""
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr ""
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr ""
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr ""
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr ""
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr ""
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr ""
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr ""
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr ""
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr ""
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr ""
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr ""
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+msgid "Random node types"
+msgstr ""
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr ""
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr ""
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr ""
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr ""
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr ""
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr ""
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr ""
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr ""
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr ""
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr ""
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr ""
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr ""
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr ""
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr ""
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr ""
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr ""
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr ""
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+msgid "Recent node types"
+msgstr ""
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr ""
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr ""
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr ""
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr ""
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr ""
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr ""
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr ""
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr ""
+
+#: templates/gstudio/base.html:68
+msgid "Popular node types"
+msgstr ""
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr ""
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr ""
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr ""
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr ""
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr ""
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr ""
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:46
+msgid "Next node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:60
+msgid "Previous node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:73
+msgid "Related node types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:84
+msgid "Similar node types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:212
+msgid "Edit the node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr ""
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr ""
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr ""
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr ""
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr ""
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:19
+msgid "No tags yet."
+msgstr ""
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+msgid "No node types yet."
+msgstr ""
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr ""
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+msgid "No subtypes yet."
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:10
+msgid "More recent node types"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr ""
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr ""
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr ""
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr ""
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr ""
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr ""
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr ""
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/hu/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/gstudio/locale/hu/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..e3af73b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/hu/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/hu/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/hu/LC_MESSAGES/django.po
new file mode 100644
index 0000000..929d66c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/hu/LC_MESSAGES/django.po
@@ -0,0 +1,1336 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Frank Kruchio <fkruchio@gmail.com>, 2011.
+# judit <judit.nz@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-gstudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:24+0530\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fastomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr "Legújabb bejegyzések"
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr "A legfrissebb bejegyzések az oldalon:%s"
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr "Bejegyzés a kategóriában:%s"
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr "A legfrissebb bejegyzések a kategóriában:%s"
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr "Bejegyzés szerzője:%s"
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr "A legfrissebb bejegyzések:%s"
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr "Bejegyzés ezzel a címkével:%s"
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr "A legfrissebb bejegyzések ezzel a címkével:%s"
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr "Beszélgetések:%s"
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr "A bejegyzés legutóbbi beszélgetései :%s"
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr "Megjegyzések:%s"
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr "A bejegyzés legfrissebb hozzászólásai:%s"
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks:%s"
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr "Legújabb Pingbacks ebben a bejegyzésben :%s"
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks:%s"
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr "A legújabb trackbacks ebben a bejegyzésben:%s"
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr "tervezet"
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr "rejtett"
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr "közzétett"
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr "cím"
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr "közzétételhez használva"
+
+#: models.py:197
+msgid "description"
+msgstr "leírás"
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr "főkategória"
+
+#: models.py:283
+msgid "metatype"
+msgstr "kategória"
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr "kategóriák"
+
+#: models.py:298
+msgid "content"
+msgstr "tartalom"
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr "kép"
+
+#: models.py:310
+msgid "used for illustration"
+msgstr "illusztrációhoz használva"
+
+#: models.py:312
+msgid "excerpt"
+msgstr "idézet"
+
+#: models.py:313
+msgid "optional element"
+msgstr "választható elem"
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr "címkék"
+
+#: models.py:316
+#, fuzzy
+msgid "member of metatypes"
+msgstr "bejegyzések száma"
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr "kapcsolatos bejegyzések"
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr "szerzők"
+
+#: models.py:331
+msgid "featured"
+msgstr "Kiemelt"
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr "megjegyzés engedélyezve"
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr "linkback engedélyezve"
+
+#: models.py:335
+msgid "creation date"
+msgstr "létrehozás dátuma"
+
+#: models.py:337
+msgid "last update"
+msgstr "utolsó frissítés"
+
+#: models.py:338
+msgid "start publication"
+msgstr "közzététel indítása"
+
+#: models.py:339
+msgid "date start publish"
+msgstr "közzététel dátuma"
+
+#: models.py:341
+msgid "end publication"
+msgstr "közzététel vége"
+
+#: models.py:342
+msgid "date end publish"
+msgstr "közzététel befejezésének dátuma"
+
+#: models.py:345
+msgid "sites publication"
+msgstr "oldalak közzététele"
+
+#: models.py:349
+msgid "login required"
+msgstr "bejelentkezés szükséges"
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr "a bejegyzést csak hitelesített felhasználók tekinthetik meg"
+
+#: models.py:352
+msgid "password"
+msgstr "jelszó"
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr "cikk levédése jelszóval"
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr "sablon"
+
+#: models.py:358
+msgid "Default template"
+msgstr "Alapértelmezett sablon"
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr "bejegyzéshez használt sablon"
+
+#: models.py:568
+#, fuzzy
+msgid "node type"
+msgstr "bejegyzés"
+
+#: models.py:569
+#, fuzzy
+msgid "node types"
+msgstr "bejegyzések"
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+#, fuzzy
+msgid "relation type"
+msgstr "létrehozás dátuma"
+
+#: models.py:609
+#, fuzzy
+msgid "relation types"
+msgstr "létrehozás dátuma"
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+#, fuzzy
+msgid "attribute types"
+msgstr "Legújabb bejegyzések"
+
+#: models.py:686
+#, fuzzy
+msgid "relation"
+msgstr "létrehozás dátuma"
+
+#: models.py:687
+#, fuzzy
+msgid "relations"
+msgstr "létrehozás dátuma"
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[ %(site)s ] Új hozzászólás érkezett \" %(title)s \""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr "Nem főkategória"
+
+#: admin/forms.py:82
+#, fuzzy
+msgid "A metatype cannot be a parent of itself."
+msgstr "A kategória nem lehet önmaga szülője."
+
+#: admin/forms.py:94
+#, fuzzy
+msgid "parent nodetype"
+msgstr "Következő bejegyzés"
+
+#: admin/forms.py:95
+#, fuzzy
+msgid "No parent nodetype"
+msgstr "Nem főkategória"
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr "Kategóriák"
+
+#: admin/forms.py:116
+#, fuzzy
+msgid "An objectype cannot be parent of itself."
+msgstr "A kategória nem lehet önmaga szülője."
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr "fa útvonal"
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Tartalom"
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr "Opciók"
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr "Adatvédelem"
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr "Hozzászólás"
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr "Közzététel"
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr " %(title)s (%(word_count)i szavak)"
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr " %(title)s (%(comments)i hozzászólások)"
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr "szerző(k)"
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr "kategória(ák)"
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr "tag(ek)"
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr "helyszín(ek)"
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr "a tényleges"
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr "látható"
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr "Nézd meg a helyszínen"
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr "Nem érhető el"
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr "Rövid url"
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr "Állítsa be a bejegyzéseket a felhasználónak"
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr "Állítsa be a kiválasztott bejegyzéseket közzétettnek"
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr "Állítsa be a kiválasztott bejegyzéseket rejtettnek"
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr "Tweet a kiválasztott bejegyzéseket"
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr "Zárja be a megjegyzéseket a kiválasztott bejegyzéseken"
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr "Zárja be a hivatkozásokat a kiválasztott bejegyzéseken"
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr "Tegye a kiválasztott bejegyzéseket az aktuális dátum tetejére"
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr "%(directory)s könyvtár sikeresen elért %(success)d bejegyzést."
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr "Ping Könyvtárak a kiválasztott bejegyzésekhez"
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr "Gstudio Program Horog"
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr "bejegyzések"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Besorolás"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Részletes"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr "Kiválasztott bejegyzések"
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+#, fuzzy
+msgid "Random node types"
+msgstr "Véletlen bejegyzések"
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr "Gstudio Belépés Menü"
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr "Gstudio Kategória Menü"
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr "Gstudio Szerző Menü"
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Szerzők"
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr "Gstudio Címke Menü"
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Címkék"
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr "Nevezési lista (alapértelmezett)"
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr "Bejegyzés részletezve"
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr "Alkategóriák"
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr "bejegyzések száma"
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr "Segédprogram megjelenítéséhez használt sablon"
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr "%s bejegyzések"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "404-es hiba"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Az oldal nem található"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Sajnáljuk, de a kért oldal nem található."
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr "Hasznos linkek"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr "Blog-index"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr "Oldaltérkép"
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+#, fuzzy
+msgid "Recent node types"
+msgstr "Legutóbbi bejegyzések"
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr "Keresés"
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr "Kulcsszavak ..."
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr "500-as hiba"
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr "Szerver hiba"
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Hiba történt. A hibát a rendszeradminisztrátorok e-mailben jelezték, és "
+"hamarosan elháritják. Köszönjük a türelmét."
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Tartalma"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr "Fórum"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr " %(nodetypes)s bejegyzések"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s észrevételek"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr " %(metatypes)s kategóriák"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr " %(pingbacks)s pingbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr " %(tags)s címkék"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr " %(trackbacks)s trackbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr " %(authors)s szerzők"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr " %(rejects)s elutasítva"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr "Módosítsa a bejegyzést"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr "-án / -én"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr "Előnézet"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr "Nincsenek piszkozatok."
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr "Az összes piszkozat megtekintése"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "ban"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Hozzászólva"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Megjegyzés szerkesztése"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Szerkesztés"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Nincs még hozzászólás."
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Hozzászólás kezelése"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "LinkBack készült"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "LinkBack szerkesztése"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Nincs még LinkBack"
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Ma"
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr "Bejegyzés tervezetek"
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Gyors közzététel"
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Cím"
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Mentés piszkozatként"
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Visszaállítás"
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Közzététel"
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr "Friss hozzászólások"
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr "Friss LinkBacks"
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr "Hozzászólás előnézete"
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Kérjük, javítsa ki a következő hibát."
+msgstr[1] "Kérjük, javítsa ki a következő hibákat."
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr "A megjegyzés előnézete"
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr "Küldd el a hozzászólást!"
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr "Küldés"
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Köszönöm a megjegyzést"
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr "Vissza a bejegyzési listára"
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr "Mutasd %(author)s bejegyzéseit"
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr "Nincs címke"
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr "Rövid url"
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s hozzászólása"
+msgstr[1] "%(comment_count)s hozzászólásai"
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr "Hozzászólások lezárva."
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingback"
+msgstr[1] "%(pingback_count)s pingbacks"
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackback"
+msgstr[1] "%(trackback_count)s trackbacks"
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr "Szerző lista"
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] "%(nodetype_count)s bejegyzés"
+msgstr[1] "%(nodetype_count)s bejegyzések"
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Nincsenek még szerzők."
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr "RSS link a legutóbbi bejegyzésekhez"
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+"Használhatja a - jelet, hogy kizárjon szavakat vagy kifejezéseket, &quot;"
+"kettős idézőjelet&quot; pontos kifejezések kereséséhez, és az AND/OR logikai "
+"operátorokat zárójelekkel kombinálva az összetett kereséseknél."
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr "Naptár"
+
+#: templates/gstudio/base.html:68
+#, fuzzy
+msgid "Popular node types"
+msgstr "Népszerű bejegyzések"
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr "Arhívum"
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr "Eszközök"
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr "Műszerfal"
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr "Adj hozzá egy bejegyzést"
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr "Kijelentkezés"
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr "Bejelentkezés szükséges"
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr "Felhasználóneve és jelszava nem egyezik. Kérjük, próbálja újra."
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr "A bejegyzés megtekintéséhez be kell jelentkeznie."
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr "Bejelentkezés"
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr "Kategória lista"
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr "Nincs még kategória."
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Havi arhívum"
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr "RSS Feed-megbeszélések a témáról"
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr "RSS Feed észrevételek a témáról"
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr "RSS Feed pingbacks a témáról"
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr "RSS Feed trackback a témáról"
+
+#: templates/gstudio/nodetype_detail.html:46
+#, fuzzy
+msgid "Next node type"
+msgstr "Következő bejegyzés"
+
+#: templates/gstudio/nodetype_detail.html:60
+#, fuzzy
+msgid "Previous node type"
+msgstr "Előző bejegyzés"
+
+#: templates/gstudio/nodetype_detail.html:73
+#, fuzzy
+msgid "Related node types"
+msgstr "Kapcsolódó bejegyzések"
+
+#: templates/gstudio/nodetype_detail.html:84
+#, fuzzy
+msgid "Similar node types"
+msgstr "Hasonló bejegyzések"
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr "Hozzászólások"
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr "Pingbacks nyitva."
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr "Pingbacks zárva."
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr "Trackback URL"
+
+#: templates/gstudio/nodetype_detail.html:212
+#, fuzzy
+msgid "Edit the node type"
+msgstr "Módosítsa a bejegyzést"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr "RSS Feed"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr "Kategória"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr "Címke"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr "Szerző"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr "Oldal"
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr "Bejegyzés szerzője %(author)s "
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr "Kategória szerkesztése"
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr "Címke szerkesztése"
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr "Szerző kijavítása"
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "A találatok RSS Feed-je"
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] "%(nodetype_count)s bejegyzést találtam"
+msgstr[1] " %(nodetype_count)s bejegyzést találtam"
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr "Nincs találat."
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr "Jelszó szükséges"
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "A megadott jelszó nem érvényes. Kérjük, próbálja újra."
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr "Meg kell adnia egy jelszót, hogy megtekinthesse ezt a bejegyzést."
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr "Jelszó"
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr "Érvényes"
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr "Bejegyzések egyes kategóriákban"
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr "megjegyzés"
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr "Nincs még bejegyzés."
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr "Az összes bejegyzés"
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Címke lista"
+
+#: templates/gstudio/tag_list.html:19
+#, fuzzy
+msgid "No tags yet."
+msgstr "Nincs még kategória."
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+#, fuzzy
+msgid "No node types yet."
+msgstr "Nincs még bejegyzés."
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr "Nincsenek még arhívumok."
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, fuzzy, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] "%(nodetype_count)s bejegyzés"
+msgstr[1] "%(nodetype_count)s bejegyzések"
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+#, fuzzy
+msgid "No subtypes yet."
+msgstr "Nincs még bejegyzés."
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "%(current_page)s . oldal a %(total_page)s -ból/-ből"
+
+#: templates/gstudio/tags/pagination.html:10
+#, fuzzy
+msgid "More recent node types"
+msgstr "Mégtöbb új bejegyzés"
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr "Bejegyzések oldal"
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr "Mégtöbb régi bejegyzés"
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkback létrehozása"
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr "Nincsenek hasonló bejegyzések."
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr "A megadott kifejezés túl rövid"
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Nincs találat a megadott kifejezésre"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Felhasználónév helytelen."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Jelszó érvénytelen."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Ez a felhasználói név már foglalt."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "A felhasználó nem %s."
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr "Nincs cím"
+
+#~ msgid "Written by"
+#~ msgstr "Írta:"
+
+#~ msgid "Be first to comment!"
+#~ msgstr "Legyen Ön az első hozzászóló!"
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/it/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/gstudio/locale/it/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c6c03c0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/it/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/it/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/it/LC_MESSAGES/django.po
new file mode 100644
index 0000000..d1532b8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/it/LC_MESSAGES/django.po
@@ -0,0 +1,1337 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# babu <marco.badan@gmail.com>, 2011.
+# Julien Fache <fastomas42@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-gstudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:24+0530\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fastomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr "Ultimi articoli"
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr "Gli ultimi articoli del sito %s"
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr "Articoli per la categoria %s"
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr "Gli ultimi articoli per la categoria %s"
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr "Articoli di %s"
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr "Gli ultimi articoli di %s"
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr "Articoli taggati come %s"
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr "Ultimi articoli taggati come %s"
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr "Discussioni su %s"
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr "Ultime discussioni sull'articolo %s"
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr "Commenti su : %s"
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr "Ultimi commenti sull'articolo %s"
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingback su %s"
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr "Ultimi pingback sull'articolo %s"
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackback su %s"
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr "Ultimi trackback sull'articolo %s"
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr "bozza"
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr "non pubblicato"
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr "pubblicato"
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr "titolo"
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr "usata per la pubblicazione"
+
+#: models.py:197
+msgid "description"
+msgstr "descrizione"
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr "categoria padre"
+
+#: models.py:283
+msgid "metatype"
+msgstr "categoria"
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr "categorie"
+
+#: models.py:298
+msgid "content"
+msgstr "contenuto"
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr "immagine"
+
+#: models.py:310
+msgid "used for illustration"
+msgstr "usata come illustrazione"
+
+#: models.py:312
+msgid "excerpt"
+msgstr "estratto"
+
+#: models.py:313
+msgid "optional element"
+msgstr "elemento opzionale"
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr "tag"
+
+#: models.py:316
+#, fuzzy
+msgid "member of metatypes"
+msgstr "numero di articoli"
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr "articoli correlati"
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr "autori"
+
+#: models.py:331
+msgid "featured"
+msgstr ""
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr "commenti abilitati"
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr "linkback abilitati"
+
+#: models.py:335
+msgid "creation date"
+msgstr "data di creazione"
+
+#: models.py:337
+msgid "last update"
+msgstr "ultimo aggiornamento"
+
+#: models.py:338
+msgid "start publication"
+msgstr "inizio pubblicazione"
+
+#: models.py:339
+msgid "date start publish"
+msgstr "data inizio pubblicazione"
+
+#: models.py:341
+msgid "end publication"
+msgstr "fine pubblicazione"
+
+#: models.py:342
+msgid "date end publish"
+msgstr "data fine pubblicazione"
+
+#: models.py:345
+msgid "sites publication"
+msgstr "pubblicato sui siti"
+
+#: models.py:349
+msgid "login required"
+msgstr "richiesta identificazione"
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr "solo i visitatori autenticati possono vedere l'articolo"
+
+#: models.py:352
+msgid "password"
+msgstr "password"
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr "proteggi l'articolo con una password"
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr "template"
+
+#: models.py:358
+msgid "Default template"
+msgstr "Template di default"
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr "Template utilizzato per visualizzare l'articolo"
+
+#: models.py:568
+#, fuzzy
+msgid "node type"
+msgstr "articolo"
+
+#: models.py:569
+#, fuzzy
+msgid "node types"
+msgstr "articoli"
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+#, fuzzy
+msgid "relation type"
+msgstr "data di creazione"
+
+#: models.py:609
+#, fuzzy
+msgid "relation types"
+msgstr "data di creazione"
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+#, fuzzy
+msgid "attribute types"
+msgstr "Ultimi articoli"
+
+#: models.py:686
+#, fuzzy
+msgid "relation"
+msgstr "data di creazione"
+
+#: models.py:687
+#, fuzzy
+msgid "relations"
+msgstr "data di creazione"
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Nuovo commento inviato su \"%(title)s\""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr "Nessuna categoria padre"
+
+#: admin/forms.py:82
+#, fuzzy
+msgid "A metatype cannot be a parent of itself."
+msgstr "Una categoria non può essere categoria padre di se stessa."
+
+#: admin/forms.py:94
+#, fuzzy
+msgid "parent nodetype"
+msgstr "Articolo successivo"
+
+#: admin/forms.py:95
+#, fuzzy
+msgid "No parent nodetype"
+msgstr "Nessuna categoria padre"
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr "Catégories"
+
+#: admin/forms.py:116
+#, fuzzy
+msgid "An objectype cannot be parent of itself."
+msgstr "Una categoria non può essere categoria padre di se stessa."
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr "alberatura"
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Contenuto"
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr "Opzioni"
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr "Privacy"
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr "Discussione"
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr "Pubblicazione"
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i parole)"
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i commenti)"
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr "autore(i)"
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr "Categoria(e)"
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr "Tag"
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr "Site(s)"
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr "in corso"
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr "visibile ?"
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr "Guarda sul sito"
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr "Non disponibile"
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr "url breve"
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr "Attribuisci gli articoli all'utente"
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr "Pubblica gli articoli selezionati"
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr "Nascondi gli articoli selezionati"
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr "Manda un tweet per gli articoli selezionati"
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr "Chiudi i commenti per gli articoli selezionati"
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr "Chiudi i linkback per gli articoli selezionati"
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr ""
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr ""
+"La directory %(directory)s è stata pingata con successo per %(success)d "
+"articoli."
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr "Pinga le directory per gli articoli selezionati"
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr "Applicazione Gstudio"
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr "articoli"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Ordinamento"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Avanzato"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr "Articoli selezionati"
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+#, fuzzy
+msgid "Random node types"
+msgstr "Articoli random"
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr "Menu Articoli Gstudio"
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr "Menu Categorie Gstudio"
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr "Menu Auteur Gstudio"
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Autori"
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr "Menu Tag Gstudio"
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Tag"
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr "Elenco di articoli (default)"
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr "Dettaglio articolo"
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr "sottocategorie incluse"
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr "numero di articoli"
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr "Modello utilizzato per visualizzare il plugin"
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr "%s articoli"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Errore 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Pagina non trovata"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Spiacente, ma la pagina richiesta è introvabile."
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr "Link utili"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr "Indice del blog"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr "Mappa del site"
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+#, fuzzy
+msgid "Recent node types"
+msgstr "Articoli recenti"
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr "Ricerca"
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr "Parole chiave..."
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr "Errore 500"
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr "Errore del server"
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"C'è stato un errore. E' stato riportato agli amministratori del sito per "
+"email e dovrebbe venire risolto a breve. Grazie per la tua pazienza."
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Contenuti"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr "Discussioni"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr ""
+"%(nodetypes)s articoli\n"
+" "
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s commenti"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr "%(metatypes)s categorie"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s pingback"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s tag"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s trackback"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s autori"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s respinti"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr "Modifica l'articolo"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr "il"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr "Anteprima"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr "Nessun articolo in draft."
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr "articoli correlati"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "su"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Commenti su"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Modifica il commento"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Modifica"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Nessun commento."
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Gestisci i commenti"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Modifica il LinkBack"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Ancora nessun linkback."
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Oggi"
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr "Articoli in draft"
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Pubblicazione veloce"
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Titolo"
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Salva come bozza"
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Pubblica"
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr "Commenti recenti"
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr "Linkback recenti"
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr "Anteprima commento"
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Prego correggi l'errore seguente."
+msgstr[1] "Prego correggi gli errori seguenti."
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr "Anteprima del commento"
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr "Invia un commento"
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr "Invia"
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Grazie per il tuo commento"
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr "Torna all'elenco degli articoli"
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr "Mostra gli articoli di %(author)s"
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr "Nessun tag"
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr "Url breve"
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s commento"
+msgstr[1] "%(comment_count)s commenti"
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr "I commenti sono terminati."
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingback"
+msgstr[1] "%(pingback_count)s pingback"
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackback"
+msgstr[1] "%(trackback_count)s trackback"
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr "Elenco degli autori"
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] "%(nodetype_count)s articolo"
+msgstr[1] "%(nodetype_count)s articoli"
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Nessun autore, al momento."
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr "Feed RSS delgi ultimi articoli"
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr "Calendario"
+
+#: templates/gstudio/base.html:68
+#, fuzzy
+msgid "Popular node types"
+msgstr "Articoli popolari"
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr "Archivi"
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr "Strumenti"
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr "Dashboard"
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr "Posta un articolo"
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr "Esci"
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr "Login richiesto"
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr "La tua username e la password non corrispondono. Per cortesia riprova."
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr "Devi essere collegato per vedere questo articolo."
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr "Login"
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr "Elenco delle categorie"
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr "Nessuna categoria, al momento."
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr "Archivi giornalieri"
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Archivio mensile"
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr "Feed RSS delle discussioni su"
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr "Feed RSS dei commenti su"
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr "Feed RSS dei pingback su"
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr "Feed RSS dei trackback su"
+
+#: templates/gstudio/nodetype_detail.html:46
+#, fuzzy
+msgid "Next node type"
+msgstr "Articolo successivo"
+
+#: templates/gstudio/nodetype_detail.html:60
+#, fuzzy
+msgid "Previous node type"
+msgstr "Articolo precedente"
+
+#: templates/gstudio/nodetype_detail.html:73
+#, fuzzy
+msgid "Related node types"
+msgstr "Articles associés"
+
+#: templates/gstudio/nodetype_detail.html:84
+#, fuzzy
+msgid "Similar node types"
+msgstr "Articoli simili"
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr "Commenti"
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr "Pingback"
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr "I pingback sono aperti."
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr "I pingback sono chiusi."
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr "Trackback"
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr "URL del Trackback"
+
+#: templates/gstudio/nodetype_detail.html:212
+#, fuzzy
+msgid "Edit the node type"
+msgstr "Modifica l'articolo"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr "Feed RSS"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr "Categorie"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr "Tag"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr "Autore"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr "Pagina"
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr "Articoli di %(author)s"
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr "Modifica la categoria"
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr "Modifica il tag"
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr "Modifica l'autore"
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "Feed RSS dei risultati della ricerca per"
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] "%(nodetype_count)s articolo trouvato"
+msgstr[1] "%(nodetype_count)s articoli trovati"
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr "Nessun articolo trovato."
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr "Password richiesta"
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "La password inserita non è valida. Per cortesia riprova."
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr "Devi inserire una password per vedere questo articolo."
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr "Password"
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr "Valida"
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr "Articoli nella categoria"
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr "commento"
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr "Non ci sono ancora articoli."
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr "Tutti gli articoli"
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Elenco dei tag"
+
+#: templates/gstudio/tag_list.html:19
+#, fuzzy
+msgid "No tags yet."
+msgstr "Nessuna categoria, al momento."
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+#, fuzzy
+msgid "No node types yet."
+msgstr "Non ci sono ancora articoli."
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr "Nessun archivio, al momento."
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, fuzzy, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] "%(nodetype_count)s articolo"
+msgstr[1] "%(nodetype_count)s articoli"
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+#, fuzzy
+msgid "No subtypes yet."
+msgstr "Non ci sono ancora articoli."
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Pagina %(current_page)s di %(total_page)s"
+
+#: templates/gstudio/tags/pagination.html:10
+#, fuzzy
+msgid "More recent node types"
+msgstr "Articoli più recenti"
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr "Pagina degli articoli"
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr "Articoli vecchi"
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkback su"
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr "Nono ci sono articoli correlati."
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr "La sequenza di ricerca è troppo corta"
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Nessuna sequenza di ricerca trovata"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Username non corretta."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Password non valida."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Utenza non disponibile."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "L'utente non può %s."
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr "Nessun titolo"
+
+#~ msgid "Written by"
+#~ msgstr "Scritto da"
+
+#~ msgid "Be first to comment!"
+#~ msgstr "Sarai il primo a commentare!"
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/ml/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/ml/LC_MESSAGES/django.po
new file mode 100644
index 0000000..0f26ddc
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/ml/LC_MESSAGES/django.po
@@ -0,0 +1,1300 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:25+0530\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr ""
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr ""
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr ""
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr ""
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr ""
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr ""
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr ""
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr ""
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr ""
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr ""
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr ""
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr ""
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr ""
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr ""
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr ""
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr ""
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr ""
+
+#: models.py:197
+msgid "description"
+msgstr ""
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr ""
+
+#: models.py:283
+msgid "metatype"
+msgstr ""
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr ""
+
+#: models.py:298
+msgid "content"
+msgstr ""
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr ""
+
+#: models.py:310
+msgid "used for illustration"
+msgstr ""
+
+#: models.py:312
+msgid "excerpt"
+msgstr ""
+
+#: models.py:313
+msgid "optional element"
+msgstr ""
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr ""
+
+#: models.py:316
+msgid "member of metatypes"
+msgstr ""
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr ""
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr ""
+
+#: models.py:331
+msgid "featured"
+msgstr ""
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr ""
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr ""
+
+#: models.py:335
+msgid "creation date"
+msgstr ""
+
+#: models.py:337
+msgid "last update"
+msgstr ""
+
+#: models.py:338
+msgid "start publication"
+msgstr ""
+
+#: models.py:339
+msgid "date start publish"
+msgstr ""
+
+#: models.py:341
+msgid "end publication"
+msgstr ""
+
+#: models.py:342
+msgid "date end publish"
+msgstr ""
+
+#: models.py:345
+msgid "sites publication"
+msgstr ""
+
+#: models.py:349
+msgid "login required"
+msgstr ""
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr ""
+
+#: models.py:352
+msgid "password"
+msgstr ""
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr ""
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr ""
+
+#: models.py:358
+msgid "Default template"
+msgstr ""
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr ""
+
+#: models.py:568
+msgid "object type"
+msgstr ""
+
+#: models.py:569
+msgid "object types"
+msgstr ""
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+msgid "relation type"
+msgstr ""
+
+#: models.py:609
+msgid "relation types"
+msgstr ""
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+msgid "attribute types"
+msgstr ""
+
+#: models.py:686
+msgid "relation"
+msgstr ""
+
+#: models.py:687
+msgid "relations"
+msgstr ""
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr ""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr ""
+
+#: admin/forms.py:82
+msgid "A metatype cannot be a parent of itself."
+msgstr ""
+
+#: admin/forms.py:94
+msgid "parent nodetype"
+msgstr ""
+
+#: admin/forms.py:95
+msgid "No parent nodetype"
+msgstr ""
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr ""
+
+#: admin/forms.py:116
+msgid "An objectype cannot be parent of itself."
+msgstr ""
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr ""
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr ""
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr ""
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr ""
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr ""
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr ""
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr ""
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr ""
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr ""
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr ""
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr ""
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr ""
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr ""
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr ""
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr ""
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr ""
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr ""
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr ""
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr ""
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr ""
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr ""
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr ""
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr ""
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr ""
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr ""
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr ""
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+msgid "Random object types"
+msgstr ""
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr ""
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr ""
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr ""
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr ""
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr ""
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr ""
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr ""
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr ""
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr ""
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr ""
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr ""
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr ""
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr ""
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr ""
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr ""
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr ""
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr ""
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+msgid "Recent object types"
+msgstr ""
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr ""
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr ""
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr ""
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr ""
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr ""
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr ""
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr ""
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr ""
+
+#: templates/gstudio/base.html:68
+msgid "Popular object types"
+msgstr ""
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr ""
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr ""
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr ""
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr ""
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr ""
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr ""
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:46
+msgid "Next object type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:60
+msgid "Previous object type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:73
+msgid "Related object types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:84
+msgid "Similar object types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:212
+msgid "Edit the object type"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr ""
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr ""
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr ""
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr ""
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr ""
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:19
+msgid "No tags yet."
+msgstr ""
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+msgid "No object types yet."
+msgstr ""
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr ""
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+msgid "No subtypes yet."
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:10
+msgid "More recent object types"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr ""
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr ""
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr ""
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr ""
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr ""
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr ""
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr ""
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/mr/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/mr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..4e248d1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/mr/LC_MESSAGES/django.po
@@ -0,0 +1,1299 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:25+0530\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr ""
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr ""
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr ""
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr ""
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr ""
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr ""
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr ""
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr ""
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr ""
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr ""
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr ""
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr ""
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr ""
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr ""
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr ""
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr ""
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr ""
+
+#: models.py:197
+msgid "description"
+msgstr ""
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr ""
+
+#: models.py:283
+msgid "metatype"
+msgstr ""
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr ""
+
+#: models.py:298
+msgid "content"
+msgstr ""
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr ""
+
+#: models.py:310
+msgid "used for illustration"
+msgstr ""
+
+#: models.py:312
+msgid "excerpt"
+msgstr ""
+
+#: models.py:313
+msgid "optional element"
+msgstr ""
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr ""
+
+#: models.py:316
+msgid "member of metatypes"
+msgstr ""
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr ""
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr ""
+
+#: models.py:331
+msgid "featured"
+msgstr ""
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr ""
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr ""
+
+#: models.py:335
+msgid "creation date"
+msgstr ""
+
+#: models.py:337
+msgid "last update"
+msgstr ""
+
+#: models.py:338
+msgid "start publication"
+msgstr ""
+
+#: models.py:339
+msgid "date start publish"
+msgstr ""
+
+#: models.py:341
+msgid "end publication"
+msgstr ""
+
+#: models.py:342
+msgid "date end publish"
+msgstr ""
+
+#: models.py:345
+msgid "sites publication"
+msgstr ""
+
+#: models.py:349
+msgid "login required"
+msgstr ""
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr ""
+
+#: models.py:352
+msgid "password"
+msgstr ""
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr ""
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr ""
+
+#: models.py:358
+msgid "Default template"
+msgstr ""
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr ""
+
+#: models.py:568
+msgid "node type"
+msgstr ""
+
+#: models.py:569
+msgid "node types"
+msgstr ""
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+msgid "relation type"
+msgstr ""
+
+#: models.py:609
+msgid "relation types"
+msgstr ""
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+msgid "attribute types"
+msgstr ""
+
+#: models.py:686
+msgid "relation"
+msgstr ""
+
+#: models.py:687
+msgid "relations"
+msgstr ""
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr ""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr ""
+
+#: admin/forms.py:82
+msgid "A metatype cannot be a parent of itself."
+msgstr ""
+
+#: admin/forms.py:94
+msgid "parent nodetype"
+msgstr ""
+
+#: admin/forms.py:95
+msgid "No parent nodetype"
+msgstr ""
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr ""
+
+#: admin/forms.py:116
+msgid "An objectype cannot be parent of itself."
+msgstr ""
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr ""
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr ""
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr ""
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr ""
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr ""
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr ""
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr ""
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr ""
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr ""
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr ""
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr ""
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr ""
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr ""
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr ""
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr ""
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr ""
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr ""
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr ""
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr ""
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr ""
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr ""
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr ""
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr ""
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr ""
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr ""
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr ""
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+msgid "Random node types"
+msgstr ""
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr ""
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr ""
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr ""
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr ""
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr ""
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr ""
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr ""
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr ""
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr ""
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr ""
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr ""
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr ""
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr ""
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr ""
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr ""
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr ""
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr ""
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+msgid "Recent node types"
+msgstr ""
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr ""
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr ""
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr ""
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr ""
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr ""
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr ""
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr ""
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr ""
+
+#: templates/gstudio/base.html:68
+msgid "Popular node types"
+msgstr ""
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr ""
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr ""
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr ""
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr ""
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr ""
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr ""
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:46
+msgid "Next node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:60
+msgid "Previous node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:73
+msgid "Related node types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:84
+msgid "Similar node types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:212
+msgid "Edit the node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr ""
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr ""
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr ""
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr ""
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr ""
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:19
+msgid "No tags yet."
+msgstr ""
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+msgid "No node types yet."
+msgstr ""
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr ""
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+msgid "No subtypes yet."
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:10
+msgid "More recent node types"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr ""
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr ""
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr ""
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr ""
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr ""
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr ""
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr ""
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/nl/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/gstudio/locale/nl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..ee8950c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/nl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/nl/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/nl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..cbb47ac
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/nl/LC_MESSAGES/django.po
@@ -0,0 +1,1371 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Dries Desmet <dries@urga.be>, 2011.
+# go2people <admin@go2people.nl>, 2011.
+# Julien Fache <fantomas42@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-gstudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:24+0530\n"
+"PO-Revision-Date: 2011-09-01 06:46+0000\n"
+"Last-Translator: TrioTorus <dries@urga.be>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr "Nieuwste berichten"
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr "Het nieuwste bericht op de site %s"
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr "Berichten in de categorie %s"
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr "De nieuwste berichten in de metatype %s"
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr "Berichten van auteur %s"
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr "De nieuwste berichten van %s"
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr "Berichten voor het label %s"
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr "De nieuwste berichten voor het label %s"
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr "zoekresultaten voor '%s'"
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr "Berichten die het patroon '%s' bevatten"
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr "Discussies over %s"
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr "De nieuwste discussies voor het bericht %s"
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr "Commentaren op %s"
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr "De nieuwste commentaren op het bericht %s"
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks op %s"
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr "De nieuwste pingbacks voor het bericht %s"
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks voor %s"
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr "De nieuwste trackbacks voor het bericht %s"
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr "concept"
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr "verborgen"
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr "gepubliceerd"
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr "Titel"
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr "gebruikt voor publicatie"
+
+#: models.py:197
+msgid "description"
+msgstr "omschrijving"
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr "bovenliggende categorie"
+
+#: models.py:283
+msgid "metatype"
+msgstr "categorie"
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr "categorieën"
+
+#: models.py:298
+msgid "content"
+msgstr "inhoud"
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr "afbeelding"
+
+#: models.py:310
+msgid "used for illustration"
+msgstr "gebruikt als illustratie"
+
+#: models.py:312
+msgid "excerpt"
+msgstr "uittreksel"
+
+#: models.py:313
+msgid "optional element"
+msgstr "optioneel element"
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr "labels"
+
+#: models.py:316
+#, fuzzy
+msgid "member of metatypes"
+msgstr "aantal berichten"
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr "gerelateerde berichten"
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr "auteurs"
+
+#: models.py:331
+msgid "featured"
+msgstr "in de kijker"
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr "commentaar geactiveerd"
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr "linkback geactiveerd"
+
+#: models.py:335
+msgid "creation date"
+msgstr "aanmaakdatum"
+
+#: models.py:337
+msgid "last update"
+msgstr "Letzte Änderung"
+
+#: models.py:338
+msgid "start publication"
+msgstr "begin publicatie"
+
+#: models.py:339
+msgid "date start publish"
+msgstr "publicatiedatum"
+
+#: models.py:341
+msgid "end publication"
+msgstr "eind publicatie"
+
+#: models.py:342
+msgid "date end publish"
+msgstr "einddatum publicatie"
+
+#: models.py:345
+msgid "sites publication"
+msgstr "publicatie op site"
+
+#: models.py:349
+msgid "login required"
+msgstr "inloggen vereist"
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr "alleen geauthenticeerde gebruikers kunnen dit bericht zien"
+
+#: models.py:352
+msgid "password"
+msgstr "wachtwoord"
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr "beveilig het bericht met een wachtwoord"
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr "template"
+
+#: models.py:358
+msgid "Default template"
+msgstr "Stardaard template"
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr "gebruikte template om het bericht te tonen"
+
+#: models.py:568
+#, fuzzy
+msgid "node type"
+msgstr "bericht"
+
+#: models.py:569
+#, fuzzy
+msgid "node types"
+msgstr "berichten"
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+#, fuzzy
+msgid "relation type"
+msgstr "aanmaakdatum"
+
+#: models.py:609
+#, fuzzy
+msgid "relation types"
+msgstr "aanmaakdatum"
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+#, fuzzy
+msgid "attribute types"
+msgstr "Nieuwste berichten"
+
+#: models.py:686
+#, fuzzy
+msgid "relation"
+msgstr "aanmaakdatum"
+
+#: models.py:687
+#, fuzzy
+msgid "relations"
+msgstr "aanmaakdatum"
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+#, fuzzy
+msgid "system type"
+msgstr "de categorie"
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Nieuwe reactie op \"%(title)s\""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr "Geen bovenliggende categorie"
+
+#: admin/forms.py:82
+#, fuzzy
+msgid "A metatype cannot be a parent of itself."
+msgstr "Een categorie kan zichzelf niet bevatten"
+
+#: admin/forms.py:94
+#, fuzzy
+msgid "parent nodetype"
+msgstr "Volgend bericht"
+
+#: admin/forms.py:95
+#, fuzzy
+msgid "No parent nodetype"
+msgstr "Geen bovenliggende categorie"
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr "Categorieën"
+
+#: admin/forms.py:116
+#, fuzzy
+msgid "An objectype cannot be parent of itself."
+msgstr "Een categorie kan zichzelf niet bevatten"
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr "boomstructuur"
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Inhoud"
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr "Opties"
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr "Privacy"
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr "Discussie"
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr "Publicatie"
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i woorden)"
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i reacties)"
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr "auteur(s)"
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr "Categorie(ën)"
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr "label(s)"
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr "site(s)"
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr "is actueel"
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr "is zichtbaar"
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr "Bekijk"
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr "Op site bekijken"
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr "Niet beschikbaar"
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr "korte url"
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr "De geselecteerde berichten zijn aan u toegewezen."
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr "Wijs de berichten toe aan de gebruiker"
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr "De geselecteerde berichten zijn gepubliceerd."
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr "Geselecteerde berichten markeren als gepubliceerd"
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr "De geselecteerde berichten zijn verborgen."
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr "Geselecteerde berichten markeren als verborgen"
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr "De geselecteerde berichten zijn getweet."
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr "Geselecteerde berichten tweeten"
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr "Reacties zijn niet meer mogelijk voor de geselecteerde berichten."
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr "Commentaren sluiten voor geselecteerde berichten"
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr "Linkbacks zijn nu afgesloten voor de geselecteerde berichten."
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr "Linkbacks sluiten voor geselecteerde berichten"
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr "De geselecteerde berichten zijn op de huidige datum ingesteld."
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr "Plaats de geselecteerde berichten bovenaan voor de huidige datum"
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr "%(directory)s map heeft succesvol %(success)d berichten gepingd."
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr "Mappen pingen voor de geselecteerde berichten"
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr "Gstudio App Hook"
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr "berichten"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Sortering"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Geavanceerd"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr "Geselecteerde berichten"
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+#, fuzzy
+msgid "Random node types"
+msgstr "Willekeurige berichten"
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr "Gstudio berigchtenmenu"
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr "Gstudio categoriemenu"
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr "Gstudio auteursmenu"
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "auteurs"
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr "Gstudio labelmenu"
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Labels"
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr "Berichtenlijst (standaard)"
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr "Bericht detail"
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr "met subcategorieën"
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr "aantal berichten"
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr "Gebruikt sjabloon voor de plugin"
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr "%s berichten"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Fout 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Pagina niet gevonden"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Sorry, maar de opgevraagde pagina is niet gevonden"
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr "Handige links"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr "Blog-index"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr "Sitemap"
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+#, fuzzy
+msgid "Recent node types"
+msgstr "Nieuwste berichten"
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr "Zoek"
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr "Zoektermen..."
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr "Fout 500"
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr "Server fout"
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Er is een fout opgetreden. De site administrators zijn via e-mail op de "
+"hoogte gesteld, en het zou binnenkort opgelost moeten zijn. Bedankt voor uw "
+"geduld"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Inhoud"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr "Discussies"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr "%(nodetypes)s berichten"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s reacties"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr "%(metatypes)s categorieën"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s pingbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s labels"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s trackbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s auteurs"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s afgewezen"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr "Wijzig bericht"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr "op"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr "Voorbeeld"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr "Geen kladberichten"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr "Bekijk alle kladberichten"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "in"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Commentaar op"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Wijzig de reactie"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Wijzig"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Nog geen commentaren"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Beheer commentaren"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "maak een linkback op"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "wijzig linkback"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Nog geen linkbacks"
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Vandaag"
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr "Kladberichten"
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Snel publiceren"
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Titel"
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Bewaar als klad"
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Reset"
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Publiceer"
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr "Nieuwste commentaren"
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr "Recente linkbacks"
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr "Commentaarvoorbeeld"
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Verbeter de volgende fout."
+msgstr[1] "Verbeter de volgende fouten."
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr "Commentaarvoorbeeld"
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr "Verzend uw bericht"
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr "Verzend"
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Bedankt voor uw reactie"
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr "Terug naar de berichtenlijst"
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr "Toon berichten van %(author)s"
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr "Geen labels"
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr "Korte URL"
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s reactie"
+msgstr[1] "%(comment_count)s reacties"
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr "Reageren niet mogelijk."
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingback"
+msgstr[1] "%(pingback_count)s pingbacks"
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackback"
+msgstr[1] "%(trackback_count)s trackbacks"
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr "Auteurslijst"
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] "%(nodetype_count)s bericht"
+msgstr[1] "%(nodetype_count)s berichten"
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Nog geen autheurs"
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr "RSS-Feed van de nieuwste berichten"
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+"Gebruik - om woorden of zinnen uit te sluiten, ' of \" voor exacte woorden "
+"en AND of OR gecombineerd met () voor complexe zoekopdrachten."
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr "Kalender"
+
+#: templates/gstudio/base.html:68
+#, fuzzy
+msgid "Popular node types"
+msgstr "Populaire berichten"
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr "Archief"
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr "Hulpmiddelen"
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr "Dashboard"
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr "Plaats een bericht"
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr "Log uit"
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr "Login verplicht"
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr "Uw gebruikersnaam of wachtwoord is niet correct. Probeer opnieuw."
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr "U moet verbonden zijn om dit bericht te kunnen zien"
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr "Inloggen"
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr "Categorieënlijst"
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr "Nog geen categorieën"
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr "dagarchieven"
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Maandelijkse archieven"
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr "RSS-Feed van discussies voor"
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr "RSS-Feed van commentaren voor"
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr "RSS-Feed van pingbacks voor"
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr "RSS-Feed van trackbacks voor"
+
+#: templates/gstudio/nodetype_detail.html:46
+#, fuzzy
+msgid "Next node type"
+msgstr "Volgend bericht"
+
+#: templates/gstudio/nodetype_detail.html:60
+#, fuzzy
+msgid "Previous node type"
+msgstr "Vorig bericht"
+
+#: templates/gstudio/nodetype_detail.html:73
+#, fuzzy
+msgid "Related node types"
+msgstr "Gerelateerde berichten"
+
+#: templates/gstudio/nodetype_detail.html:84
+#, fuzzy
+msgid "Similar node types"
+msgstr "Vergelijkbare berichten"
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr "Reacties"
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr "Pingbacks beschikbaar."
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr "Pingbacks niet beschikbaar."
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr "Trackback URL"
+
+#: templates/gstudio/nodetype_detail.html:212
+#, fuzzy
+msgid "Edit the node type"
+msgstr "Wijzig bericht"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr "Laatste berichten van"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr "de categorie"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr "het label"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr "de auteur"
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr "pagina"
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr "RSS-Feed"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr "Categorie"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr "Label"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr "Auteur"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr "Pagina"
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr "Berichten van %(author)s"
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr "Wijzig de categorie"
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr "Wijzig het label"
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr "Wijzig de auteur"
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr "zoekresultaten voor"
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "RSS-Feed met zoekresultaten van"
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] "%(nodetype_count)s bericht gevonden"
+msgstr[1] "%(nodetype_count)s berichten gevonden"
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr "Niks gevonden."
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr "Wachtwoord vereist"
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "Het opgegeven wachtwoord is niet geldig. Probeer opnieuw."
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr "U moet een wachtwoord opgeven om dit bericht te kunnen zien"
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr "Geldig"
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr "Berichten per categorieën"
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr "reactie"
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr "Nog geen berichten."
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr "Alle berichten"
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr "labellijst"
+
+#: templates/gstudio/tag_list.html:19
+#, fuzzy
+msgid "No tags yet."
+msgstr "Nog geen categorieën"
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+#, fuzzy
+msgid "No node types yet."
+msgstr "Nog geen berichten."
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr "Nog geen archieven"
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, fuzzy, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] "%(nodetype_count)s bericht"
+msgstr[1] "%(nodetype_count)s berichten"
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+#, fuzzy
+msgid "No subtypes yet."
+msgstr "Nog geen berichten."
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Pagina %(current_page)s van %(total_page)s"
+
+#: templates/gstudio/tags/pagination.html:10
+#, fuzzy
+msgid "More recent node types"
+msgstr "Meer nieuwste berichten"
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr "Berichtenpagina"
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr "Meer oude berichten"
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkback voor"
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr "Geen vergelijkbare berichten."
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr "De zoekterm is te kort"
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Geen zoekterm gevonden"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Gebruikersnaam is incorrect"
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Wachtwoord is ongeldig"
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Gebruiker is niet beschikbaar"
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "Gebruiker kan niet %s."
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr "Geen titel"
+
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgid "IP"
+#~ msgstr "IP"
+
+#~ msgid "Comment"
+#~ msgstr "Reactie"
+
+#~ msgid "View this comment"
+#~ msgstr "Bekijk deze reactie"
+
+#~ msgid "Flag this comment"
+#~ msgstr "Markeer deze reactie"
+
+#~ msgid "Delete this comment"
+#~ msgstr "Verwijder deze reactie"
+
+#~ msgid "Approve this comment"
+#~ msgstr "Keur deze reactie goed"
+
+#~ msgid "Written by"
+#~ msgstr "Geschreven door"
+
+#~ msgid "Written on"
+#~ msgstr "Gepost op"
+
+#~ msgid "Be first to comment!"
+#~ msgstr "Schrijf als eerste een reactie!"
+
+#~ msgid "View site"
+#~ msgstr "Bekijk site"
+
+#~ msgid "Admin. site"
+#~ msgstr "Beheer site"
+
+#~ msgid "Manage comments"
+#~ msgstr "Reacties beheren"
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/pl/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/gstudio/locale/pl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c027645
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/pl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/pl/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/pl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c138949
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/pl/LC_MESSAGES/django.po
@@ -0,0 +1,1327 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# vvarp <vvarpp@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-gstudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:24+0530\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fastomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr "Ostatnie wpisy"
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr "Najnowsze wpisy na stronie %s"
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr "Wpisy dla kategorii %s"
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr ""
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr ""
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr ""
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr ""
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr "Komentarze do %s"
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr ""
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr ""
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr ""
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr ""
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr ""
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr "szkic"
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr "ukryty"
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr "opublikowany"
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr "tytuł"
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr ""
+
+#: models.py:197
+msgid "description"
+msgstr "opis"
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr "kategoria nadrzędna"
+
+#: models.py:283
+msgid "metatype"
+msgstr "kategoria"
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr "kategorie"
+
+#: models.py:298
+msgid "content"
+msgstr ""
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr ""
+
+#: models.py:310
+msgid "used for illustration"
+msgstr ""
+
+#: models.py:312
+msgid "excerpt"
+msgstr ""
+
+#: models.py:313
+msgid "optional element"
+msgstr ""
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr ""
+
+#: models.py:316
+#, fuzzy
+msgid "member of metatypes"
+msgstr "kategorie"
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr ""
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr ""
+
+#: models.py:331
+msgid "featured"
+msgstr ""
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr ""
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr ""
+
+#: models.py:335
+msgid "creation date"
+msgstr ""
+
+#: models.py:337
+msgid "last update"
+msgstr ""
+
+#: models.py:338
+msgid "start publication"
+msgstr ""
+
+#: models.py:339
+msgid "date start publish"
+msgstr ""
+
+#: models.py:341
+msgid "end publication"
+msgstr ""
+
+#: models.py:342
+msgid "date end publish"
+msgstr ""
+
+#: models.py:345
+msgid "sites publication"
+msgstr ""
+
+#: models.py:349
+msgid "login required"
+msgstr ""
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr ""
+
+#: models.py:352
+msgid "password"
+msgstr ""
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr ""
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr ""
+
+#: models.py:358
+msgid "Default template"
+msgstr ""
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr ""
+
+#: models.py:568
+#, fuzzy
+msgid "node type"
+msgstr "Następny wpis"
+
+#: models.py:569
+#, fuzzy
+msgid "node types"
+msgstr "Następny wpis"
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+msgid "relation type"
+msgstr ""
+
+#: models.py:609
+#, fuzzy
+msgid "relation types"
+msgstr "kategorie"
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+#, fuzzy
+msgid "attribute types"
+msgstr "Ostatnie wpisy"
+
+#: models.py:686
+msgid "relation"
+msgstr ""
+
+#: models.py:687
+msgid "relations"
+msgstr ""
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr ""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr ""
+
+#: admin/forms.py:82
+msgid "A metatype cannot be a parent of itself."
+msgstr ""
+
+#: admin/forms.py:94
+#, fuzzy
+msgid "parent nodetype"
+msgstr "Następny wpis"
+
+#: admin/forms.py:95
+#, fuzzy
+msgid "No parent nodetype"
+msgstr "Następny wpis"
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr ""
+
+#: admin/forms.py:116
+msgid "An objectype cannot be parent of itself."
+msgstr ""
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr ""
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr ""
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr ""
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr ""
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr ""
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr ""
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr ""
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr ""
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr ""
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr ""
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr ""
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr ""
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr ""
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr ""
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr ""
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr ""
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr ""
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr ""
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr ""
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr ""
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr ""
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr ""
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr ""
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr ""
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr ""
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr ""
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+#, fuzzy
+msgid "Random node types"
+msgstr "Ostatnie wpisy"
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr ""
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr ""
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr ""
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr ""
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr ""
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr ""
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr ""
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr ""
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr ""
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr ""
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr ""
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr ""
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr ""
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr ""
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr ""
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr ""
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr ""
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+#, fuzzy
+msgid "Recent node types"
+msgstr "Następny wpis"
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr ""
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr ""
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr ""
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr ""
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr ""
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr ""
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr "Kanał RSS najnowszych wpisów"
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr ""
+
+#: templates/gstudio/base.html:68
+#, fuzzy
+msgid "Popular node types"
+msgstr "Podobne wpisy"
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr ""
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr ""
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr ""
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr ""
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr ""
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr ""
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr "Brak kategorii."
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:46
+#, fuzzy
+msgid "Next node type"
+msgstr "Następny wpis"
+
+#: templates/gstudio/nodetype_detail.html:60
+#, fuzzy
+msgid "Previous node type"
+msgstr "Poprzedni wpis"
+
+#: templates/gstudio/nodetype_detail.html:73
+#, fuzzy
+msgid "Related node types"
+msgstr "Ostatnie wpisy"
+
+#: templates/gstudio/nodetype_detail.html:84
+#, fuzzy
+msgid "Similar node types"
+msgstr "Podobne wpisy"
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr "Komentarze"
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:212
+#, fuzzy
+msgid "Edit the node type"
+msgstr "Wszystkie wpisy"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr "Kategoria"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr "Autor"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr "Strona"
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr "Nic nie znaleziono."
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr ""
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr ""
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr ""
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr "Wpisów w kategoriach"
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr ""
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr "Wszystkie wpisy"
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Lista tagów"
+
+#: templates/gstudio/tag_list.html:19
+#, fuzzy
+msgid "No tags yet."
+msgstr "Brak kategorii."
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+#, fuzzy
+msgid "No node types yet."
+msgstr "Brak kategorii."
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr ""
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+#, fuzzy
+msgid "No subtypes yet."
+msgstr "Brak kategorii."
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:10
+#, fuzzy
+msgid "More recent node types"
+msgstr "Ostatnie wpisy"
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr ""
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr ""
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr "Brak podobnych wpisów."
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr ""
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr ""
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Nazwa użytkownika jest nieprawidłowa."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Hasło jest nieprawidłowe."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Konto użytkownika niedostępne."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr ""
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr ""
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/pt_BR/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/gstudio/locale/pt_BR/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..97a9228
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/pt_BR/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/pt_BR/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/pt_BR/LC_MESSAGES/django.po
new file mode 100644
index 0000000..f70a4b4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/pt_BR/LC_MESSAGES/django.po
@@ -0,0 +1,1341 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# rogerio rgrlinux <rgrlinux@gmail.com>, 2011.
+# Seta00 <reuben@seta00.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-gstudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:24+0530\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fastomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr "Últimos artigos"
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr "Últimos artigos no site %s"
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr "Artigos na categoria %s"
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr "Últimos artigos na categoria %s"
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr "Artigos do autor %s"
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr "Últimos artigos por %s"
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr "Artigos com a tag %s"
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr "Últimos artigos com a tag %s"
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr "Resultados da busca por '%s'"
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr "Os artigos contendo '%s'"
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr "Discussões sobre %s"
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr "Últimas discussões sobre o artigo %s"
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr "Comentários sobre %s"
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr "Os comentários mais recentes para o artigo %s"
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks sobre %s"
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr "Os últimos pingbacks sobre o artigo %s"
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks sobre %s"
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr "Os últimos trackbacks sobre o artigo %s"
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr "projeto"
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr "oculto"
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr "publicado"
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr "título"
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr "utilizados para publicação"
+
+#: models.py:197
+msgid "description"
+msgstr "descrição"
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr "categoria pai"
+
+#: models.py:283
+msgid "metatype"
+msgstr "categoria"
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr "categorias"
+
+#: models.py:298
+msgid "content"
+msgstr "conteúdo"
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr "imagem"
+
+#: models.py:310
+msgid "used for illustration"
+msgstr "utilizados para ilustração"
+
+#: models.py:312
+msgid "excerpt"
+msgstr "resumo"
+
+#: models.py:313
+msgid "optional element"
+msgstr "elemento opcional"
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr "tags"
+
+#: models.py:316
+#, fuzzy
+msgid "member of metatypes"
+msgstr "número de artigos"
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr "artigos relacionados"
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr "autores"
+
+#: models.py:331
+msgid "featured"
+msgstr "featured"
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr "comentário habilitado"
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr "linkback habilitado"
+
+#: models.py:335
+msgid "creation date"
+msgstr "data de criação"
+
+#: models.py:337
+msgid "last update"
+msgstr "última atualização"
+
+#: models.py:338
+msgid "start publication"
+msgstr "início da publicação"
+
+#: models.py:339
+msgid "date start publish"
+msgstr "data de início da publicação"
+
+#: models.py:341
+msgid "end publication"
+msgstr "publicação final"
+
+#: models.py:342
+msgid "date end publish"
+msgstr "data de término da publicação"
+
+#: models.py:345
+msgid "sites publication"
+msgstr "publicação sites"
+
+#: models.py:349
+msgid "login required"
+msgstr "é necessário fazer login"
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr "somente os usuários autenticados podem ver este artigo"
+
+#: models.py:352
+msgid "password"
+msgstr "senha"
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr "proteger o artigo com uma senha"
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr "modelo"
+
+#: models.py:358
+msgid "Default template"
+msgstr "modelo padrão"
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr "modelo usado para exibir o artigo"
+
+#: models.py:568
+#, fuzzy
+msgid "node type"
+msgstr "artigo"
+
+#: models.py:569
+#, fuzzy
+msgid "node types"
+msgstr "artigos"
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+#, fuzzy
+msgid "relation type"
+msgstr "data de criação"
+
+#: models.py:609
+#, fuzzy
+msgid "relation types"
+msgstr "data de criação"
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+#, fuzzy
+msgid "attribute types"
+msgstr "Últimos artigos"
+
+#: models.py:686
+#, fuzzy
+msgid "relation"
+msgstr "data de criação"
+
+#: models.py:687
+#, fuzzy
+msgid "relations"
+msgstr "data de criação"
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+#, fuzzy
+msgid "system type"
+msgstr "na categoria"
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[ %(site)s ] Novo comentário postado em \" %(title)s \""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr "Nenhuma categoria pai"
+
+#: admin/forms.py:82
+#, fuzzy
+msgid "A metatype cannot be a parent of itself."
+msgstr "A categoria não pode ser pai de si mesmo."
+
+#: admin/forms.py:94
+#, fuzzy
+msgid "parent nodetype"
+msgstr "Próximo artigo"
+
+#: admin/forms.py:95
+#, fuzzy
+msgid "No parent nodetype"
+msgstr "Nenhuma categoria pai"
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr "Categorias"
+
+#: admin/forms.py:116
+#, fuzzy
+msgid "An objectype cannot be parent of itself."
+msgstr "A categoria não pode ser pai de si mesmo."
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr "caminho de árvore"
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Conteúdo"
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr "Opções"
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr "Privacidade"
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr "Discussão"
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr "Publicação"
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i palavras)"
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i comentários)"
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr "autor (es)"
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr "categoria (s)"
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr "tag (s)"
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr "site (s)"
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr "é atual"
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr "é visível"
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr "Ver"
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr "Ver no site"
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr "Indisponível"
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr "url curta"
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr "Os artigos selecionados agora pertencem a você."
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr "Definir os artigos para o usuário"
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr "Os artigos selecionados foram publicados."
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr "Definir artigos selecionados conforme publicado"
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr "Os artigos selecionados foram escondidos."
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr "Definir artigos selecionados como oculto"
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr "Os artigos selecionados foram twitados."
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr "Tweet artigos selecionados"
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr "Comentários foram desativados nos artigos selecionados."
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr "Feche os comentários para os artigos selecionados"
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr "Linkbacks foram desativados nos artigos selecionados."
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr "Feche os linkbacks para os artigos selecionados"
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr "Os artigos selecionados agora pertencem à data atual."
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr "Colocar os artigos selecionados no topo por hoje"
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr "%(directory)s diretório pingado com sucesso %(success)d artigos."
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr "Pingar diretórios para os artigos selecionados"
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr "Gstudio App Hook"
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr "artigos"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Seleção"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Avançado"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr "Artigos selecionados"
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+#, fuzzy
+msgid "Random node types"
+msgstr "Artigos aleatórios"
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr "Gstudio Menu de Artigo"
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr "Gstudio Menu de Categoria"
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr "Gstudio Menu de Autor"
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Autores"
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr "Gstudio Menu de Tag"
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Tags"
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr "Lista de artigos (padrão)"
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr "Artigo detalhado"
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr "Incluir subcategorias"
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr "número de artigos"
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr "Modelo usado para exibir o plugin"
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr "%s artigos"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Erro 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Página não encontrada"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Desculpe, mas a página solicitada não pode ser encontrada."
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr "Links úteis"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr "Índice do Blog"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr "Mapa do Site"
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+#, fuzzy
+msgid "Recent node types"
+msgstr "Artigos recentes"
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr "Pesquisa"
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr "Palavras-chave ..."
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr "Erro 500"
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr "Erro de servidor"
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Houve um erro. Foi relatado aos administradores do site via e-mail e deve "
+"ser corrigido em breve. Obrigado pela sua paciência."
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Conteúdos"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr "Discussões"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr " %(nodetypes)s artigos"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s comentários"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr "%(metatypes)s categorias"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s pingbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s tags"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s trackbacks"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s autores"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s rejeitados"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr "Editar o artigo"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr "em"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr "Visualizar"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr "Não há entradas de rascunho."
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr "Ver todas as entradas de rascunho"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "em"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Comentários sobre"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Editar o comentário"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Editar"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Ainda não há comentários."
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Gerenciar os comentários"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "fez um linkback em"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Editar o linkback"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Não linkbacks ainda."
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Hoje"
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr "Rascunho de artigos"
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Publicação rápida"
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Título"
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Salvar como rascunho"
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Reset"
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Publicar"
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr "Comentários recentes"
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr "Linkbacks recentes"
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr "Visualizar comentário"
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Corrija o seguinte erro."
+msgstr[1] "Corrija os seguintes erros."
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr "Visualização do comentário"
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr "Envie seu comentário"
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr "Enviar"
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Obrigado pelo seu comentário"
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr "Voltar à lista de artigos"
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr "Mostrar artigos do %(author)s "
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr "Não há tags"
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr "url curta"
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s comentário"
+msgstr[1] "%(comment_count)s comentários"
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr "Comentários estão fechados."
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingbacks"
+msgstr[1] "%(pingback_count)s pingbacks"
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackbacks"
+msgstr[1] "%(trackback_count)s trackbacks"
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr "Lista de autores"
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] "%(nodetype_count)s artigo"
+msgstr[1] "%(nodetype_count)s artigos"
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Nenhum autor ainda."
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr "RSS Feed dos últimos artigos"
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+"Você pode usar - para excluir palavras ou frases, \"aspas duplas\" para "
+"frases exatas e os operadores AND/OR combinados com parênteses para uma "
+"busca mais complexa."
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr "Calendário"
+
+#: templates/gstudio/base.html:68
+#, fuzzy
+msgid "Popular node types"
+msgstr "Artigos mais populares"
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr "Arquivos"
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr "Ferramentas"
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr "Dashboard"
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr "Enviar um comentário"
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr "Sair da sessão"
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr "Login necessário"
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+"Seu nome de usuário e a senha não correspondem. Por favor, tente novamente."
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr "Você precisa estar conectado para visualizar este comentário."
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr "Login"
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr "Lista de categorias"
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr "Não há categorias ainda."
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr "Arquivos diários"
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Arquivos mensais"
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr "RSS Feed das discussões"
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr "RSS Feed dos comentários"
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr "RSS Feed das pingbacks"
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr "RSS Feed dos trackbacks"
+
+#: templates/gstudio/nodetype_detail.html:46
+#, fuzzy
+msgid "Next node type"
+msgstr "Próximo artigo"
+
+#: templates/gstudio/nodetype_detail.html:60
+#, fuzzy
+msgid "Previous node type"
+msgstr "Artigo anterior"
+
+#: templates/gstudio/nodetype_detail.html:73
+#, fuzzy
+msgid "Related node types"
+msgstr "Artigos relacionados"
+
+#: templates/gstudio/nodetype_detail.html:84
+#, fuzzy
+msgid "Similar node types"
+msgstr "Artigos semelhantes"
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr "Comentários"
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr "Pingbacks estão abertas."
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr "Pingbacks estão fechados."
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr "Trackback URL"
+
+#: templates/gstudio/nodetype_detail.html:212
+#, fuzzy
+msgid "Edit the node type"
+msgstr "Editar o artigo"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr "Ultimos artigos"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr "na categoria"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr "na tag"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr "do autor"
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr "na página"
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr "RSS Feed"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr "Categoria"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr "Tag"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr "Autor"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr "Página"
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr "Artigos por %(author)s"
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr "Editar a categoria"
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr "Editar o tag"
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr "Editar o autor"
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr "Resultados da busca por"
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "RSS Feed do resultado da pesquisa de"
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] "%(nodetype_count)s artigo encontrado"
+msgstr[1] "%(nodetype_count)s artigos encontrados"
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr "Nada foi encontrado."
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr "Senha necessária"
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "A senha fornecida não é válida. Por favor, tente novamente."
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr "É preciso fornecer uma senha para visualizar este artigo."
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr "Senha"
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr "Válido"
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr "Artigos por categorias"
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr "comentário"
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr "Não há artigos ainda."
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr "Todas os artigos"
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Lista de tags"
+
+#: templates/gstudio/tag_list.html:19
+#, fuzzy
+msgid "No tags yet."
+msgstr "Não há categorias ainda."
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+#, fuzzy
+msgid "No node types yet."
+msgstr "Não há artigos ainda."
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr "Não há arquivos ainda."
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, fuzzy, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] "%(nodetype_count)s artigo"
+msgstr[1] "%(nodetype_count)s artigos"
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+#, fuzzy
+msgid "No subtypes yet."
+msgstr "Não há artigos ainda."
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Página %(current_page)s de %(total_page)s"
+
+#: templates/gstudio/tags/pagination.html:10
+#, fuzzy
+msgid "More recent node types"
+msgstr "Artigos mais recentes"
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr "Página de artigos"
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr "Artigos mais antigos"
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkback em"
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr "Não há artigos semelhantes."
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr "O padrão é muito curto"
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Nenhum padrão encontrado"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Nome de usuário está incorreto."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "A senha é inválida."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Conta de usuário não disponível."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "Usuário não pode %s."
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr "Sem título"
+
+#~ msgid "Written by"
+#~ msgstr "Escrito por"
+
+#~ msgid "Written on"
+#~ msgstr "Escrito em"
+
+#~ msgid "Be first to comment!"
+#~ msgstr "Seja o primeiro a comentar!"
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/pu/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/pu/LC_MESSAGES/django.po
new file mode 100644
index 0000000..4e248d1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/pu/LC_MESSAGES/django.po
@@ -0,0 +1,1299 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:25+0530\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr ""
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr ""
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr ""
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr ""
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr ""
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr ""
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr ""
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr ""
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr ""
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr ""
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr ""
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr ""
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr ""
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr ""
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr ""
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr ""
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr ""
+
+#: models.py:197
+msgid "description"
+msgstr ""
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr ""
+
+#: models.py:283
+msgid "metatype"
+msgstr ""
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr ""
+
+#: models.py:298
+msgid "content"
+msgstr ""
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr ""
+
+#: models.py:310
+msgid "used for illustration"
+msgstr ""
+
+#: models.py:312
+msgid "excerpt"
+msgstr ""
+
+#: models.py:313
+msgid "optional element"
+msgstr ""
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr ""
+
+#: models.py:316
+msgid "member of metatypes"
+msgstr ""
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr ""
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr ""
+
+#: models.py:331
+msgid "featured"
+msgstr ""
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr ""
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr ""
+
+#: models.py:335
+msgid "creation date"
+msgstr ""
+
+#: models.py:337
+msgid "last update"
+msgstr ""
+
+#: models.py:338
+msgid "start publication"
+msgstr ""
+
+#: models.py:339
+msgid "date start publish"
+msgstr ""
+
+#: models.py:341
+msgid "end publication"
+msgstr ""
+
+#: models.py:342
+msgid "date end publish"
+msgstr ""
+
+#: models.py:345
+msgid "sites publication"
+msgstr ""
+
+#: models.py:349
+msgid "login required"
+msgstr ""
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr ""
+
+#: models.py:352
+msgid "password"
+msgstr ""
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr ""
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr ""
+
+#: models.py:358
+msgid "Default template"
+msgstr ""
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr ""
+
+#: models.py:568
+msgid "node type"
+msgstr ""
+
+#: models.py:569
+msgid "node types"
+msgstr ""
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+msgid "relation type"
+msgstr ""
+
+#: models.py:609
+msgid "relation types"
+msgstr ""
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+msgid "attribute types"
+msgstr ""
+
+#: models.py:686
+msgid "relation"
+msgstr ""
+
+#: models.py:687
+msgid "relations"
+msgstr ""
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr ""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr ""
+
+#: admin/forms.py:82
+msgid "A metatype cannot be a parent of itself."
+msgstr ""
+
+#: admin/forms.py:94
+msgid "parent nodetype"
+msgstr ""
+
+#: admin/forms.py:95
+msgid "No parent nodetype"
+msgstr ""
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr ""
+
+#: admin/forms.py:116
+msgid "An objectype cannot be parent of itself."
+msgstr ""
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr ""
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr ""
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr ""
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr ""
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr ""
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr ""
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr ""
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr ""
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr ""
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr ""
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr ""
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr ""
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr ""
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr ""
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr ""
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr ""
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr ""
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr ""
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr ""
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr ""
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr ""
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr ""
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr ""
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr ""
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr ""
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr ""
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+msgid "Random node types"
+msgstr ""
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr ""
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr ""
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr ""
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr ""
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr ""
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr ""
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr ""
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr ""
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr ""
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr ""
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr ""
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr ""
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr ""
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr ""
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr ""
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr ""
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr ""
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+msgid "Recent node types"
+msgstr ""
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr ""
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr ""
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr ""
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr ""
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr ""
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr ""
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr ""
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr ""
+
+#: templates/gstudio/base.html:68
+msgid "Popular node types"
+msgstr ""
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr ""
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr ""
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr ""
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr ""
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr ""
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr ""
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:46
+msgid "Next node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:60
+msgid "Previous node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:73
+msgid "Related node types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:84
+msgid "Similar node types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:212
+msgid "Edit the node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr ""
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr ""
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr ""
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr ""
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr ""
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:19
+msgid "No tags yet."
+msgstr ""
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+msgid "No node types yet."
+msgstr ""
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr ""
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+msgid "No subtypes yet."
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:10
+msgid "More recent node types"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr ""
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr ""
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr ""
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr ""
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr ""
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr ""
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr ""
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/ru/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/gstudio/locale/ru/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..22b14c9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/ru/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/ru/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/ru/LC_MESSAGES/django.po
new file mode 100644
index 0000000..0c97589
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/ru/LC_MESSAGES/django.po
@@ -0,0 +1,1344 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Julien Fache <fastomas42@gmail.com>, 2011.
+# Max <makc.kekc@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-gstudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:24+0530\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fastomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr "Последние записи"
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr "Последние новости сайта %s"
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr "Записи в категории %s"
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr "Последние новости в категории %s"
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr "Записи от %s"
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr "Последние новости от %s"
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr "Записи с тегом %s"
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr "Последние новости с тегом %s"
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr "Обсуждений %s"
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr "Последние комментарии к %s"
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr "Комментарии к %s"
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr "Последние комментарии к %s"
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Пингбэки к %s"
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr "Последние пингбэки к %s"
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Трэкбэки к %s"
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr "Последние трэкбэки к %s"
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr "черновик"
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr "скрыта"
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr "опубликована"
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr "заголовок"
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr "используется при публикации"
+
+#: models.py:197
+msgid "description"
+msgstr "описание"
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr "родительская категория"
+
+#: models.py:283
+msgid "metatype"
+msgstr "категория"
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr "категории"
+
+#: models.py:298
+msgid "content"
+msgstr "содержимое"
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr "изображение"
+
+#: models.py:310
+msgid "used for illustration"
+msgstr "используется для иллюстрации"
+
+#: models.py:312
+msgid "excerpt"
+msgstr "выдержка"
+
+#: models.py:313
+msgid "optional element"
+msgstr "необязательный элемент"
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr "тэги"
+
+#: models.py:316
+#, fuzzy
+msgid "member of metatypes"
+msgstr "количество записей"
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr "связанные записи"
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr "авторы"
+
+#: models.py:331
+msgid "featured"
+msgstr "Популярные"
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr "комментирование включено"
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr "обратные ссылки включены"
+
+#: models.py:335
+msgid "creation date"
+msgstr "дата создания"
+
+#: models.py:337
+msgid "last update"
+msgstr "последнее обновление"
+
+#: models.py:338
+msgid "start publication"
+msgstr "начало публикации"
+
+#: models.py:339
+msgid "date start publish"
+msgstr "дата начала публикации"
+
+#: models.py:341
+msgid "end publication"
+msgstr "окончание публикации"
+
+#: models.py:342
+msgid "date end publish"
+msgstr "дата окончания публикации"
+
+#: models.py:345
+msgid "sites publication"
+msgstr "сайты для публикации"
+
+#: models.py:349
+msgid "login required"
+msgstr "требуется авторизация"
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr "только авторизованные пользователи могут просматривать запись"
+
+#: models.py:352
+msgid "password"
+msgstr "пароль"
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr "защитить запись паролем"
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr "шаблон"
+
+#: models.py:358
+msgid "Default template"
+msgstr "Шаблон по умолчанию"
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr "шаблон, используемый для отображения записи"
+
+#: models.py:568
+#, fuzzy
+msgid "node type"
+msgstr "запись"
+
+#: models.py:569
+#, fuzzy
+msgid "node types"
+msgstr "записи"
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+#, fuzzy
+msgid "relation type"
+msgstr "дата создания"
+
+#: models.py:609
+#, fuzzy
+msgid "relation types"
+msgstr "дата создания"
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+#, fuzzy
+msgid "attribute types"
+msgstr "Последние записи"
+
+#: models.py:686
+#, fuzzy
+msgid "relation"
+msgstr "дата создания"
+
+#: models.py:687
+#, fuzzy
+msgid "relations"
+msgstr "дата создания"
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Новый комментарий к \"%(title)s\""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr "Отсутствует родительская категория"
+
+#: admin/forms.py:82
+#, fuzzy
+msgid "A metatype cannot be a parent of itself."
+msgstr "Категория не может быть унаследована от самой себя."
+
+#: admin/forms.py:94
+#, fuzzy
+msgid "parent nodetype"
+msgstr "Следующая запись"
+
+#: admin/forms.py:95
+#, fuzzy
+msgid "No parent nodetype"
+msgstr "Отсутствует родительская категория"
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr "Категории"
+
+#: admin/forms.py:116
+#, fuzzy
+msgid "An objectype cannot be parent of itself."
+msgstr "Категория не может быть унаследована от самой себя."
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr "путь"
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Содержимое"
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr "Опции"
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr "приватность"
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr "Обсуждение"
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr "Публикация"
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i слов)"
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i комментариев)"
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr "автор(ы)"
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr "категория(категории)"
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr "тэг(и)"
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr "сайт(ы)"
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr "актуальна"
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr "видима"
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr "Смотреть на сайте"
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr "Недоступно"
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr "короткая ссылка"
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr "Установить записи пользователю"
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr "Пометить выделенные записи как опубликованные"
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr "Пометить выделенные записи как скрытые"
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr "Отправить выбранные записи в твиттер"
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr "Закрыть комментирование для выбранных записей"
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr "Запретить обратные ссылки для выбранных записей"
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr "Поднять выбранные записи на текущую дату"
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr "%(directory)s успешно оповещены о %(success)d записей"
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr "Оповестить каталоги о выбранных записях"
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr "Gstudio App Hook"
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr "записи"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Сортировка"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Расширенный"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr "Выбранные записи"
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+#, fuzzy
+msgid "Random node types"
+msgstr "Случайные записи"
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr "Gstudio меню записи"
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr "Gstudio меню каталога"
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr "Gstudio меню автора"
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Авторы"
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr "Gstudio меню тега"
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Теги"
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr "Список записей (по умолчанию)"
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr "Просмотреть запись подробнее"
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr "включает подкатегории"
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr "количество записей"
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr "Шаблон для отображения плагина"
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr "%s записей"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Ошибка 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Страница не найдена"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Извините, запрашиваемая страница не найдена."
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr "Полезные ссылки"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr "Содержание блога"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr "Карта сайта"
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+#, fuzzy
+msgid "Recent node types"
+msgstr "Последние записи"
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr "Поиск"
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr "Ключевые слова..."
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr "Ошибка 500"
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr "Ошибка сервера"
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Произошла ошибка. Администраторы сайта получили уведомление на e-mail, и "
+"решают проблему. Спасибо за ваше терпение."
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Содержимое"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr "Обсуждения"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr "%(nodetypes)s записей"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s комментариев "
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr "%(metatypes)s категорий"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s пингбэков"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s тегов"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s трэкбэков"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s авторов"
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s отклонены"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr "Изменить запись"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr "на"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr "Предпросмотр"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr "Записи отсутствуют."
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr "Просмотреть все записи"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "в"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Комментарий к "
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Редактировать комментарий"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Редактировать"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Еще нет комментариев."
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Модерировать комментарии"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "включить обратные ссылки"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Редактировать обратную ссылку"
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Обратных ссылок нет."
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Сегодня"
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr "Связанные записи"
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Быстрая публикация"
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Заголовок"
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Сохранить как черновик"
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Сброс"
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Опубликована"
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr "Последние комментарии"
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr "Последние обратные ссылки"
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr "Предпросмотр комментария"
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Пожалуйста, исправьте следующую ошибку."
+msgstr[1] "Пожалуйста, исправьте следующие ошибки."
+msgstr[2] "Пожалуйста, исправьте следующие ошибки."
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr "Предварительный просмотр комментария"
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr "Написать комментарий"
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr "Опубликовать"
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Спасибо за комментарий"
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr "Вернуться к списку записей"
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr "Показать записи %(author)s"
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr "Нет тегов"
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr "Короткая ссылка"
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s комментарий"
+msgstr[1] "%(comment_count)s комментариев"
+msgstr[2] "%(comment_count)s комментарии"
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr "Комментирование отключено."
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s оповещение"
+msgstr[1] "%(pingback_count)s оповещений"
+msgstr[2] "%(pingback_count)s оповещения"
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s архив"
+msgstr[1] "%(trackback_count)s архивов"
+msgstr[2] "%(trackback_count)s архивы"
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr "Список авторов"
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] "%(nodetype_count)s запись"
+msgstr[1] "%(nodetype_count)s записей"
+msgstr[2] "%(nodetype_count)s записи"
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Авторов нет."
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr "RSS лента последних записей"
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+"Для комплексного поиска вы можете использовать кавычки и двойные кавычки, а "
+"также операторы AND/OR."
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr "Календарь"
+
+#: templates/gstudio/base.html:68
+#, fuzzy
+msgid "Popular node types"
+msgstr "Популярные записи"
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr "Архив"
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr "Инструменты"
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr "Панель управления"
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr "Опубликовать запись"
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr "Выйти"
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr "Требуется авторизация"
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+"Имя пользователя и пароль не совпадают. Пожалуйста, попробуйте еще раз."
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr "Вы должны быть подключены, чтобы посмотреть эту запись."
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr "Войти"
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr "Список категорий"
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr "Категории отсутствуют."
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr "Ежедневные архивы"
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Архив за месяц"
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr "Включена RSS рассылка обсуждений"
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr "RSS лента комментариев к"
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr "RSS лента пинбэков к"
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr "RSS лента трэкбэков к"
+
+#: templates/gstudio/nodetype_detail.html:46
+#, fuzzy
+msgid "Next node type"
+msgstr "Следующая запись"
+
+#: templates/gstudio/nodetype_detail.html:60
+#, fuzzy
+msgid "Previous node type"
+msgstr "Предыдущая запись"
+
+#: templates/gstudio/nodetype_detail.html:73
+#, fuzzy
+msgid "Related node types"
+msgstr "Связанные записи"
+
+#: templates/gstudio/nodetype_detail.html:84
+#, fuzzy
+msgid "Similar node types"
+msgstr "Похожие записи"
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr "Комментарии"
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr "Пингбэки"
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr "Оповещения открыты."
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr "Пингбэки отключены."
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr "Трэкбэки"
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr "URL архива"
+
+#: templates/gstudio/nodetype_detail.html:212
+#, fuzzy
+msgid "Edit the node type"
+msgstr "Изменить запись"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr "RSS лента"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr "Категория"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr "Тег"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr "Автор"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr "Страница"
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr "Записи от %(author)s"
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr "Редактировать категорию"
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr "Редактировать тег"
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr "Редактировать автора"
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "RSS лента результатов поиска "
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] "%(nodetype_count)s запись найдена"
+msgstr[1] "%(nodetype_count)s записей найдено"
+msgstr[2] "%(nodetype_count)s записи найдены"
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr "Ничего не найдено."
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr "Требуется пароль"
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "Неправильный пароль. Пожалуйста, попробуйте еще раз."
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr "Вы должны ввести пароль для просмотра этой записи."
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr "Пароль"
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr "Проверка пройдена"
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr "Записи в категории"
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr "комментарий"
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr "Записей еще нет."
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr "Все записи"
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Список тегов"
+
+#: templates/gstudio/tag_list.html:19
+#, fuzzy
+msgid "No tags yet."
+msgstr "Категории отсутствуют."
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+#, fuzzy
+msgid "No node types yet."
+msgstr "Записей еще нет."
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr "Нет записей в архиве."
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, fuzzy, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] "%(nodetype_count)s запись"
+msgstr[1] "%(nodetype_count)s записей"
+msgstr[2] "%(nodetype_count)s записи"
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+#, fuzzy
+msgid "No subtypes yet."
+msgstr "Записей еще нет."
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Страница %(current_page)s из %(total_page)s"
+
+#: templates/gstudio/tags/pagination.html:10
+#, fuzzy
+msgid "More recent node types"
+msgstr "Самые новые записи"
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr "Страница записей"
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr "Самые старые записи"
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Обратные ссылки включены"
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr "Нет похожих записей."
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr "Запрос слишком короткий"
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Нечего искать"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Неверное имя пользователя."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Неверный пароль."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Учетная запись пользователя отсутствует"
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "Пользователь не может %s."
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr "Заголовок отсутствует"
+
+#~ msgid "Written by"
+#~ msgstr "Автор"
+
+#~ msgid "Be first to comment!"
+#~ msgstr "Оставьте первый комментарий"
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/te/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/te/LC_MESSAGES/django.po
new file mode 100644
index 0000000..b264c0d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/te/LC_MESSAGES/django.po
@@ -0,0 +1,1300 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:25+0530\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr ""
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr ""
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr ""
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr ""
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr ""
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr ""
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr ""
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr ""
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr ""
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr ""
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr ""
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr ""
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr ""
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr ""
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr ""
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr ""
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr ""
+
+#: models.py:197
+msgid "description"
+msgstr ""
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr ""
+
+#: models.py:283
+msgid "metatype"
+msgstr ""
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr ""
+
+#: models.py:298
+msgid "content"
+msgstr ""
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr ""
+
+#: models.py:310
+msgid "used for illustration"
+msgstr ""
+
+#: models.py:312
+msgid "excerpt"
+msgstr ""
+
+#: models.py:313
+msgid "optional element"
+msgstr ""
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr ""
+
+#: models.py:316
+msgid "member of metatypes"
+msgstr ""
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr ""
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr ""
+
+#: models.py:331
+msgid "featured"
+msgstr ""
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr ""
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr ""
+
+#: models.py:335
+msgid "creation date"
+msgstr ""
+
+#: models.py:337
+msgid "last update"
+msgstr ""
+
+#: models.py:338
+msgid "start publication"
+msgstr ""
+
+#: models.py:339
+msgid "date start publish"
+msgstr ""
+
+#: models.py:341
+msgid "end publication"
+msgstr ""
+
+#: models.py:342
+msgid "date end publish"
+msgstr ""
+
+#: models.py:345
+msgid "sites publication"
+msgstr ""
+
+#: models.py:349
+msgid "login required"
+msgstr ""
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr ""
+
+#: models.py:352
+msgid "password"
+msgstr ""
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr ""
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr ""
+
+#: models.py:358
+msgid "Default template"
+msgstr ""
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr ""
+
+#: models.py:568
+msgid "node type"
+msgstr ""
+
+#: models.py:569
+msgid "node types"
+msgstr ""
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+msgid "relation type"
+msgstr ""
+
+#: models.py:609
+msgid "relation types"
+msgstr ""
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+msgid "attribute types"
+msgstr ""
+
+#: models.py:686
+msgid "relation"
+msgstr ""
+
+#: models.py:687
+msgid "relations"
+msgstr ""
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr ""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr ""
+
+#: admin/forms.py:82
+msgid "A metatype cannot be a parent of itself."
+msgstr ""
+
+#: admin/forms.py:94
+msgid "parent nodetype"
+msgstr ""
+
+#: admin/forms.py:95
+msgid "No parent nodetype"
+msgstr ""
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr ""
+
+#: admin/forms.py:116
+msgid "An objectype cannot be parent of itself."
+msgstr ""
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr ""
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr ""
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr ""
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr ""
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr ""
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr ""
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr ""
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr ""
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr ""
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr ""
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr ""
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr ""
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr ""
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr ""
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr ""
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr ""
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr ""
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr ""
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr ""
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr ""
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr ""
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr ""
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr ""
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr ""
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr ""
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr ""
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr ""
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+msgid "Random node types"
+msgstr ""
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr ""
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr ""
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr ""
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr ""
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr ""
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr ""
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr ""
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr ""
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr ""
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr ""
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr ""
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr ""
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr ""
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr ""
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr ""
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr ""
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr ""
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+msgid "Recent node types"
+msgstr ""
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr ""
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr ""
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr ""
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr ""
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr ""
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr ""
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr ""
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr ""
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr ""
+
+#: templates/gstudio/base.html:68
+msgid "Popular node types"
+msgstr ""
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr ""
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr ""
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr ""
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr ""
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr ""
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr ""
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:46
+msgid "Next node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:60
+msgid "Previous node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:73
+msgid "Related node types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:84
+msgid "Similar node types"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:212
+msgid "Edit the node type"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr ""
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr ""
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr ""
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr ""
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr ""
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:19
+msgid "No tags yet."
+msgstr ""
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+msgid "No node types yet."
+msgstr ""
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr ""
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+msgid "No subtypes yet."
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:10
+msgid "More recent node types"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr ""
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr ""
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr ""
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr ""
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr ""
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr ""
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr ""
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/zh_CN/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/gstudio/locale/zh_CN/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..a4d7e9d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/zh_CN/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/locale/zh_CN/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/gstudio/locale/zh_CN/LC_MESSAGES/django.po
new file mode 100644
index 0000000..a727f6c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/locale/zh_CN/LC_MESSAGES/django.po
@@ -0,0 +1,1317 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Julien Fache <fantomas42@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-gstudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-29 19:24+0530\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+
+#: feeds.py:103 plugins/cms_plugins.py:23
+#: templates/gstudio/nodetype_archive.html:4
+#: templates/gstudio/nodetype_archive.html:25
+#: templates/gstudio/nodetype_list.html:19 tests/feeds.py:124
+msgid "Latest nodetypes"
+msgstr "最新日志"
+
+#: feeds.py:107 tests/feeds.py:127
+#, python-format
+msgid "The latest nodetypes for the site %s"
+msgstr ""
+
+#: feeds.py:127 tests/feeds.py:137
+#, python-format
+msgid "Nodetypes for the metatype %s"
+msgstr "类别 %s 的日志"
+
+#: feeds.py:131 tests/feeds.py:140
+#, python-format
+msgid "The latest nodetypes for the metatype %s"
+msgstr ""
+
+#: feeds.py:151 tests/feeds.py:149
+#, python-format
+msgid "Nodetypes for author %s"
+msgstr "作者 %s 的日志"
+
+#: feeds.py:155 tests/feeds.py:151
+#, python-format
+msgid "The latest nodetypes by %s"
+msgstr ""
+
+#: feeds.py:176 tests/feeds.py:161
+#, python-format
+msgid "Nodetypes for the tag %s"
+msgstr "标签含 %s 的日志"
+
+#: feeds.py:180 tests/feeds.py:163
+#, python-format
+msgid "The latest nodetypes for the tag %s"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:177
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:207 tests/feeds.py:180
+#, python-format
+msgid "The nodetypes containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:252 tests/feeds.py:199
+#, python-format
+msgid "Discussions on %s"
+msgstr ""
+
+#: feeds.py:256 tests/feeds.py:202
+#, python-format
+msgid "The latest discussions for the nodetype %s"
+msgstr ""
+
+#: feeds.py:274 tests/feeds.py:212
+#, python-format
+msgid "Comments on %s"
+msgstr "对于 %s 的评论"
+
+#: feeds.py:278 tests/feeds.py:215
+#, python-format
+msgid "The latest comments for the nodetype %s"
+msgstr ""
+
+#: feeds.py:308 tests/feeds.py:231
+#, python-format
+msgid "Pingbacks on %s"
+msgstr ""
+
+#: feeds.py:312 tests/feeds.py:234
+#, python-format
+msgid "The latest pingbacks for the nodetype %s"
+msgstr ""
+
+#: feeds.py:330 tests/feeds.py:244
+#, python-format
+msgid "Trackbacks on %s"
+msgstr ""
+
+#: feeds.py:334 tests/feeds.py:247
+#, python-format
+msgid "The latest trackbacks for the nodetype %s"
+msgstr ""
+
+#: models.py:90 models.py:294
+msgid "draft"
+msgstr "草稿"
+
+#: models.py:91 models.py:295
+msgid "hidden"
+msgstr "隐藏"
+
+#: models.py:92 models.py:296
+msgid "published"
+msgstr "发布"
+
+#: models.py:120 admin/nodetype.py:80
+msgid "title"
+msgstr "标题"
+
+#: models.py:120
+msgid "give a name to the node"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names"
+msgstr ""
+
+#: models.py:151
+msgid "alternate names if any"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural name"
+msgstr ""
+
+#: models.py:152 models.py:293
+msgid "plural form of the node name if any"
+msgstr ""
+
+#: models.py:196 models.py:322
+msgid "used for publication"
+msgstr "用于发布"
+
+#: models.py:197
+msgid "description"
+msgstr "描述"
+
+#: models.py:198 admin/forms.py:67
+msgid "parent metatype"
+msgstr ""
+
+#: models.py:283
+msgid "metatype"
+msgstr "类别"
+
+#: models.py:284 admin/forms.py:101 plugins/models.py:25
+msgid "metatypes"
+msgstr "类别"
+
+#: models.py:298
+msgid "content"
+msgstr "内容"
+
+#: models.py:300
+msgid "is a kind of"
+msgstr ""
+
+#: models.py:303
+msgid "its meaning depends"
+msgstr ""
+
+#: models.py:306
+msgid "required for the meaning of"
+msgstr ""
+
+#: models.py:309
+msgid "image"
+msgstr "图片"
+
+#: models.py:310
+msgid "used for illustration"
+msgstr "用于插图"
+
+#: models.py:312
+msgid "excerpt"
+msgstr "摘要"
+
+#: models.py:313
+msgid "optional element"
+msgstr "可选项"
+
+#: models.py:315 plugins/models.py:32
+msgid "tags"
+msgstr "标签"
+
+#: models.py:316
+#, fuzzy
+msgid "member of metatypes"
+msgstr "日志数量"
+
+#: models.py:319
+msgid "related nodetypes"
+msgstr "相关日志"
+
+#: models.py:326 plugins/models.py:30
+msgid "authors"
+msgstr "作者"
+
+#: models.py:331
+msgid "featured"
+msgstr ""
+
+#: models.py:332 admin/nodetype.py:132
+msgid "comment enabled"
+msgstr "允许评论"
+
+#: models.py:333
+msgid "linkback enabled"
+msgstr ""
+
+#: models.py:335
+msgid "creation date"
+msgstr "创建日期"
+
+#: models.py:337
+msgid "last update"
+msgstr "最后更新"
+
+#: models.py:338
+msgid "start publication"
+msgstr "开始发布"
+
+#: models.py:339
+msgid "date start publish"
+msgstr "开始发布日期"
+
+#: models.py:341
+msgid "end publication"
+msgstr "结束发布"
+
+#: models.py:342
+msgid "date end publish"
+msgstr "结束发布日期"
+
+#: models.py:345
+msgid "sites publication"
+msgstr "发布网站"
+
+#: models.py:349
+msgid "login required"
+msgstr ""
+
+#: models.py:350
+msgid "only authenticated users can view the nodetype"
+msgstr ""
+
+#: models.py:352
+msgid "password"
+msgstr ""
+
+#: models.py:353
+msgid "protect the nodetype with a password"
+msgstr ""
+
+#: models.py:356 plugins/models.py:37 plugins/models.py:63
+#: plugins/models.py:87
+msgid "template"
+msgstr ""
+
+#: models.py:358
+msgid "Default template"
+msgstr ""
+
+#: models.py:360
+msgid "template used to display the nodetype"
+msgstr ""
+
+#: models.py:568
+#, fuzzy
+msgid "node type"
+msgstr "日志"
+
+#: models.py:569
+#, fuzzy
+msgid "node types"
+msgstr "日志"
+
+#: models.py:579
+msgid "inverse name"
+msgstr ""
+
+#: models.py:579
+msgid ""
+"when subjecttypes are interchanged, what should be the name of the relation "
+"type? This is mandatory field. If the relation is symmetric, same name will "
+"do."
+msgstr ""
+
+#: models.py:608
+#, fuzzy
+msgid "relation type"
+msgstr "创建日期"
+
+#: models.py:609
+#, fuzzy
+msgid "relation types"
+msgstr "创建日期"
+
+#: models.py:663
+msgid "attribute type"
+msgstr ""
+
+#: models.py:664
+#, fuzzy
+msgid "attribute types"
+msgstr "最新日志"
+
+#: models.py:686
+#, fuzzy
+msgid "relation"
+msgstr "创建日期"
+
+#: models.py:687
+#, fuzzy
+msgid "relations"
+msgstr "创建日期"
+
+#: models.py:723
+msgid "attribute"
+msgstr ""
+
+#: models.py:724
+msgid "attributes"
+msgstr ""
+
+#: models.py:755
+msgid "attribute set involved in the process"
+msgstr ""
+
+#: models.py:758
+msgid "relation set involved in the process"
+msgstr ""
+
+#: models.py:766
+msgid "process type"
+msgstr ""
+
+#: models.py:767
+msgid "process types"
+msgstr ""
+
+#: models.py:797
+msgid "system type"
+msgstr ""
+
+#: models.py:798
+msgid "system types"
+msgstr ""
+
+#: moderator.py:58 moderator.py:81 moderator.py:106
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr ""
+
+#: admin/forms.py:68
+msgid "No parent metatype"
+msgstr ""
+
+#: admin/forms.py:82
+msgid "A metatype cannot be a parent of itself."
+msgstr ""
+
+#: admin/forms.py:94
+#, fuzzy
+msgid "parent nodetype"
+msgstr "下一篇"
+
+#: admin/forms.py:95
+#, fuzzy
+msgid "No parent nodetype"
+msgstr "下一篇"
+
+#: admin/forms.py:99 plugins/menu.py:70 templates/gstudio/base.html:35
+#: templates/gstudio/metatype_list.html:6 templates/gstudio/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:50
+msgid "Metatypes"
+msgstr "类别"
+
+#: admin/forms.py:116
+msgid "An objectype cannot be parent of itself."
+msgstr ""
+
+#: admin/metatype.py:30
+msgid "tree path"
+msgstr ""
+
+#: admin/nodetype.py:31 plugins/admin.py:17
+#: templates/admin/gstudio/widgets/quickpost.html:17
+msgid "Content"
+msgstr "内容"
+
+#: admin/nodetype.py:33
+msgid "Dependency"
+msgstr ""
+
+#: admin/nodetype.py:35 plugins/admin.py:20
+msgid "Options"
+msgstr "选项"
+
+#: admin/nodetype.py:41 plugins/admin.py:26
+msgid "Privacy"
+msgstr ""
+
+#: admin/nodetype.py:43 plugins/admin.py:28
+msgid "Discussion"
+msgstr ""
+
+#: admin/nodetype.py:45 plugins/admin.py:30
+msgid "Publication"
+msgstr ""
+
+#: admin/nodetype.py:73
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i 个字符)"
+
+#: admin/nodetype.py:77
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i 条评论)"
+
+#: admin/nodetype.py:93
+msgid "author(s)"
+msgstr "作者"
+
+#: admin/nodetype.py:106
+msgid "metatype(s)"
+msgstr "类别"
+
+#: admin/nodetype.py:118
+msgid "tag(s)"
+msgstr "标签"
+
+#: admin/nodetype.py:126
+msgid "site(s)"
+msgstr "网站"
+
+#: admin/nodetype.py:138
+msgid "is actual"
+msgstr "发布期间"
+
+#: admin/nodetype.py:144
+msgid "is visible"
+msgstr "是否可见"
+
+#: admin/nodetype.py:149
+msgid "View"
+msgstr ""
+
+#: admin/nodetype.py:151
+msgid "View on site"
+msgstr "浏览站点"
+
+#: admin/nodetype.py:157
+msgid "Unavailable"
+msgstr "不存在"
+
+#: admin/nodetype.py:161
+msgid "short url"
+msgstr "缩略URL"
+
+#: admin/nodetype.py:216
+msgid "The selected nodetypes now belong to you."
+msgstr ""
+
+#: admin/nodetype.py:217
+msgid "Set the nodetypes to the user"
+msgstr "设置自己为所选日志的作者"
+
+#: admin/nodetype.py:224
+msgid "The selected nodetypes are now marked as published."
+msgstr ""
+
+#: admin/nodetype.py:225
+msgid "Set nodetypes selected as published"
+msgstr "发布所选日志"
+
+#: admin/nodetype.py:231
+msgid "The selected nodetypes are now marked as hidden."
+msgstr ""
+
+#: admin/nodetype.py:232
+msgid "Set nodetypes selected as hidden"
+msgstr "隐藏所选日志"
+
+#: admin/nodetype.py:247
+msgid "The selected nodetypes have been tweeted."
+msgstr ""
+
+#: admin/nodetype.py:248
+msgid "Tweet nodetypes selected"
+msgstr "推特所选日志"
+
+#: admin/nodetype.py:254
+msgid "Comments are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:255
+msgid "Close the comments for selected nodetypes"
+msgstr "关闭所选日志的评论功能"
+
+#: admin/nodetype.py:262
+msgid "Linkbacks are now closed for selected nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:264
+msgid "Close the linkbacks for selected nodetypes"
+msgstr ""
+
+#: admin/nodetype.py:271
+msgid "The selected nodetypes are now set at the current date."
+msgstr ""
+
+#: admin/nodetype.py:273
+msgid "Put the selected nodetypes on top at the current date"
+msgstr ""
+
+#: admin/nodetype.py:292
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d nodetypes."
+msgstr ""
+
+#: admin/nodetype.py:296
+msgid "Ping Directories for selected nodetypes"
+msgstr "提交所选日志到搜索引擎"
+
+#: plugins/cms_app.py:12
+msgid "Gstudio App Hook"
+msgstr ""
+
+#: plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:61
+msgid "nodetypes"
+msgstr "日志"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "分类"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr ""
+
+#: plugins/cms_plugins.py:94
+msgid "Selected nodetypes"
+msgstr "所选日志"
+
+#: plugins/cms_plugins.py:116 templates/gstudio/base.html:64
+#, fuzzy
+msgid "Random node types"
+msgstr "随机日志"
+
+#: plugins/menu.py:19
+msgid "Gstudio Nodetype Menu"
+msgstr ""
+
+#: plugins/menu.py:65
+msgid "Gstudio Metatype Menu"
+msgstr ""
+
+#: plugins/menu.py:82
+msgid "Gstudio Author Menu"
+msgstr ""
+
+#: plugins/menu.py:87 templates/gstudio/author_list.html:6
+#: templates/gstudio/base.html:40 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "作者"
+
+#: plugins/menu.py:100
+msgid "Gstudio Tag Menu"
+msgstr ""
+
+#: plugins/menu.py:105 templates/admin/gstudio/widgets/quickpost.html:25
+#: templates/gstudio/_nodetype_detail.html:53 templates/gstudio/base.html:48
+#: templates/gstudio/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "标签"
+
+#: plugins/models.py:16
+msgid "Nodetype list (default)"
+msgstr ""
+
+#: plugins/models.py:17
+msgid "Nodetype detailed"
+msgstr ""
+
+#: plugins/models.py:28
+msgid "include submetatypes"
+msgstr ""
+
+#: plugins/models.py:35 plugins/models.py:85
+msgid "number of nodetypes"
+msgstr "日志数量"
+
+#: plugins/models.py:39 plugins/models.py:65 plugins/models.py:89
+msgid "Template used to display the plugin"
+msgstr ""
+
+#: plugins/models.py:54 plugins/models.py:78 plugins/models.py:92
+#, python-format
+msgid "%s nodetypes"
+msgstr "%s 日志"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr ""
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr ""
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+
+#: templates/404.html:15 templates/500.html:15
+msgid "Useful links"
+msgstr ""
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:19
+#: templates/500.html.py:20
+msgid "Blog index"
+msgstr ""
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:24
+#: templates/500.html.py:25 templates/gstudio/sitemap.html:4
+#: templates/gstudio/sitemap.html.py:7 templates/gstudio/skeleton.html:32
+#: templates/gstudio/skeleton.html.py:33
+msgid "Sitemap"
+msgstr ""
+
+#: templates/404.html:31 templates/500.html:31 templates/gstudio/base.html:52
+#, fuzzy
+msgid "Recent node types"
+msgstr "最近日志"
+
+#: templates/404.html:36 templates/500.html:36 templates/gstudio/base.html:23
+msgid "Search"
+msgstr "搜索"
+
+#: templates/404.html:40 templates/500.html:40 templates/gstudio/base.html:26
+msgid "Keywords..."
+msgstr "关键词..."
+
+#: templates/500.html:5
+msgid "Error 500"
+msgstr ""
+
+#: templates/500.html:8 templates/500.html.py:11
+msgid "Server error"
+msgstr ""
+
+#: templates/500.html:13
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:5
+#: templates/gstudio/_nodetype_detail.html:71
+msgid "Discussions"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:10
+#, python-format
+msgid "%(nodetypes)s nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:22
+#, python-format
+msgid "%(metatypes)s metatypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:7
+#: templates/gstudio/nodetype_detail.html:211
+msgid "Edit the nodetype"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:10
+#: templates/comments/gstudio_nodetype_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/gstudio/_nodetype_detail.html:22
+#: templates/gstudio/nodetype_detail.html:108
+#: templates/gstudio/nodetype_detail.html:142
+#: templates/gstudio/nodetype_detail.html:175
+#: templates/gstudio/tags/recent_comments.html:7
+msgid "on"
+msgstr "在"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:16
+#: templates/comments/gstudio/nodetype/form.html:19
+msgid "Preview"
+msgstr "预览"
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:23
+msgid "No draft nodetypes."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:32
+#: templates/admin/gstudio/widgets/_draft_nodetypes.html:33
+msgid "View all draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:11
+#: templates/gstudio/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "在"
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:14
+#: templates/gstudio/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:24
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:31
+#: templates/gstudio/_nodetype_detail.html:79
+#: templates/gstudio/nodetype_detail.html:122
+#: templates/gstudio/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_comments.html:40
+#: templates/admin/gstudio/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/_recent_linkbacks.html:26
+#: templates/gstudio/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr ""
+
+#: templates/admin/gstudio/widgets/content_stats.html:6
+#: templates/admin/gstudio/widgets/content_stats.html:7
+msgid "Today"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:6
+#: templates/admin/gstudio/widgets/draft_nodetypes.html:7
+msgid "Draft nodetypes"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:5
+#: templates/admin/gstudio/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:9
+msgid "Title"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/quickpost.html:35
+msgid "Publish"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_comments.html:6
+#: templates/admin/gstudio/widgets/recent_comments.html:7
+#: templates/gstudio/base.html:56
+msgid "Recent comments"
+msgstr ""
+
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:6
+#: templates/admin/gstudio/widgets/recent_linkbacks.html:7
+#: templates/gstudio/base.html:60
+msgid "Recent linkbacks"
+msgstr ""
+
+#: templates/comments/gstudio_nodetype_preview.html:4
+msgid "Comment preview"
+msgstr "评论预览"
+
+#: templates/comments/gstudio_nodetype_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] ""
+
+#: templates/comments/gstudio_nodetype_preview.html:12
+msgid "Preview of the comment"
+msgstr "预览评论"
+
+#: templates/comments/gstudio/nodetype/form.html:7
+msgid "Post your comment"
+msgstr "发表评论"
+
+#: templates/comments/gstudio/nodetype/form.html:18
+msgid "Post"
+msgstr "发表"
+
+#: templates/comments/gstudio/nodetype/posted.html:4
+#: templates/comments/gstudio/nodetype/posted.html:7
+msgid "Thanks for your comment"
+msgstr "感谢你的评论"
+
+#: templates/comments/gstudio/nodetype/posted.html:9
+#: templates/comments/gstudio/nodetype/posted.html:10
+msgid "Return to nodetype list"
+msgstr "返回日志列表"
+
+#: templates/gstudio/_nodetype_detail.html:15
+#: templates/gstudio/_nodetype_detail.html:24
+msgid "Contributed by"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:19
+#, python-format
+msgid "Show %(author)s nodetypes"
+msgstr "显示 %(author)s 的日志"
+
+#: templates/gstudio/_nodetype_detail.html:59
+msgid "No tags"
+msgstr "没有标签"
+
+#: templates/gstudio/_nodetype_detail.html:64
+msgid "Short url"
+msgstr "缩略URL"
+
+#: templates/gstudio/_nodetype_detail.html:75
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] ""
+
+#: templates/gstudio/_nodetype_detail.html:81
+msgid "Discuss the relations or raise any issues!"
+msgstr ""
+
+#: templates/gstudio/_nodetype_detail.html:84
+#: templates/gstudio/nodetype_detail.html:118
+#: templates/gstudio/nodetype_detail.html:124
+msgid "Comments are closed."
+msgstr "评论已关闭"
+
+#: templates/gstudio/_nodetype_detail.html:91
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] ""
+
+#: templates/gstudio/_nodetype_detail.html:98
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] ""
+
+#: templates/gstudio/author_list.html:4 templates/gstudio/author_list.html:9
+msgid "Author list"
+msgstr "作者列表"
+
+#: templates/gstudio/author_list.html:18
+#: templates/gstudio/metatype_list.html:14 templates/gstudio/sitemap.html:55
+#: templates/gstudio/tag_list.html:15 templates/gstudio/tags/authors.html:8
+#: templates/gstudio/tags/metatypes.html:6
+#: templates/gstudio/tags/tag_cloud.html:8
+#, python-format
+msgid "%(nodetype_count)s nodetype"
+msgid_plural "%(nodetype_count)s nodetypes"
+msgstr[0] ""
+
+#: templates/gstudio/author_list.html:22
+#: templates/gstudio/tags/authors.html:12
+msgid "No authors yet."
+msgstr ""
+
+#: templates/gstudio/base.html:13 templates/gstudio/skeleton.html:35
+msgid "RSS Feed of latest nodetypes"
+msgstr ""
+
+#: templates/gstudio/base.html:28 templates/gstudio/nodetype_search.html:39
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for "
+"complex searchs."
+msgstr ""
+
+#: templates/gstudio/base.html:44
+msgid "Calendar"
+msgstr ""
+
+#: templates/gstudio/base.html:68
+#, fuzzy
+msgid "Popular node types"
+msgstr "热门日志"
+
+#: templates/gstudio/base.html:72
+#: templates/gstudio/nodetype_archive_day.html:4
+#: templates/gstudio/nodetype_archive_day.html:6
+#: templates/gstudio/nodetype_archive_day.html:9
+#: templates/gstudio/nodetype_archive_month.html:4
+#: templates/gstudio/nodetype_archive_month.html:6
+#: templates/gstudio/nodetype_archive_month.html:9
+#: templates/gstudio/nodetype_archive_year.html:4
+#: templates/gstudio/nodetype_archive_year.html:6
+#: templates/gstudio/nodetype_archive_year.html:9
+#: templates/gstudio/tags/archives_nodetypes.html:5
+#: templates/gstudio/tags/archives_nodetypes_link.html:2
+#: templates/gstudio/tags/archives_nodetypes_tree.html:7
+#: templates/gstudio/tags/archives_nodetypes_tree.html:14
+#: templates/gstudio/tags/archives_nodetypes_tree.html:24
+msgid "Archives"
+msgstr "归档"
+
+#: templates/gstudio/base.html:77
+msgid "Tools"
+msgstr ""
+
+#: templates/gstudio/base.html:81 templates/gstudio/base.html.py:82
+msgid "Dashboard"
+msgstr ""
+
+#: templates/gstudio/base.html:88 templates/gstudio/base.html.py:89
+msgid "Post a nodetype"
+msgstr ""
+
+#: templates/gstudio/base.html:96 templates/gstudio/base.html.py:97
+msgid "Log out"
+msgstr ""
+
+#: templates/gstudio/login.html:4 templates/gstudio/login.html.py:7
+msgid "Login required"
+msgstr ""
+
+#: templates/gstudio/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+
+#: templates/gstudio/login.html:16
+msgid "You need to be connected to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/login.html:33
+msgid "Login"
+msgstr ""
+
+#: templates/gstudio/metatype_list.html:4
+#: templates/gstudio/metatype_list.html:9
+msgid "Metatype list"
+msgstr "类别列表"
+
+#: templates/gstudio/metatype_list.html:20 templates/gstudio/sitemap.html:60
+#: templates/gstudio/tags/metatypes.html:11
+msgid "No metatypes yet."
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_archive_year.html:13
+#: templates/gstudio/sitemap.html:67
+msgid "Monthly archives"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:22
+msgid "RSS Feed of discussions on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:24
+msgid "RSS Feed of comments on"
+msgstr "RSS 源(基于评论)"
+
+#: templates/gstudio/nodetype_detail.html:26
+msgid "RSS Feed of pingbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:28
+msgid "RSS Feed of trackbacks on"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:46
+#, fuzzy
+msgid "Next node type"
+msgstr "下一篇"
+
+#: templates/gstudio/nodetype_detail.html:60
+#, fuzzy
+msgid "Previous node type"
+msgstr "上一篇"
+
+#: templates/gstudio/nodetype_detail.html:73
+#, fuzzy
+msgid "Related node types"
+msgstr "相关日志"
+
+#: templates/gstudio/nodetype_detail.html:84
+#, fuzzy
+msgid "Similar node types"
+msgstr "类似日志"
+
+#: templates/gstudio/nodetype_detail.html:92
+msgid "Comments"
+msgstr "评论"
+
+#: templates/gstudio/nodetype_detail.html:133
+msgid "Pingbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:155
+msgid "Pingbacks are open."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:157
+msgid "Pingbacks are closed."
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:167
+msgid "Trackbacks"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:190
+msgid "Trackback URL"
+msgstr ""
+
+#: templates/gstudio/nodetype_detail.html:212
+#, fuzzy
+msgid "Edit the node type"
+msgstr "下一篇"
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "Latest nodetypes for"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:4
+#: templates/gstudio/nodetype_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:9
+#: templates/gstudio/nodetype_list.html:12
+#: templates/gstudio/nodetype_list.html:15
+#: templates/gstudio/skeleton.html:36
+msgid "RSS Feed"
+msgstr "RSS 源"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Metatype"
+msgstr "类别"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_list.html:31
+msgid "Tag"
+msgstr "标签"
+
+#: templates/gstudio/nodetype_list.html:19
+msgid "Author"
+msgstr "作者"
+
+#: templates/gstudio/nodetype_list.html:19
+#: templates/gstudio/nodetype_search.html:4
+msgid "Page"
+msgstr "页码"
+
+#: templates/gstudio/nodetype_list.html:35
+#, python-format
+msgid "Nodetypes by %(author)s"
+msgstr "作者 %(author)s 的日志"
+
+#: templates/gstudio/nodetype_list.html:43
+msgid "No nodes in the network yet. Login and construct a network!"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:54
+#: templates/gstudio/nodetype_list.html:55
+msgid "Edit the metatype"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:61
+#: templates/gstudio/nodetype_list.html:62
+msgid "Edit the tag"
+msgstr ""
+
+#: templates/gstudio/nodetype_list.html:68
+#: templates/gstudio/nodetype_list.html:69
+msgid "Edit the author"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:4
+#: templates/gstudio/nodetype_search.html:6
+#: templates/gstudio/nodetype_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/gstudio/nodetype_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "RSS 源(基于搜索)"
+
+#: templates/gstudio/nodetype_search.html:22
+#, python-format
+msgid "%(nodetype_count)s nodetype found"
+msgid_plural "%(nodetype_count)s nodetypes found"
+msgstr[0] ""
+
+#: templates/gstudio/nodetype_search.html:31
+msgid "Nothing found."
+msgstr "没有找到"
+
+#: templates/gstudio/password.html:4 templates/gstudio/password.html.py:7
+msgid "Password required"
+msgstr ""
+
+#: templates/gstudio/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr ""
+
+#: templates/gstudio/password.html:16
+msgid "You need to provide a password to view this nodetype."
+msgstr ""
+
+#: templates/gstudio/password.html:23
+msgid "Password"
+msgstr ""
+
+#: templates/gstudio/password.html:28
+msgid "Valid"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:10
+msgid "Nodetypes per metatypes"
+msgstr ""
+
+#: templates/gstudio/sitemap.html:18 templates/gstudio/sitemap.html.py:38
+#: templates/gstudio/tags/popular_nodetypes.html:8
+msgid "comment"
+msgstr "评论"
+
+#: templates/gstudio/sitemap.html:23 templates/gstudio/sitemap.html.py:43
+#: templates/gstudio/cms/nodetype_list.html:9
+#: templates/gstudio/tags/featured_nodetypes.html:9
+#: templates/gstudio/tags/popular_nodetypes.html:13
+#: templates/gstudio/tags/random_nodetypes.html:9
+msgid "No nodetypes yet."
+msgstr ""
+
+#: templates/gstudio/sitemap.html:31
+msgid "All the nodetypes"
+msgstr ""
+
+#: templates/gstudio/tag_list.html:4 templates/gstudio/tag_list.html.py:9
+msgid "Tag list"
+msgstr "标签列表"
+
+#: templates/gstudio/tag_list.html:19
+#, fuzzy
+msgid "No tags yet."
+msgstr "没有标签"
+
+#: templates/gstudio/cms/nodetype_detail.html:7
+#, fuzzy
+msgid "No node types yet."
+msgstr "日志"
+
+#: templates/gstudio/tags/archives_nodetypes.html:12
+#: templates/gstudio/tags/archives_nodetypes_tree.html:38
+msgid "No archives yet."
+msgstr ""
+
+#: templates/gstudio/tags/nodetypes.html:6
+#, python-format
+msgid "%(gbobjects_count)s gbobject"
+msgid_plural "%(gbobjects_count)s gbobjects"
+msgstr[0] ""
+
+#: templates/gstudio/tags/nodetypes.html:11
+#: templates/gstudio/tags/recent_nodetypes.html:16
+msgid "No subtypes yet."
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:4
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:10
+#, fuzzy
+msgid "More recent node types"
+msgstr "更多最近日志"
+
+#: templates/gstudio/tags/pagination.html:20
+#: templates/gstudio/tags/pagination.html:33
+#: templates/gstudio/tags/pagination.html:47
+msgid "Nodetypes page"
+msgstr ""
+
+#: templates/gstudio/tags/pagination.html:56
+msgid "More old nodetypes"
+msgstr "更多以前日志"
+
+#: templates/gstudio/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr ""
+
+#: templates/gstudio/tags/similar_nodetypes.html:9
+msgid "No similar nodetypes."
+msgstr "没有类似日志"
+
+#: tests/views.py:222 views/search.py:18
+msgid "The pattern is too short"
+msgstr "模式长度不够"
+
+#: tests/views.py:226 views/search.py:22
+msgid "No pattern to search found"
+msgstr "没有搜索到相关模式"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr ""
+
+#: xmlrpc/pingback.py:96
+msgid "No title"
+msgstr ""
+
+#~ msgid "Written by"
+#~ msgstr "作者是"
diff --git a/build/lib.linux-i686-2.6/gstudio/management/__init__.py b/build/lib.linux-i686-2.6/gstudio/management/__init__.py
new file mode 100644
index 0000000..3606a89
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/management/__init__.py
@@ -0,0 +1 @@
+"""Management module of Gstudio"""
diff --git a/build/lib.linux-i686-2.6/gstudio/management/commands/__init__.py b/build/lib.linux-i686-2.6/gstudio/management/commands/__init__.py
new file mode 100644
index 0000000..8794b84
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/management/commands/__init__.py
@@ -0,0 +1 @@
+"""Commands module of Gstudio"""
diff --git a/build/lib.linux-i686-2.6/gstudio/management/commands/blogger2gstudio.py b/build/lib.linux-i686-2.6/gstudio/management/commands/blogger2gstudio.py
new file mode 100644
index 0000000..8e5ca6c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/management/commands/blogger2gstudio.py
@@ -0,0 +1,319 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Blogger to Gstudio command module
+Based on Elijah Rutschman's code"""
+import sys
+from getpass import getpass
+from datetime import datetime
+from optparse import make_option
+
+from django.utils.encoding import smart_str
+from django.contrib.sites.models import Site
+from django.contrib.auth.models import User
+from django.template.defaultfilters import slugify
+from django.core.management.base import CommandError
+from django.core.management.base import NoArgsCommand
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.comments import get_model as get_comment_model
+
+from gstudio import __version__
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+from gstudio.managers import DRAFT, PUBLISHED
+
+gdata_service = None
+Comment = get_comment_model()
+
+
+class Command(NoArgsCommand):
+ """Command object for importing a Blogger blog
+ into Gstudio via Google's gdata API."""
+ help = 'Import a Blogger blog into Gstudio.'
+
+ option_list = NoArgsCommand.option_list + (
+ make_option('--blogger-username', dest='blogger_username', default='',
+ help='The username to login to Blogger with'),
+ make_option('--metatype-title', dest='metatype_title', default='',
+ help='The Gstudio metatype to import Blogger posts to'),
+ make_option('--blogger-blog-id', dest='blogger_blog_id', default='',
+ help='The id of the Blogger blog to import'),
+ make_option('--author', dest='author', default='',
+ help='All imported nodetypes belong to specified author')
+ )
+
+ SITE = Site.objects.get_current()
+
+ def __init__(self):
+ """Init the Command and add custom styles"""
+ super(Command, self).__init__()
+ self.style.TITLE = self.style.SQL_FIELD
+ self.style.STEP = self.style.SQL_COLTYPE
+ self.style.ITEM = self.style.HTTP_INFO
+
+ def write_out(self, message, verbosity_level=1):
+ """Convenient method for outputing"""
+ if self.verbosity and self.verbosity >= verbosity_level:
+ sys.stdout.write(smart_str(message))
+ sys.stdout.flush()
+
+ def handle_noargs(self, **options):
+ global gdata_service
+ try:
+ from gdata import service
+ gdata_service = service
+ except ImportError:
+ raise CommandError('You need to install the gdata ' \
+ 'module to run this command.')
+
+ self.verbosity = int(options.get('verbosity', 1))
+ self.blogger_username = options.get('blogger_username')
+ self.metatype_title = options.get('metatype_title')
+ self.blogger_blog_id = options.get('blogger_blog_id')
+
+ self.write_out(self.style.TITLE(
+ 'Starting migration from Blogger to Gstudio %s\n' % __version__))
+
+ if not self.blogger_username:
+ self.blogger_username = raw_input('Blogger username: ')
+ if not self.blogger_username:
+ raise CommandError('Invalid Blogger username')
+
+ self.blogger_password = getpass('Blogger password: ')
+ try:
+ self.blogger_manager = BloggerManager(self.blogger_username,
+ self.blogger_password)
+ except gdata_service.BadAuthentication:
+ raise CommandError('Incorrect Blogger username or password')
+
+ default_author = options.get('author')
+ if default_author:
+ try:
+ self.default_author = User.objects.get(username=default_author)
+ except User.DoesNotExist:
+ raise CommandError(
+ 'Invalid Gstudio username for default author "%s"' % \
+ default_author)
+ else:
+ self.default_author = User.objects.all()[0]
+
+ if not self.blogger_blog_id:
+ self.select_blog_id()
+
+ if not self.metatype_title:
+ self.metatype_title = raw_input(
+ 'Metatype title for imported nodetypes: ')
+ if not self.metatype_title:
+ raise CommandError('Invalid metatype title')
+
+ self.import_posts()
+
+ def select_blog_id(self):
+ self.write_out(self.style.STEP('- Requesting your weblogs\n'))
+ blogs_list = [blog for blog in self.blogger_manager.get_blogs()]
+ while True:
+ i = 0
+ blogs = {}
+ for blog in blogs_list:
+ i += 1
+ blogs[i] = blog
+ self.write_out('%s. %s (%s)' % (i, blog.title.text,
+ get_blog_id(blog)))
+ try:
+ blog_index = int(raw_input('\nSelect a blog to import: '))
+ blog = blogs[blog_index]
+ break
+ except (ValueError, KeyError):
+ self.write_out(self.style.ERROR(
+ 'Please enter a valid blog number\n'))
+
+ self.blogger_blog_id = get_blog_id(blog)
+
+ def get_metatype(self):
+ metatype, created = Metatype.objects.get_or_create(
+ title=self.metatype_title,
+ slug=slugify(self.metatype_title)[:255])
+
+ if created:
+ metatype.save()
+
+ return metatype
+
+ def import_posts(self):
+ metatype = self.get_metatype()
+ self.write_out(self.style.STEP('- Importing nodetypes\n'))
+ for post in self.blogger_manager.get_posts(self.blogger_blog_id):
+ creation_date = convert_blogger_timestamp(post.published.text)
+ status = DRAFT if is_draft(post) else PUBLISHED
+ title = post.title.text or ''
+ content = post.content.text or ''
+ slug = slugify(post.title.text or get_post_id(post))[:255]
+ try:
+ nodetype = Nodetype.objects.get(creation_date=creation_date,
+ slug=slug)
+ output = self.style.NOTICE('> Skipped %s (already migrated)\n'
+ % nodetype)
+ except Nodetype.DoesNotExist:
+ nodetype = Nodetype(status=status, title=title, content=content,
+ creation_date=creation_date, slug=slug)
+ if self.default_author:
+ nodetype.author = self.default_author
+ nodetype.tags = ','.join([slugify(cat.term) for
+ cat in post.metatype])
+ nodetype.last_update = convert_blogger_timestamp(
+ post.updated.text)
+ nodetype.save()
+ nodetype.sites.add(self.SITE)
+ nodetype.metatypes.add(metatype)
+ nodetype.authors.add(self.default_author)
+ try:
+ self.import_comments(nodetype, post)
+ except gdata_service.RequestError:
+ # comments not available for this post
+ pass
+ output = self.style.ITEM('> Migrated %s + %s comments\n'
+ % (nodetype.title, len(Comment.objects.for_model(nodetype))))
+
+ self.write_out(output)
+
+ def import_comments(self, nodetype, post):
+ blog_id = self.blogger_blog_id
+ post_id = get_post_id(post)
+ comments = self.blogger_manager.get_comments(blog_id, post_id)
+ nodetype_content_type = ContentType.objects.get_for_model(Nodetype)
+
+ for comment in comments:
+ submit_date = convert_blogger_timestamp(comment.published.text)
+ content = comment.content.text
+
+ author = comment.author[0]
+ if author:
+ user_name = author.name.text if author.name else ''
+ user_email = author.email.text if author.email else ''
+ user_url = author.uri.text if author.uri else ''
+
+ else:
+ user_name = ''
+ user_email = ''
+ user_url = ''
+
+ com, created = Comment.objects.get_or_create(
+ content_type=nodetype_content_type,
+ object_pk=nodetype.pk,
+ comment=content,
+ submit_date=submit_date,
+ site=self.SITE,
+ user_name=user_name,
+ user_email=user_email,
+ user_url=user_url)
+
+ if created:
+ com.save()
+
+
+def convert_blogger_timestamp(timestamp):
+ # parse 2010-12-19T15:37:00.003
+ date_string = timestamp[:-6]
+ return datetime.strptime(date_string, '%Y-%m-%dT%H:%M:%S.%f')
+
+
+def is_draft(post):
+ if post.control:
+ if post.control.draft:
+ if post.control.draft.text == 'yes':
+ return True
+ return False
+
+
+def get_blog_id(blog):
+ return blog.GetSelfLink().href.split('/')[-1]
+
+
+def get_post_id(post):
+ return post.GetSelfLink().href.split('/')[-1]
+
+
+class BloggerManager(object):
+
+ def __init__(self, username, password):
+ self.service = gdata_service.GDataService(username, password)
+ self.service.server = 'www.blogger.com'
+ self.service.service = 'blogger'
+ self.service.ProgrammaticLogin()
+
+ def get_blogs(self):
+ feed = self.service.Get('/feeds/default/blogs')
+ for blog in feed.nodetype:
+ yield blog
+
+ def get_posts(self, blog_id):
+ feed = self.service.Get('/feeds/%s/posts/default' % blog_id)
+ for post in feed.nodetype:
+ yield post
+
+ def get_comments(self, blog_id, post_id):
+ feed = self.service.Get('/feeds/%s/%s/comments/default' % \
+ (blog_id, post_id))
+ for comment in feed.nodetype:
+ yield comment
diff --git a/build/lib.linux-i686-2.6/gstudio/management/commands/feed2gstudio.py b/build/lib.linux-i686-2.6/gstudio/management/commands/feed2gstudio.py
new file mode 100644
index 0000000..dd1d3d2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/management/commands/feed2gstudio.py
@@ -0,0 +1,209 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Feed to Gstudio command module"""
+import sys
+from datetime import datetime
+from optparse import make_option
+
+from django.utils.html import strip_tags
+from django.db.utils import IntegrityError
+from django.utils.encoding import smart_str
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.utils.text import truncate_words
+from django.template.defaultfilters import slugify
+from django.core.management.base import CommandError
+from django.core.management.base import LabelCommand
+
+from gstudio import __version__
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+from gstudio.managers import PUBLISHED
+from gstudio.signals import disconnect_gstudio_signals
+
+
+class Command(LabelCommand):
+ """Command object for importing a RSS or Atom
+ feed into Gstudio."""
+ help = 'Import a RSS or Atom feed into Gstudio.'
+ label = 'feed url'
+ args = 'url'
+
+ option_list = LabelCommand.option_list + (
+ make_option('--noautoexcerpt', action='store_false',
+ dest='auto_excerpt', default=True,
+ help='Do NOT generate an excerpt if not present.'),
+ make_option('--author', dest='author', default='',
+ help='All imported nodetypes belong to specified author'),
+ make_option('--metatype-is-tag', action='store_true',
+ dest='metatype-tag', default=False,
+ help='Store metatypes as tags'),
+ )
+ SITE = Site.objects.get_current()
+
+ def __init__(self):
+ """Init the Command and add custom styles"""
+ super(Command, self).__init__()
+ self.style.TITLE = self.style.SQL_FIELD
+ self.style.STEP = self.style.SQL_COLTYPE
+ self.style.ITEM = self.style.HTTP_INFO
+ disconnect_gstudio_signals()
+
+ def write_out(self, message, verbosity_level=1):
+ """Convenient method for outputing"""
+ if self.verbosity and self.verbosity >= verbosity_level:
+ sys.stdout.write(smart_str(message))
+ sys.stdout.flush()
+
+ def handle_label(self, url, **options):
+ try:
+ import feedparser
+ except ImportError:
+ raise CommandError('You need to install the feedparser ' \
+ 'module to run this command.')
+
+ self.verbosity = int(options.get('verbosity', 1))
+ self.auto_excerpt = options.get('auto_excerpt', True)
+ self.default_author = options.get('author')
+ self.metatype_tag = options.get('metatype-tag', False)
+ if self.default_author:
+ try:
+ self.default_author = User.objects.get(
+ username=self.default_author)
+ except User.DoesNotExist:
+ raise CommandError('Invalid username for default author')
+
+ self.write_out(self.style.TITLE(
+ 'Starting importation of %s to Gstudio %s:\n' % (url, __version__)))
+
+ feed = feedparser.parse(url)
+ self.import_nodetypes(feed.nodetypes)
+
+ def import_nodetypes(self, feed_nodetypes):
+ """Import nodetypes"""
+ for feed_nodetype in feed_nodetypes:
+ self.write_out('> %s... ' % feed_nodetype.title)
+ creation_date = datetime(*feed_nodetype.date_parsed[:6])
+ slug = slugify(feed_nodetype.title)[:255]
+
+ if Nodetype.objects.filter(creation_date__year=creation_date.year,
+ creation_date__month=creation_date.month,
+ creation_date__day=creation_date.day,
+ slug=slug):
+ self.write_out(self.style.NOTICE(
+ 'SKIPPED (already imported)\n'))
+ continue
+
+ metatypes = self.import_metatypes(feed_nodetype)
+ nodetype_dict = {'title': feed_nodetype.title[:255],
+ 'content': feed_nodetype.description,
+ 'excerpt': feed_nodetype.get('summary'),
+ 'status': PUBLISHED,
+ 'creation_date': creation_date,
+ 'start_publication': creation_date,
+ 'last_update': datetime.now(),
+ 'slug': slug}
+
+ if not nodetype_dict['excerpt'] and self.auto_excerpt:
+ nodetype_dict['excerpt'] = truncate_words(
+ strip_tags(feed_nodetype.description), 50)
+ if self.metatype_tag:
+ nodetype_dict['tags'] = self.import_tags(metatypes)
+
+ nodetype = Nodetype(**nodetype_dict)
+ nodetype.save()
+ nodetype.metatypes.add(*metatypes)
+ nodetype.sites.add(self.SITE)
+
+ if self.default_author:
+ nodetype.authors.add(self.default_author)
+ elif feed_nodetype.get('author_detail'):
+ try:
+ user = User.objects.create_user(
+ slugify(feed_nodetype.author_detail.get('name')),
+ feed_nodetype.author_detail.get('email', ''))
+ except IntegrityError:
+ user = User.objects.get(
+ username=slugify(feed_nodetype.author_detail.get('name')))
+ nodetype.authors.add(user)
+
+ self.write_out(self.style.ITEM('OK\n'))
+
+ def import_metatypes(self, feed_nodetype):
+ metatypes = []
+ for cat in feed_nodetype.get('tags', ''):
+ metatype, created = Metatype.objects.get_or_create(
+ slug=slugify(cat.term), defaults={'title': cat.term})
+ metatypes.append(metatype)
+ return metatypes
+
+ def import_tags(self, metatypes):
+ tags = []
+ for cat in metatypes:
+ if len(cat.title.split()) > 1:
+ tags.append('"%s"' % slugify(cat.title).replace('-', ' '))
+ else:
+ tags.append(slugify(cat.title).replace('-', ' '))
+ return ', '.join(tags)
diff --git a/build/lib.linux-i686-2.6/gstudio/management/commands/gstudio2wp.py b/build/lib.linux-i686-2.6/gstudio/management/commands/gstudio2wp.py
new file mode 100644
index 0000000..462f929
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/management/commands/gstudio2wp.py
@@ -0,0 +1,96 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Gstudio to WordPress command module"""
+from django.conf import settings
+from django.utils.encoding import smart_str
+from django.contrib.sites.models import Site
+from django.template.loader import render_to_string
+from django.core.management.base import NoArgsCommand
+
+from tagging.models import Tag
+
+from gstudio import __version__
+from gstudio.settings import PROTOCOL
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+
+
+class Command(NoArgsCommand):
+ """Command object for exporting a Gstudio blog
+ into WordPress via a WordPress eXtended RSS (WXR) file."""
+ help = 'Export Gstudio to WXR file.'
+
+ def handle_noargs(self, **options):
+ site = Site.objects.get_current()
+ blog_context = {'nodetypes': Nodetype.objects.all(),
+ 'metatypes': Metatype.objects.all(),
+ 'tags': Tag.objects.usage_for_model(Nodetype),
+ 'version': __version__,
+ 'description': 'Blog exported for django-gstudio',
+ 'language': settings.LANGUAGE_CODE,
+ 'site': site,
+ 'site_url': '%s://%s' % (PROTOCOL, site.domain)}
+ export = render_to_string('gstudio/wxr.xml', blog_context)
+ print smart_str(export)
diff --git a/build/lib.linux-i686-2.6/gstudio/management/commands/spam_cleanup.py b/build/lib.linux-i686-2.6/gstudio/management/commands/spam_cleanup.py
new file mode 100644
index 0000000..c121727
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/management/commands/spam_cleanup.py
@@ -0,0 +1,89 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Spam cleanup command module for Gstudio"""
+from django.contrib import comments
+from django.contrib.contenttypes.models import ContentType
+from django.core.management.base import NoArgsCommand
+
+from gstudio.models import Nodetype
+
+
+class Command(NoArgsCommand):
+ """Command object for removing comments
+ flagged as spam"""
+ help = "Remove nodetype's comments flagged as spam."
+
+ def handle_noargs(self, **options):
+ verbosity = int(options.get('verbosity', 1))
+
+ content_type = ContentType.objects.get_for_model(Nodetype)
+ spams = comments.get_model().objects.filter(is_public=False,
+ content_type=content_type,
+ flags__flag='spam')
+ spams_count = spams.count()
+ spams.delete()
+
+ if verbosity:
+ print '%i spam comments deleted.' % spams_count
diff --git a/build/lib.linux-i686-2.6/gstudio/management/commands/wp2gstudio.py b/build/lib.linux-i686-2.6/gstudio/management/commands/wp2gstudio.py
new file mode 100644
index 0000000..5da9eb2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/management/commands/wp2gstudio.py
@@ -0,0 +1,406 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""WordPress to Gstudio command module"""
+import sys
+from datetime import datetime
+from optparse import make_option
+from xml.etree import ElementTree as ET
+
+from django.utils.html import strip_tags
+from django.db.utils import IntegrityError
+from django.utils.encoding import smart_str
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.utils.text import truncate_words
+from django.template.defaultfilters import slugify
+from django.contrib import comments
+from django.core.management.base import CommandError
+from django.core.management.base import LabelCommand
+
+from tagging.models import Tag
+
+from gstudio import __version__
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+from gstudio.signals import disconnect_gstudio_signals
+from gstudio.managers import DRAFT, HIDDEN, PUBLISHED
+
+WP_NS = 'http://wordpress.org/export/%s/'
+
+
+class Command(LabelCommand):
+ """Command object for importing a WordPress blog
+ into Gstudio via a WordPress eXtended RSS (WXR) file."""
+ help = 'Import a Wordpress blog into Gstudio.'
+ label = 'WXR file'
+ args = 'wordpress.xml'
+
+ option_list = LabelCommand.option_list + (
+ make_option('--noautoexcerpt', action='store_false',
+ dest='auto_excerpt', default=True,
+ help='Do NOT generate an excerpt if not present.'),
+ make_option('--author', dest='author', default='',
+ help='All imported nodetypes belong to specified author'),
+ make_option('--wxr_version', dest='wxr_version', default='1.0',
+ help='Wordpress XML export version'),
+ )
+
+ SITE = Site.objects.get_current()
+ REVERSE_STATUS = {'pending': DRAFT,
+ 'draft': DRAFT,
+ 'auto-draft': DRAFT,
+ 'inherit': DRAFT,
+ 'publish': PUBLISHED,
+ 'future': PUBLISHED,
+ 'trash': HIDDEN,
+ 'private': PUBLISHED}
+
+ def __init__(self):
+ """Init the Command and add custom styles"""
+ super(Command, self).__init__()
+ self.style.TITLE = self.style.SQL_FIELD
+ self.style.STEP = self.style.SQL_COLTYPE
+ self.style.ITEM = self.style.HTTP_INFO
+ disconnect_gstudio_signals()
+
+ def write_out(self, message, verbosity_level=1):
+ """Convenient method for outputing"""
+ if self.verbosity and self.verbosity >= verbosity_level:
+ sys.stdout.write(smart_str(message))
+ sys.stdout.flush()
+
+ def handle_label(self, wxr_file, **options):
+ global WP_NS
+ self.verbosity = int(options.get('verbosity', 1))
+ self.auto_excerpt = options.get('auto_excerpt', True)
+ WP_NS = WP_NS % options.get('wxr_version')
+ self.default_author = options.get('author')
+ if self.default_author:
+ try:
+ self.default_author = User.objects.get(
+ username=self.default_author)
+ except User.DoesNotExist:
+ raise CommandError('Invalid username for default author')
+
+ self.write_out(self.style.TITLE(
+ 'Starting migration from Wordpress to Gstudio %s:\n' % __version__))
+
+ tree = ET.parse(wxr_file)
+
+ self.authors = self.import_authors(tree)
+
+ self.metatypes = self.import_metatypes(
+ tree.findall('channel/{%s}metatype' % WP_NS))
+
+ self.import_tags(tree.findall('channel/{%s}tag' % WP_NS))
+
+ self.import_nodetypes(tree.findall('channel/item'))
+
+ def import_authors(self, tree):
+ """Retrieve all the authors used in posts
+ and convert it to new or existing user, and
+ return the convertion"""
+ self.write_out(self.style.STEP('- Importing authors\n'))
+
+ post_authors = set()
+ for item in tree.findall('channel/item'):
+ post_type = item.find('{%s}post_type' % WP_NS).text
+ if post_type == 'post':
+ post_authors.add(item.find(
+ '{http://purl.org/dc/elements/1.1/}creator').text)
+
+ self.write_out('%i authors found.\n' % len(post_authors))
+
+ authors = {}
+ for post_author in post_authors:
+ if self.default_author:
+ authors[post_author] = self.default_author
+ else:
+ authors[post_author] = self.migrate_author(post_author)
+ return authors
+
+ def migrate_author(self, author_name):
+ """Handle actions for migrating the users"""
+ action_text = "The author '%s' needs to be migrated to an User:\n"\
+ "1. Use an existing user ?\n"\
+ "2. Create a new user ?\n"\
+ "Please select a choice: " % author_name
+ while 42:
+ selection = raw_input(smart_str(action_text))
+ if selection in '12':
+ break
+ if selection == '1':
+ users = User.objects.all()
+ usernames = [user.username for user in users]
+ while 42:
+ user_text = "1. Select your user, by typing " \
+ "one of theses usernames:\n"\
+ "[%s]\n"\
+ "Please select a choice: " % ', '.join(usernames)
+ user_selected = raw_input(user_text)
+ if user_selected in usernames:
+ break
+ return users.get(username=user_selected)
+ else:
+ create_text = "2. Please type the email of the '%s' user: " % \
+ author_name
+ author_mail = raw_input(create_text)
+ try:
+ return User.objects.create_user(author_name, author_mail)
+ except IntegrityError:
+ return User.objects.get(username=author_name)
+
+ def import_metatypes(self, metatype_nodes):
+ """Import all the metatypes from 'wp:metatype' nodes,
+ because metatypes in 'item' nodes are not necessarily
+ all the metatypes and returning it in a dict for
+ database optimizations."""
+ self.write_out(self.style.STEP('- Importing metatypes\n'))
+
+ metatypes = {}
+ for metatype_node in metatype_nodes:
+ title = metatype_node.find('{%s}cat_name' % WP_NS).text[:255]
+ slug = metatype_node.find(
+ '{%s}metatype_nicename' % WP_NS).text[:255]
+ try:
+ parent = metatype_node.find(
+ '{%s}metatype_parent' % WP_NS).text[:255]
+ except TypeError:
+ parent = None
+ self.write_out('> %s... ' % title)
+ metatype, created = Metatype.objects.get_or_create(
+ title=title, slug=slug, parent=metatypes.get(parent))
+ metatypes[title] = metatype
+ self.write_out(self.style.ITEM('OK\n'))
+ return metatypes
+
+ def import_tags(self, tag_nodes):
+ """Import all the tags form 'wp:tag' nodes,
+ because tags in 'item' nodes are not necessarily
+ all the tags, then use only the nicename, because it's like
+ a slug and the true tag name may be not valid for url usage."""
+ self.write_out(self.style.STEP('- Importing tags\n'))
+ for tag_node in tag_nodes:
+ tag_name = tag_node.find(
+ '{%s}tag_slug' % WP_NS).text[:50]
+ self.write_out('> %s... ' % tag_name)
+ Tag.objects.get_or_create(name=tag_name)
+ self.write_out(self.style.ITEM('OK\n'))
+
+ def get_nodetype_tags(self, metatypes):
+ """Return a list of nodetype's tags,
+ by using the nicename for url compatibility"""
+ tags = []
+ for metatype in metatypes:
+ domain = metatype.attrib.get('domain', 'metatype')
+ if domain == 'tag' and metatype.attrib.get('nicename'):
+ tags.append(metatype.attrib.get('nicename'))
+ return tags
+
+ def get_nodetype_metatypes(self, metatype_nodes):
+ """Return a list of nodetype's metatypes
+ based of imported metatypes"""
+ metatypes = []
+ for metatype_node in metatype_nodes:
+ domain = metatype_node.attrib.get('domain')
+ if domain == 'metatype':
+ metatypes.append(self.metatypes[metatype_node.text])
+ return metatypes
+
+ def import_nodetype(self, title, content, item_node):
+ """Importing a nodetype but some data are missing like
+ the image, related nodetypes, start_publication and end_publication.
+ start_publication and creation_date will use the same value,
+ wich is always in Wordpress $post->post_date"""
+ creation_date = datetime.strptime(
+ item_node.find('{%s}post_date' % WP_NS).text, '%Y-%m-%d %H:%M:%S')
+
+ excerpt = item_node.find('{%sexcerpt/}encoded' % WP_NS).text
+ if not excerpt:
+ if self.auto_excerpt:
+ excerpt = truncate_words(strip_tags(content), 50)
+ else:
+ excerpt = ''
+
+ nodetype_dict = {
+ 'content': content,
+ 'excerpt': excerpt,
+ # Prefer use this function than
+ # item_node.find('{%s}post_name' % WP_NS).text
+ # Because slug can be not well formated
+ 'slug': slugify(title)[:255] or 'post-%s' % item_node.find(
+ '{%s}post_id' % WP_NS).text,
+ 'tags': ', '.join(self.get_nodetype_tags(item_node.findall(
+ 'metatype'))),
+ 'status': self.REVERSE_STATUS[item_node.find(
+ '{%s}status' % WP_NS).text],
+ 'comment_enabled': item_node.find(
+ '{%s}comment_status' % WP_NS).text == 'open',
+ 'pingback_enabled': item_node.find(
+ '{%s}ping_status' % WP_NS).text == 'open',
+ 'featured': item_node.find('{%s}is_sticky' % WP_NS).text == '1',
+ 'password': item_node.find('{%s}post_password' % WP_NS).text or '',
+ 'login_required': item_node.find(
+ '{%s}status' % WP_NS).text == 'private',
+ 'creation_date': creation_date,
+ 'last_update': datetime.now(),
+ 'start_publication': creation_date}
+
+ nodetype, created = Nodetype.objects.get_or_create(title=title,
+ defaults=nodetype_dict)
+
+ nodetype.metatypes.add(*self.get_nodetype_metatypes(
+ item_node.findall('metatype')))
+ nodetype.authors.add(self.authors[item_node.find(
+ '{http://purl.org/dc/elements/1.1/}creator').text])
+ nodetype.sites.add(self.SITE)
+
+ #current_id = item_node.find('{%s}post_id' % WP_NS).text
+ #parent_id = item_node.find('%s}post_parent' % WP_NS).text
+
+ return nodetype
+
+ def import_nodetypes(self, items):
+ """Loops over items and find nodetype to import,
+ a nodetype need to have 'post_type' set to 'post' and
+ have content."""
+ self.write_out(self.style.STEP('- Importing nodetypes\n'))
+
+ for item_node in items:
+ title = (item_node.find('title').text or '')[:255]
+ post_type = item_node.find('{%s}post_type' % WP_NS).text
+ content = item_node.find(
+ '{http://purl.org/rss/1.0/modules/content/}encoded').text
+
+ if post_type == 'post' and content and title:
+ self.write_out('> %s... ' % title)
+ nodetype = self.import_nodetype(title, content, item_node)
+ self.write_out(self.style.ITEM('OK\n'))
+ self.import_comments(nodetype, item_node.findall(
+ '{%s}comment/' % WP_NS))
+ else:
+ self.write_out('> %s... ' % title, 2)
+ self.write_out(self.style.NOTICE('SKIPPED (not a post)\n'), 2)
+
+ def import_comments(self, nodetype, comment_nodes):
+ """Loops over comments nodes and import then
+ in django.contrib.comments"""
+ for comment_node in comment_nodes:
+ is_pingback = comment_node.find(
+ '{%s}comment_type' % WP_NS).text == 'pingback'
+ is_trackback = comment_node.find(
+ '{%s}comment_type' % WP_NS).text == 'trackback'
+
+ title = 'Comment #%s' % (comment_node.find(
+ '{%s}comment_id/' % WP_NS).text)
+ self.write_out(' > %s... ' % title)
+
+ content = comment_node.find(
+ '{%s}comment_content/' % WP_NS).text
+ if not content:
+ self.write_out(self.style.NOTICE('SKIPPED (unfilled)\n'))
+ return
+
+ submit_date = datetime.strptime(
+ comment_node.find('{%s}comment_date' % WP_NS).text,
+ '%Y-%m-%d %H:%M:%S')
+
+ approvation = comment_node.find(
+ '{%s}comment_approved' % WP_NS).text
+ is_public = True
+ is_removed = False
+ if approvation != '1':
+ is_removed = True
+ if approvation == 'spam':
+ is_public = False
+
+ comment_dict = {
+ 'content_object': nodetype,
+ 'site': self.SITE,
+ 'user_name': comment_node.find(
+ '{%s}comment_author/' % WP_NS).text[:50],
+ 'user_email': comment_node.find(
+ '{%s}comment_author_email/' % WP_NS).text or '',
+ 'user_url': comment_node.find(
+ '{%s}comment_author_url/' % WP_NS).text or '',
+ 'comment': content,
+ 'submit_date': submit_date,
+ 'ip_address': comment_node.find(
+ '{%s}comment_author_IP/' % WP_NS).text or '',
+ 'is_public': is_public,
+ 'is_removed': is_removed, }
+ comment = comments.get_model()(**comment_dict)
+ comment.save()
+ if approvation == 'spam':
+ comment.flags.create(
+ user=nodetype.authors.all()[0], flag='spam')
+ if is_pingback:
+ comment.flags.create(
+ user=nodetype.authors.all()[0], flag='pingback')
+ if is_trackback:
+ comment.flags.create(
+ user=nodetype.authors.all()[0], flag='trackback')
+
+ self.write_out(self.style.ITEM('OK\n'))
diff --git a/build/lib.linux-i686-2.6/gstudio/managers.py b/build/lib.linux-i686-2.6/gstudio/managers.py
new file mode 100644
index 0000000..5922327
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/managers.py
@@ -0,0 +1,130 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Managers of gstudio"""
+from datetime import datetime
+
+from django.db import models
+from django.contrib.sites.models import Site
+
+DRAFT = 0
+HIDDEN = 1
+PUBLISHED = 2
+
+
+def tags_published():
+ """Return the published tags"""
+ from tagging.models import Tag
+ from gstudio.models import Nodetype
+ tags_nodetype_published = Tag.objects.usage_for_queryset(
+ Nodetype.published.all())
+ # Need to do that until the issue #44 of django-tagging is fixed
+ return Tag.objects.filter(name__in=[t.name for t in tags_nodetype_published])
+
+
+class AuthorPublishedManager(models.Manager):
+ """Manager to retrieve published authors"""
+
+ def get_query_set(self):
+ """Return published authors"""
+ now = datetime.now()
+ return super(AuthorPublishedManager, self).get_query_set().filter(
+ nodetypes__status=PUBLISHED,
+ nodetypes__start_publication__lte=now,
+ nodetypes__end_publication__gt=now,
+ nodetypes__sites=Site.objects.get_current()
+ ).distinct()
+
+
+def nodetypes_published(queryset):
+
+ """Return only the nodetypes published"""
+ now = datetime.now()
+ return queryset.filter(status=PUBLISHED,
+ start_publication__lte=now,
+ end_publication__gt=now,
+ sites=Site.objects.get_current())
+
+
+class NodetypePublishedManager(models.Manager):
+ """Manager to retrieve published nodetypes"""
+
+ def get_query_set(self):
+ """Return published nodetypes"""
+ return nodetypes_published(
+ super(NodetypePublishedManager, self).get_query_set())
+
+ def on_site(self):
+ """Return nodetypes published on current site"""
+ return super(NodetypePublishedManager, self).get_query_set(
+ ).filter(sites=Site.objects.get_current())
+
+ def search(self, pattern):
+ """Top level search method on nodetypes"""
+ try:
+ return self.advanced_search(pattern)
+ except:
+ return self.basic_search(pattern)
+
+ def advanced_search(self, pattern):
+ """Advanced search on nodetypes"""
+ from gstudio.search import advanced_search
+ return advanced_search(pattern)
+
+ def basic_search(self, pattern):
+ """Basic search on nodetypes"""
+ lookup = None
+ for pattern in pattern.split():
+ query_part = models.Q(content__icontains=pattern) | \
+ models.Q(excerpt__icontains=pattern) | \
+ models.Q(title__icontains=pattern)
+ if lookup is None:
+ lookup = query_part
+ else:
+ lookup |= query_part
+
+ return self.get_query_set().filter(lookup)
diff --git a/build/lib.linux-i686-2.6/gstudio/migrations/0001_initial.py b/build/lib.linux-i686-2.6/gstudio/migrations/0001_initial.py
new file mode 100644
index 0000000..889757e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/migrations/0001_initial.py
@@ -0,0 +1,997 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding model 'NID'
+ db.create_table('gstudio_nid', (
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('title', self.gf('django.db.models.fields.CharField')(max_length=255)),
+ ))
+ db.send_create_signal('gstudio', ['NID'])
+
+ # Adding model 'Node'
+ db.create_table('gstudio_node', (
+ ('nid_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.NID'], unique=True, primary_key=True)),
+ ('altnames', self.gf('tagging.fields.TagField')(null=True)),
+ ('plural', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)),
+ ('rating_votes', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, blank=True)),
+ ('rating_score', self.gf('django.db.models.fields.IntegerField')(default=0, blank=True)),
+ ))
+ db.send_create_signal('gstudio', ['Node'])
+
+ # Adding model 'Edge'
+ db.create_table('gstudio_edge', (
+ ('nid_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.NID'], unique=True, primary_key=True)),
+ ))
+ db.send_create_signal('gstudio', ['Edge'])
+
+ # Adding model 'Metatype'
+ db.create_table('gstudio_metatype', (
+ ('node_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Node'], unique=True, primary_key=True)),
+ ('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=255, db_index=True)),
+ ('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
+ ('parent', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='children', null=True, to=orm['gstudio.Metatype'])),
+ ('lft', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ('rght', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ('tree_id', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ('level', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ))
+ db.send_create_signal('gstudio', ['Metatype'])
+
+ # Adding model 'Nodetype'
+ db.create_table('gstudio_nodetype', (
+ ('node_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Node'], unique=True, primary_key=True)),
+ ('content', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
+ ('parent', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='children', null=True, to=orm['gstudio.Nodetype'])),
+ ('image', self.gf('django.db.models.fields.files.ImageField')(max_length=100, blank=True)),
+ ('excerpt', self.gf('django.db.models.fields.TextField')(blank=True)),
+ ('tags', self.gf('tagging.fields.TagField')()),
+ ('slug', self.gf('django.db.models.fields.SlugField')(max_length=255, db_index=True)),
+ ('status', self.gf('django.db.models.fields.IntegerField')(default=2)),
+ ('featured', self.gf('django.db.models.fields.BooleanField')(default=False)),
+ ('comment_enabled', self.gf('django.db.models.fields.BooleanField')(default=True)),
+ ('pingback_enabled', self.gf('django.db.models.fields.BooleanField')(default=True)),
+ ('creation_date', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
+ ('last_update', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
+ ('start_publication', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
+ ('end_publication', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2042, 3, 15, 0, 0))),
+ ('login_required', self.gf('django.db.models.fields.BooleanField')(default=False)),
+ ('password', self.gf('django.db.models.fields.CharField')(max_length=50, blank=True)),
+ ('template', self.gf('django.db.models.fields.CharField')(default='gstudio/nodetype_detail.html', max_length=250)),
+ ('lft', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ('rght', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ('tree_id', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ('level', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ))
+ db.send_create_signal('gstudio', ['Nodetype'])
+
+ # Adding M2M table for field prior_nodes on 'Nodetype'
+ db.create_table('gstudio_nodetype_prior_nodes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('from_nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False)),
+ ('to_nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False))
+ ))
+ db.create_unique('gstudio_nodetype_prior_nodes', ['from_nodetype_id', 'to_nodetype_id'])
+
+ # Adding M2M table for field posterior_nodes on 'Nodetype'
+ db.create_table('gstudio_nodetype_posterior_nodes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('from_nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False)),
+ ('to_nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False))
+ ))
+ db.create_unique('gstudio_nodetype_posterior_nodes', ['from_nodetype_id', 'to_nodetype_id'])
+
+ # Adding M2M table for field metatypes on 'Nodetype'
+ db.create_table('gstudio_nodetype_metatypes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False)),
+ ('metatype', models.ForeignKey(orm['gstudio.metatype'], null=False))
+ ))
+ db.create_unique('gstudio_nodetype_metatypes', ['nodetype_id', 'metatype_id'])
+
+ # Adding M2M table for field authors on 'Nodetype'
+ db.create_table('gstudio_nodetype_authors', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False)),
+ ('user', models.ForeignKey(orm['auth.user'], null=False))
+ ))
+ db.create_unique('gstudio_nodetype_authors', ['nodetype_id', 'user_id'])
+
+ # Adding M2M table for field sites on 'Nodetype'
+ db.create_table('gstudio_nodetype_sites', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False)),
+ ('site', models.ForeignKey(orm['sites.site'], null=False))
+ ))
+ db.create_unique('gstudio_nodetype_sites', ['nodetype_id', 'site_id'])
+
+ # Adding model 'Objecttype'
+ db.create_table('gstudio_objecttype', (
+ ('nodetype_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Nodetype'], unique=True, primary_key=True)),
+ ('lft', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ))
+ db.send_create_signal('gstudio', ['Objecttype'])
+
+ # Adding model 'Relationtype'
+ db.create_table('gstudio_relationtype', (
+ ('nodetype_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Nodetype'], unique=True, primary_key=True)),
+ ('inverse', self.gf('django.db.models.fields.CharField')(max_length=255, db_index=True)),
+ ('left_subjecttype', self.gf('django.db.models.fields.related.ForeignKey')(related_name='left_subjecttype_of', to=orm['gstudio.NID'])),
+ ('left_applicable_nodetypes', self.gf('django.db.models.fields.CharField')(default='OT', max_length=2)),
+ ('left_cardinality', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
+ ('right_subjecttype', self.gf('django.db.models.fields.related.ForeignKey')(related_name='right_subjecttype_of', to=orm['gstudio.NID'])),
+ ('right_applicable_nodetypes', self.gf('django.db.models.fields.CharField')(default='OT', max_length=2)),
+ ('right_cardinality', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
+ ('is_symmetrical', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ('is_reflexive', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ('is_transitive', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ('lft', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ))
+ db.send_create_signal('gstudio', ['Relationtype'])
+
+ # Adding model 'Attributetype'
+ db.create_table('gstudio_attributetype', (
+ ('nodetype_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Nodetype'], unique=True, primary_key=True)),
+ ('subjecttype', self.gf('django.db.models.fields.related.ForeignKey')(related_name='subjecttype_of', to=orm['gstudio.NID'])),
+ ('applicable_nodetypes', self.gf('django.db.models.fields.CharField')(default='OT', max_length=2)),
+ ('dataType', self.gf('django.db.models.fields.CharField')(default='01', max_length=2)),
+ ('verbose_name', self.gf('django.db.models.fields.CharField')(max_length=500, null=True, blank=True)),
+ ('null', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ('blank', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ('help_text', self.gf('django.db.models.fields.CharField')(max_length=500, null=True, blank=True)),
+ ('max_digits', self.gf('django.db.models.fields.IntegerField')(max_length=5, null=True, blank=True)),
+ ('decimal_places', self.gf('django.db.models.fields.IntegerField')(max_length=2, null=True, blank=True)),
+ ('auto_now', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ('auto_now_add', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ('upload_to', self.gf('django.db.models.fields.CharField')(max_length=500, null=True, blank=True)),
+ ('path', self.gf('django.db.models.fields.CharField')(max_length=500, null=True, blank=True)),
+ ('verify_exists', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ('min_length', self.gf('django.db.models.fields.IntegerField')(max_length=10, null=True, blank=True)),
+ ('required', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ('label', self.gf('django.db.models.fields.CharField')(max_length=500, null=True, blank=True)),
+ ('unique', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ('default', self.gf('django.db.models.fields.CharField')(max_length=500, null=True, blank=True)),
+ ('editable', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ('lft', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ))
+ db.send_create_signal('gstudio', ['Attributetype'])
+
+ # Adding M2M table for field validators on 'Attributetype'
+ db.create_table('gstudio_attributetype_validators', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('from_attributetype', models.ForeignKey(orm['gstudio.attributetype'], null=False)),
+ ('to_attributetype', models.ForeignKey(orm['gstudio.attributetype'], null=False))
+ ))
+ db.create_unique('gstudio_attributetype_validators', ['from_attributetype_id', 'to_attributetype_id'])
+
+ # Adding model 'Relation'
+ db.create_table('gstudio_relation', (
+ ('edge_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Edge'], unique=True, primary_key=True)),
+ ('left_subject_scope', self.gf('django.db.models.fields.CharField')(max_length=50, null=True, blank=True)),
+ ('left_subject', self.gf('django.db.models.fields.related.ForeignKey')(related_name='left_subject_of', to=orm['gstudio.NID'])),
+ ('relationtype_scope', self.gf('django.db.models.fields.CharField')(max_length=50, null=True, blank=True)),
+ ('relationtype', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['gstudio.Relationtype'])),
+ ('right_subject_scope', self.gf('django.db.models.fields.CharField')(max_length=50, null=True, blank=True)),
+ ('right_subject', self.gf('django.db.models.fields.related.ForeignKey')(related_name='right_subject_of', to=orm['gstudio.NID'])),
+ ))
+ db.send_create_signal('gstudio', ['Relation'])
+
+ # Adding unique constraint on 'Relation', fields ['left_subject_scope', 'left_subject', 'relationtype_scope', 'relationtype', 'right_subject_scope', 'right_subject']
+ db.create_unique('gstudio_relation', ['left_subject_scope', 'left_subject_id', 'relationtype_scope', 'relationtype_id', 'right_subject_scope', 'right_subject_id'])
+
+ # Adding model 'Attribute'
+ db.create_table('gstudio_attribute', (
+ ('edge_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Edge'], unique=True, primary_key=True)),
+ ('subject_scope', self.gf('django.db.models.fields.CharField')(max_length=50, null=True, blank=True)),
+ ('subject', self.gf('django.db.models.fields.related.ForeignKey')(related_name='subject_of', to=orm['gstudio.NID'])),
+ ('attributetype_scope', self.gf('django.db.models.fields.CharField')(max_length=50, null=True, blank=True)),
+ ('attributetype', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['gstudio.Attributetype'])),
+ ('value_scope', self.gf('django.db.models.fields.CharField')(max_length=50, null=True, blank=True)),
+ ('svalue', self.gf('django.db.models.fields.CharField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['Attribute'])
+
+ # Adding unique constraint on 'Attribute', fields ['subject_scope', 'subject', 'attributetype_scope', 'attributetype', 'value_scope', 'svalue']
+ db.create_unique('gstudio_attribute', ['subject_scope', 'subject_id', 'attributetype_scope', 'attributetype_id', 'value_scope', 'svalue'])
+
+ # Adding model 'AttributeCharField'
+ db.create_table('gstudio_attributecharfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.CharField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeCharField'])
+
+ # Adding model 'AttributeTextField'
+ db.create_table('gstudio_attributetextfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.TextField')()),
+ ))
+ db.send_create_signal('gstudio', ['AttributeTextField'])
+
+ # Adding model 'AttributeIntegerField'
+ db.create_table('gstudio_attributeintegerfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.IntegerField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeIntegerField'])
+
+ # Adding model 'AttributeCommaSeparatedIntegerField'
+ db.create_table('gstudio_attributecommaseparatedintegerfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.CommaSeparatedIntegerField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeCommaSeparatedIntegerField'])
+
+ # Adding model 'AttributeBigIntegerField'
+ db.create_table('gstudio_attributebigintegerfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.BigIntegerField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeBigIntegerField'])
+
+ # Adding model 'AttributePositiveIntegerField'
+ db.create_table('gstudio_attributepositiveintegerfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.PositiveIntegerField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributePositiveIntegerField'])
+
+ # Adding model 'AttributeDecimalField'
+ db.create_table('gstudio_attributedecimalfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.DecimalField')(max_digits=3, decimal_places=2)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeDecimalField'])
+
+ # Adding model 'AttributeFloatField'
+ db.create_table('gstudio_attributefloatfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.FloatField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeFloatField'])
+
+ # Adding model 'AttributeBooleanField'
+ db.create_table('gstudio_attributebooleanfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.BooleanField')(default=False)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeBooleanField'])
+
+ # Adding model 'AttributeNullBooleanField'
+ db.create_table('gstudio_attributenullbooleanfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.NullBooleanField')(null=True, blank=True)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeNullBooleanField'])
+
+ # Adding model 'AttributeDateField'
+ db.create_table('gstudio_attributedatefield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.DateField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeDateField'])
+
+ # Adding model 'AttributeDateTimeField'
+ db.create_table('gstudio_attributedatetimefield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.DateTimeField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeDateTimeField'])
+
+ # Adding model 'AttributeTimeField'
+ db.create_table('gstudio_attributetimefield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.TimeField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeTimeField'])
+
+ # Adding model 'AttributeEmailField'
+ db.create_table('gstudio_attributeemailfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.CharField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeEmailField'])
+
+ # Adding model 'AttributeFileField'
+ db.create_table('gstudio_attributefilefield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeFileField'])
+
+ # Adding model 'AttributeFilePathField'
+ db.create_table('gstudio_attributefilepathfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.FilePathField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeFilePathField'])
+
+ # Adding model 'AttributeImageField'
+ db.create_table('gstudio_attributeimagefield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.files.ImageField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeImageField'])
+
+ # Adding model 'AttributeURLField'
+ db.create_table('gstudio_attributeurlfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.URLField')(max_length=100)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeURLField'])
+
+ # Adding model 'AttributeIPAddressField'
+ db.create_table('gstudio_attributeipaddressfield', (
+ ('attribute_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Attribute'], unique=True, primary_key=True)),
+ ('value', self.gf('django.db.models.fields.IPAddressField')(max_length=15)),
+ ))
+ db.send_create_signal('gstudio', ['AttributeIPAddressField'])
+
+ # Adding model 'Processtype'
+ db.create_table('gstudio_processtype', (
+ ('nodetype_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Nodetype'], unique=True, primary_key=True)),
+ ('lft', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ))
+ db.send_create_signal('gstudio', ['Processtype'])
+
+ # Adding M2M table for field changing_attributetype_set on 'Processtype'
+ db.create_table('gstudio_processtype_changing_attributetype_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('processtype', models.ForeignKey(orm['gstudio.processtype'], null=False)),
+ ('attributetype', models.ForeignKey(orm['gstudio.attributetype'], null=False))
+ ))
+ db.create_unique('gstudio_processtype_changing_attributetype_set', ['processtype_id', 'attributetype_id'])
+
+ # Adding M2M table for field changing_relationtype_set on 'Processtype'
+ db.create_table('gstudio_processtype_changing_relationtype_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('processtype', models.ForeignKey(orm['gstudio.processtype'], null=False)),
+ ('relationtype', models.ForeignKey(orm['gstudio.relationtype'], null=False))
+ ))
+ db.create_unique('gstudio_processtype_changing_relationtype_set', ['processtype_id', 'relationtype_id'])
+
+ # Adding model 'Systemtype'
+ db.create_table('gstudio_systemtype', (
+ ('nodetype_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Nodetype'], unique=True, primary_key=True)),
+ ('lft', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)),
+ ))
+ db.send_create_signal('gstudio', ['Systemtype'])
+
+ # Adding M2M table for field nodetype_set on 'Systemtype'
+ db.create_table('gstudio_systemtype_nodetype_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('systemtype', models.ForeignKey(orm['gstudio.systemtype'], null=False)),
+ ('nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False))
+ ))
+ db.create_unique('gstudio_systemtype_nodetype_set', ['systemtype_id', 'nodetype_id'])
+
+ # Adding M2M table for field relationtype_set on 'Systemtype'
+ db.create_table('gstudio_systemtype_relationtype_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('systemtype', models.ForeignKey(orm['gstudio.systemtype'], null=False)),
+ ('relationtype', models.ForeignKey(orm['gstudio.relationtype'], null=False))
+ ))
+ db.create_unique('gstudio_systemtype_relationtype_set', ['systemtype_id', 'relationtype_id'])
+
+ # Adding M2M table for field attributetype_set on 'Systemtype'
+ db.create_table('gstudio_systemtype_attributetype_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('systemtype', models.ForeignKey(orm['gstudio.systemtype'], null=False)),
+ ('attributetype', models.ForeignKey(orm['gstudio.attributetype'], null=False))
+ ))
+ db.create_unique('gstudio_systemtype_attributetype_set', ['systemtype_id', 'attributetype_id'])
+
+ # Adding M2M table for field metatype_set on 'Systemtype'
+ db.create_table('gstudio_systemtype_metatype_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('systemtype', models.ForeignKey(orm['gstudio.systemtype'], null=False)),
+ ('metatype', models.ForeignKey(orm['gstudio.metatype'], null=False))
+ ))
+ db.create_unique('gstudio_systemtype_metatype_set', ['systemtype_id', 'metatype_id'])
+
+ # Adding M2M table for field processtype_set on 'Systemtype'
+ db.create_table('gstudio_systemtype_processtype_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('systemtype', models.ForeignKey(orm['gstudio.systemtype'], null=False)),
+ ('processtype', models.ForeignKey(orm['gstudio.processtype'], null=False))
+ ))
+ db.create_unique('gstudio_systemtype_processtype_set', ['systemtype_id', 'processtype_id'])
+
+ # Adding model 'AttributeSpecification'
+ db.create_table('gstudio_attributespecification', (
+ ('node_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Node'], unique=True, primary_key=True)),
+ ('attributetype', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['gstudio.Attributetype'])),
+ ))
+ db.send_create_signal('gstudio', ['AttributeSpecification'])
+
+ # Adding M2M table for field subjects on 'AttributeSpecification'
+ db.create_table('gstudio_attributespecification_subjects', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('attributespecification', models.ForeignKey(orm['gstudio.attributespecification'], null=False)),
+ ('nid', models.ForeignKey(orm['gstudio.nid'], null=False))
+ ))
+ db.create_unique('gstudio_attributespecification_subjects', ['attributespecification_id', 'nid_id'])
+
+ # Adding model 'RelationSpecification'
+ db.create_table('gstudio_relationspecification', (
+ ('node_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Node'], unique=True, primary_key=True)),
+ ('relationtype', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['gstudio.Relationtype'])),
+ ))
+ db.send_create_signal('gstudio', ['RelationSpecification'])
+
+ # Adding M2M table for field subjects on 'RelationSpecification'
+ db.create_table('gstudio_relationspecification_subjects', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('relationspecification', models.ForeignKey(orm['gstudio.relationspecification'], null=False)),
+ ('nid', models.ForeignKey(orm['gstudio.nid'], null=False))
+ ))
+ db.create_unique('gstudio_relationspecification_subjects', ['relationspecification_id', 'nid_id'])
+
+ # Adding model 'NodeSpecification'
+ db.create_table('gstudio_nodespecification', (
+ ('node_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Node'], unique=True, primary_key=True)),
+ ('subject', self.gf('django.db.models.fields.related.ForeignKey')(related_name='subject_nodespec', to=orm['gstudio.Node'])),
+ ))
+ db.send_create_signal('gstudio', ['NodeSpecification'])
+
+ # Adding M2M table for field relations on 'NodeSpecification'
+ db.create_table('gstudio_nodespecification_relations', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('nodespecification', models.ForeignKey(orm['gstudio.nodespecification'], null=False)),
+ ('relation', models.ForeignKey(orm['gstudio.relation'], null=False))
+ ))
+ db.create_unique('gstudio_nodespecification_relations', ['nodespecification_id', 'relation_id'])
+
+ # Adding M2M table for field attributes on 'NodeSpecification'
+ db.create_table('gstudio_nodespecification_attributes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('nodespecification', models.ForeignKey(orm['gstudio.nodespecification'], null=False)),
+ ('attribute', models.ForeignKey(orm['gstudio.attribute'], null=False))
+ ))
+ db.create_unique('gstudio_nodespecification_attributes', ['nodespecification_id', 'attribute_id'])
+
+ # Adding model 'Union'
+ db.create_table('gstudio_union', (
+ ('node_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Node'], unique=True, primary_key=True)),
+ ))
+ db.send_create_signal('gstudio', ['Union'])
+
+ # Adding M2M table for field nodetypes on 'Union'
+ db.create_table('gstudio_union_nodetypes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('union', models.ForeignKey(orm['gstudio.union'], null=False)),
+ ('nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False))
+ ))
+ db.create_unique('gstudio_union_nodetypes', ['union_id', 'nodetype_id'])
+
+ # Adding model 'Complement'
+ db.create_table('gstudio_complement', (
+ ('node_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Node'], unique=True, primary_key=True)),
+ ))
+ db.send_create_signal('gstudio', ['Complement'])
+
+ # Adding M2M table for field nodetypes on 'Complement'
+ db.create_table('gstudio_complement_nodetypes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('complement', models.ForeignKey(orm['gstudio.complement'], null=False)),
+ ('nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False))
+ ))
+ db.create_unique('gstudio_complement_nodetypes', ['complement_id', 'nodetype_id'])
+
+ # Adding model 'Intersection'
+ db.create_table('gstudio_intersection', (
+ ('node_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Node'], unique=True, primary_key=True)),
+ ))
+ db.send_create_signal('gstudio', ['Intersection'])
+
+ # Adding M2M table for field nodetypes on 'Intersection'
+ db.create_table('gstudio_intersection_nodetypes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('intersection', models.ForeignKey(orm['gstudio.intersection'], null=False)),
+ ('nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False))
+ ))
+ db.create_unique('gstudio_intersection_nodetypes', ['intersection_id', 'nodetype_id'])
+
+
+ def backwards(self, orm):
+
+ # Removing unique constraint on 'Attribute', fields ['subject_scope', 'subject', 'attributetype_scope', 'attributetype', 'value_scope', 'svalue']
+ db.delete_unique('gstudio_attribute', ['subject_scope', 'subject_id', 'attributetype_scope', 'attributetype_id', 'value_scope', 'svalue'])
+
+ # Removing unique constraint on 'Relation', fields ['left_subject_scope', 'left_subject', 'relationtype_scope', 'relationtype', 'right_subject_scope', 'right_subject']
+ db.delete_unique('gstudio_relation', ['left_subject_scope', 'left_subject_id', 'relationtype_scope', 'relationtype_id', 'right_subject_scope', 'right_subject_id'])
+
+ # Deleting model 'NID'
+ db.delete_table('gstudio_nid')
+
+ # Deleting model 'Node'
+ db.delete_table('gstudio_node')
+
+ # Deleting model 'Edge'
+ db.delete_table('gstudio_edge')
+
+ # Deleting model 'Metatype'
+ db.delete_table('gstudio_metatype')
+
+ # Deleting model 'Nodetype'
+ db.delete_table('gstudio_nodetype')
+
+ # Removing M2M table for field prior_nodes on 'Nodetype'
+ db.delete_table('gstudio_nodetype_prior_nodes')
+
+ # Removing M2M table for field posterior_nodes on 'Nodetype'
+ db.delete_table('gstudio_nodetype_posterior_nodes')
+
+ # Removing M2M table for field metatypes on 'Nodetype'
+ db.delete_table('gstudio_nodetype_metatypes')
+
+ # Removing M2M table for field authors on 'Nodetype'
+ db.delete_table('gstudio_nodetype_authors')
+
+ # Removing M2M table for field sites on 'Nodetype'
+ db.delete_table('gstudio_nodetype_sites')
+
+ # Deleting model 'Objecttype'
+ db.delete_table('gstudio_objecttype')
+
+ # Deleting model 'Relationtype'
+ db.delete_table('gstudio_relationtype')
+
+ # Deleting model 'Attributetype'
+ db.delete_table('gstudio_attributetype')
+
+ # Removing M2M table for field validators on 'Attributetype'
+ db.delete_table('gstudio_attributetype_validators')
+
+ # Deleting model 'Relation'
+ db.delete_table('gstudio_relation')
+
+ # Deleting model 'Attribute'
+ db.delete_table('gstudio_attribute')
+
+ # Deleting model 'AttributeCharField'
+ db.delete_table('gstudio_attributecharfield')
+
+ # Deleting model 'AttributeTextField'
+ db.delete_table('gstudio_attributetextfield')
+
+ # Deleting model 'AttributeIntegerField'
+ db.delete_table('gstudio_attributeintegerfield')
+
+ # Deleting model 'AttributeCommaSeparatedIntegerField'
+ db.delete_table('gstudio_attributecommaseparatedintegerfield')
+
+ # Deleting model 'AttributeBigIntegerField'
+ db.delete_table('gstudio_attributebigintegerfield')
+
+ # Deleting model 'AttributePositiveIntegerField'
+ db.delete_table('gstudio_attributepositiveintegerfield')
+
+ # Deleting model 'AttributeDecimalField'
+ db.delete_table('gstudio_attributedecimalfield')
+
+ # Deleting model 'AttributeFloatField'
+ db.delete_table('gstudio_attributefloatfield')
+
+ # Deleting model 'AttributeBooleanField'
+ db.delete_table('gstudio_attributebooleanfield')
+
+ # Deleting model 'AttributeNullBooleanField'
+ db.delete_table('gstudio_attributenullbooleanfield')
+
+ # Deleting model 'AttributeDateField'
+ db.delete_table('gstudio_attributedatefield')
+
+ # Deleting model 'AttributeDateTimeField'
+ db.delete_table('gstudio_attributedatetimefield')
+
+ # Deleting model 'AttributeTimeField'
+ db.delete_table('gstudio_attributetimefield')
+
+ # Deleting model 'AttributeEmailField'
+ db.delete_table('gstudio_attributeemailfield')
+
+ # Deleting model 'AttributeFileField'
+ db.delete_table('gstudio_attributefilefield')
+
+ # Deleting model 'AttributeFilePathField'
+ db.delete_table('gstudio_attributefilepathfield')
+
+ # Deleting model 'AttributeImageField'
+ db.delete_table('gstudio_attributeimagefield')
+
+ # Deleting model 'AttributeURLField'
+ db.delete_table('gstudio_attributeurlfield')
+
+ # Deleting model 'AttributeIPAddressField'
+ db.delete_table('gstudio_attributeipaddressfield')
+
+ # Deleting model 'Processtype'
+ db.delete_table('gstudio_processtype')
+
+ # Removing M2M table for field changing_attributetype_set on 'Processtype'
+ db.delete_table('gstudio_processtype_changing_attributetype_set')
+
+ # Removing M2M table for field changing_relationtype_set on 'Processtype'
+ db.delete_table('gstudio_processtype_changing_relationtype_set')
+
+ # Deleting model 'Systemtype'
+ db.delete_table('gstudio_systemtype')
+
+ # Removing M2M table for field nodetype_set on 'Systemtype'
+ db.delete_table('gstudio_systemtype_nodetype_set')
+
+ # Removing M2M table for field relationtype_set on 'Systemtype'
+ db.delete_table('gstudio_systemtype_relationtype_set')
+
+ # Removing M2M table for field attributetype_set on 'Systemtype'
+ db.delete_table('gstudio_systemtype_attributetype_set')
+
+ # Removing M2M table for field metatype_set on 'Systemtype'
+ db.delete_table('gstudio_systemtype_metatype_set')
+
+ # Removing M2M table for field processtype_set on 'Systemtype'
+ db.delete_table('gstudio_systemtype_processtype_set')
+
+ # Deleting model 'AttributeSpecification'
+ db.delete_table('gstudio_attributespecification')
+
+ # Removing M2M table for field subjects on 'AttributeSpecification'
+ db.delete_table('gstudio_attributespecification_subjects')
+
+ # Deleting model 'RelationSpecification'
+ db.delete_table('gstudio_relationspecification')
+
+ # Removing M2M table for field subjects on 'RelationSpecification'
+ db.delete_table('gstudio_relationspecification_subjects')
+
+ # Deleting model 'NodeSpecification'
+ db.delete_table('gstudio_nodespecification')
+
+ # Removing M2M table for field relations on 'NodeSpecification'
+ db.delete_table('gstudio_nodespecification_relations')
+
+ # Removing M2M table for field attributes on 'NodeSpecification'
+ db.delete_table('gstudio_nodespecification_attributes')
+
+ # Deleting model 'Union'
+ db.delete_table('gstudio_union')
+
+ # Removing M2M table for field nodetypes on 'Union'
+ db.delete_table('gstudio_union_nodetypes')
+
+ # Deleting model 'Complement'
+ db.delete_table('gstudio_complement')
+
+ # Removing M2M table for field nodetypes on 'Complement'
+ db.delete_table('gstudio_complement_nodetypes')
+
+ # Deleting model 'Intersection'
+ db.delete_table('gstudio_intersection')
+
+ # Removing M2M table for field nodetypes on 'Intersection'
+ db.delete_table('gstudio_intersection_nodetypes')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'gstudio.attribute': {
+ 'Meta': {'unique_together': "(('subject_scope', 'subject', 'attributetype_scope', 'attributetype', 'value_scope', 'svalue'),)", 'object_name': 'Attribute', '_ormbases': ['gstudio.Edge']},
+ 'attributetype': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gstudio.Attributetype']"}),
+ 'attributetype_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'edge_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Edge']", 'unique': 'True', 'primary_key': 'True'}),
+ 'subject': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subject_of'", 'to': "orm['gstudio.NID']"}),
+ 'subject_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'svalue': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'value_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'})
+ },
+ 'gstudio.attributebigintegerfield': {
+ 'Meta': {'object_name': 'AttributeBigIntegerField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.BigIntegerField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributebooleanfield': {
+ 'Meta': {'object_name': 'AttributeBooleanField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'gstudio.attributecharfield': {
+ 'Meta': {'object_name': 'AttributeCharField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributecommaseparatedintegerfield': {
+ 'Meta': {'object_name': 'AttributeCommaSeparatedIntegerField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.CommaSeparatedIntegerField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributedatefield': {
+ 'Meta': {'object_name': 'AttributeDateField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.DateField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributedatetimefield': {
+ 'Meta': {'object_name': 'AttributeDateTimeField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.DateTimeField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributedecimalfield': {
+ 'Meta': {'object_name': 'AttributeDecimalField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '3', 'decimal_places': '2'})
+ },
+ 'gstudio.attributeemailfield': {
+ 'Meta': {'object_name': 'AttributeEmailField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributefilefield': {
+ 'Meta': {'object_name': 'AttributeFileField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.files.FileField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributefilepathfield': {
+ 'Meta': {'object_name': 'AttributeFilePathField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.FilePathField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributefloatfield': {
+ 'Meta': {'object_name': 'AttributeFloatField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.FloatField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributeimagefield': {
+ 'Meta': {'object_name': 'AttributeImageField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributeintegerfield': {
+ 'Meta': {'object_name': 'AttributeIntegerField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.IntegerField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributeipaddressfield': {
+ 'Meta': {'object_name': 'AttributeIPAddressField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'})
+ },
+ 'gstudio.attributenullbooleanfield': {
+ 'Meta': {'object_name': 'AttributeNullBooleanField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'gstudio.attributepositiveintegerfield': {
+ 'Meta': {'object_name': 'AttributePositiveIntegerField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributespecification': {
+ 'Meta': {'object_name': 'AttributeSpecification', '_ormbases': ['gstudio.Node']},
+ 'attributetype': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gstudio.Attributetype']"}),
+ 'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Node']", 'unique': 'True', 'primary_key': 'True'}),
+ 'subjects': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'subjects_attrspec_of'", 'symmetrical': 'False', 'to': "orm['gstudio.NID']"})
+ },
+ 'gstudio.attributetextfield': {
+ 'Meta': {'object_name': 'AttributeTextField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.TextField', [], {})
+ },
+ 'gstudio.attributetimefield': {
+ 'Meta': {'object_name': 'AttributeTimeField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.TimeField', [], {'max_length': '100'})
+ },
+ 'gstudio.attributetype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Attributetype', '_ormbases': ['gstudio.Nodetype']},
+ 'applicable_nodetypes': ('django.db.models.fields.CharField', [], {'default': "'OT'", 'max_length': '2'}),
+ 'auto_now': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'auto_now_add': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'blank': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'dataType': ('django.db.models.fields.CharField', [], {'default': "'01'", 'max_length': '2'}),
+ 'decimal_places': ('django.db.models.fields.IntegerField', [], {'max_length': '2', 'null': 'True', 'blank': 'True'}),
+ 'default': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'editable': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'help_text': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'max_digits': ('django.db.models.fields.IntegerField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}),
+ 'min_length': ('django.db.models.fields.IntegerField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
+ 'nodetype_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Nodetype']", 'unique': 'True', 'primary_key': 'True'}),
+ 'null': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'path': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'required': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'subjecttype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subjecttype_of'", 'to': "orm['gstudio.NID']"}),
+ 'unique': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'upload_to': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'validators': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'validators_rel_+'", 'null': 'True', 'to': "orm['gstudio.Attributetype']"}),
+ 'verbose_name': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'verify_exists': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'gstudio.attributeurlfield': {
+ 'Meta': {'object_name': 'AttributeURLField', '_ormbases': ['gstudio.Attribute']},
+ 'attribute_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Attribute']", 'unique': 'True', 'primary_key': 'True'}),
+ 'value': ('django.db.models.fields.URLField', [], {'max_length': '100'})
+ },
+ 'gstudio.complement': {
+ 'Meta': {'object_name': 'Complement', '_ormbases': ['gstudio.Node']},
+ 'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Node']", 'unique': 'True', 'primary_key': 'True'}),
+ 'nodetypes': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'complement_of'", 'symmetrical': 'False', 'to': "orm['gstudio.Nodetype']"})
+ },
+ 'gstudio.edge': {
+ 'Meta': {'object_name': 'Edge', '_ormbases': ['gstudio.NID']},
+ 'nid_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.NID']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ 'gstudio.intersection': {
+ 'Meta': {'object_name': 'Intersection', '_ormbases': ['gstudio.Node']},
+ 'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Node']", 'unique': 'True', 'primary_key': 'True'}),
+ 'nodetypes': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'intersection_of'", 'symmetrical': 'False', 'to': "orm['gstudio.Nodetype']"})
+ },
+ 'gstudio.metatype': {
+ 'Meta': {'ordering': "['title']", 'object_name': 'Metatype', '_ormbases': ['gstudio.Node']},
+ 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Node']", 'unique': 'True', 'primary_key': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['gstudio.Metatype']"}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'gstudio.nid': {
+ 'Meta': {'object_name': 'NID'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ },
+ 'gstudio.node': {
+ 'Meta': {'object_name': 'Node', '_ormbases': ['gstudio.NID']},
+ 'altnames': ('tagging.fields.TagField', [], {'null': 'True'}),
+ 'nid_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.NID']", 'unique': 'True', 'primary_key': 'True'}),
+ 'plural': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'rating_score': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+ 'rating_votes': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'})
+ },
+ 'gstudio.nodespecification': {
+ 'Meta': {'object_name': 'NodeSpecification', '_ormbases': ['gstudio.Node']},
+ 'attributes': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'attributes_in_nodespec'", 'symmetrical': 'False', 'to': "orm['gstudio.Attribute']"}),
+ 'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Node']", 'unique': 'True', 'primary_key': 'True'}),
+ 'relations': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'relations_in_nodespec'", 'symmetrical': 'False', 'to': "orm['gstudio.Relation']"}),
+ 'subject': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subject_nodespec'", 'to': "orm['gstudio.Node']"})
+ },
+ 'gstudio.nodetype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Nodetype', '_ormbases': ['gstudio.Node']},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'nodetypes'", 'blank': 'True', 'to': "orm['auth.User']"}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'login_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'metatypes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'member_types'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Metatype']"}),
+ 'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Node']", 'unique': 'True', 'primary_key': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'pingback_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'posterior_nodes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'posterior_nodes_rel_+'", 'null': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'prior_nodes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'prior_nodes_rel_+'", 'null': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'nodetypes'", 'symmetrical': 'False', 'to': "orm['sites.Site']"}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'template': ('django.db.models.fields.CharField', [], {'default': "'gstudio/nodetype_detail.html'", 'max_length': '250'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'gstudio.objecttype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Objecttype', '_ormbases': ['gstudio.Nodetype']},
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'nodetype_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Nodetype']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ 'gstudio.processtype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Processtype', '_ormbases': ['gstudio.Nodetype']},
+ 'changing_attributetype_set': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "' changing_attributetype_set_of'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Attributetype']"}),
+ 'changing_relationtype_set': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'changing_relationtype_set_of'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Relationtype']"}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'nodetype_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Nodetype']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ 'gstudio.relation': {
+ 'Meta': {'unique_together': "(('left_subject_scope', 'left_subject', 'relationtype_scope', 'relationtype', 'right_subject_scope', 'right_subject'),)", 'object_name': 'Relation', '_ormbases': ['gstudio.Edge']},
+ 'edge_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Edge']", 'unique': 'True', 'primary_key': 'True'}),
+ 'left_subject': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'left_subject_of'", 'to': "orm['gstudio.NID']"}),
+ 'left_subject_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'relationtype': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gstudio.Relationtype']"}),
+ 'relationtype_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'right_subject': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'right_subject_of'", 'to': "orm['gstudio.NID']"}),
+ 'right_subject_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'})
+ },
+ 'gstudio.relationspecification': {
+ 'Meta': {'object_name': 'RelationSpecification', '_ormbases': ['gstudio.Node']},
+ 'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Node']", 'unique': 'True', 'primary_key': 'True'}),
+ 'relationtype': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gstudio.Relationtype']"}),
+ 'subjects': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'subjects_in_relspec'", 'symmetrical': 'False', 'to': "orm['gstudio.NID']"})
+ },
+ 'gstudio.relationtype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Relationtype', '_ormbases': ['gstudio.Nodetype']},
+ 'inverse': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'is_reflexive': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'is_symmetrical': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'is_transitive': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'left_applicable_nodetypes': ('django.db.models.fields.CharField', [], {'default': "'OT'", 'max_length': '2'}),
+ 'left_cardinality': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'left_subjecttype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'left_subjecttype_of'", 'to': "orm['gstudio.NID']"}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'nodetype_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Nodetype']", 'unique': 'True', 'primary_key': 'True'}),
+ 'right_applicable_nodetypes': ('django.db.models.fields.CharField', [], {'default': "'OT'", 'max_length': '2'}),
+ 'right_cardinality': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'right_subjecttype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'right_subjecttype_of'", 'to': "orm['gstudio.NID']"})
+ },
+ 'gstudio.systemtype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Systemtype', '_ormbases': ['gstudio.Nodetype']},
+ 'attributetype_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'attributetype_set_of'", 'blank': 'True', 'to': "orm['gstudio.Attributetype']"}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'metatype_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'metatype_set_of'", 'blank': 'True', 'to': "orm['gstudio.Metatype']"}),
+ 'nodetype_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Nodetype']", 'unique': 'True', 'primary_key': 'True'}),
+ 'nodetype_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'nodetype_set_of'", 'blank': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'processtype_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'processtype_set_of'", 'blank': 'True', 'to': "orm['gstudio.Processtype']"}),
+ 'relationtype_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'relationtype_set_of'", 'blank': 'True', 'to': "orm['gstudio.Relationtype']"})
+ },
+ 'gstudio.union': {
+ 'Meta': {'object_name': 'Union', '_ormbases': ['gstudio.Node']},
+ 'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Node']", 'unique': 'True', 'primary_key': 'True'}),
+ 'nodetypes': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'union_of'", 'symmetrical': 'False', 'to': "orm['gstudio.Nodetype']"})
+ },
+ 'sites.site': {
+ 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ }
+ }
+
+ complete_apps = ['gstudio']
diff --git a/build/lib.linux-i686-2.6/gstudio/migrations/__init__.py b/build/lib.linux-i686-2.6/gstudio/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/migrations/__init__.py
diff --git a/build/lib.linux-i686-2.6/gstudio/models.py b/build/lib.linux-i686-2.6/gstudio/models.py
new file mode 100644
index 0000000..2ca4b55
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/models.py
@@ -0,0 +1,1905 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
+"""Super models of Gstudio """
+import warnings
+from datetime import datetime
+from django.db import models
+from django.db.models import Q
+from django.utils.html import strip_tags
+from django.utils.html import linebreaks
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.db.models.signals import post_save
+from django.utils.importlib import import_module
+from django.contrib import comments
+from django.contrib.comments.models import CommentFlag
+from django.contrib.comments.moderation import moderator
+from django.utils.translation import ugettext_lazy as _
+from django.contrib.markup.templatetags.markup import markdown
+from django.contrib.markup.templatetags.markup import textile
+from django.contrib.markup.templatetags.markup import restructuredtext
+import mptt
+
+from djangoratings.fields import RatingField
+from tagging.fields import TagField
+from gstudio.settings import UPLOAD_TO
+from gstudio.settings import MARKUP_LANGUAGE
+from gstudio.settings import NODETYPE_TEMPLATES
+from gstudio.settings import NODETYPE_BASE_MODEL
+from gstudio.settings import MARKDOWN_EXTENSIONS
+from gstudio.settings import AUTO_CLOSE_COMMENTS_AFTER
+from gstudio.managers import nodetypes_published
+from gstudio.managers import NodetypePublishedManager
+from gstudio.managers import AuthorPublishedManager
+from gstudio.managers import DRAFT, HIDDEN, PUBLISHED
+from gstudio.moderator import NodetypeCommentModerator
+from gstudio.url_shortener import get_url_shortener
+from gstudio.signals import ping_directories_handler
+from gstudio.signals import ping_external_urls_handler
+import json
+import reversion
+from reversion.models import Version
+from django.core import serializers
+
+NODETYPE_CHOICES = (
+ ('ND', 'Nodes'),
+ ( 'OB' ,'Objects'),
+ ('ED', 'Edges'),
+ ('NT', 'Node types'),
+ ('ET', 'Edge types'),
+ ('OT', 'Object types'),
+ ('RT', 'Relation types'),
+ ('MT', 'Metatypes'),
+ ('AT', 'Attribute types'),
+ ('RN', 'Relations'),
+ ('AS', 'Attributes'),
+ ('ST', 'System type'),
+ ('SY', 'System'),
+ ('NS', 'Node specification'),
+ ('AS', 'Attribute specification'),
+ ('RS', 'Relation specification'),
+ ('IN', 'Intersection'),
+ ('CP', 'Complement'),
+ ('UN', 'Union'),
+ )
+
+DEPTYPE_CHOICES = (
+ ('0', 'Concept-Concept'),
+ ('1', 'Activity-Activity'),
+ ('2', 'Question-Question'),
+ ('3', 'Concept-Activity'),
+ ('4', 'Activity-Concept'),
+ ('5', 'Question-Concept'),
+ ('6', 'Concept-Question'),
+ ('7', 'Question-Activity'),
+ ('8', 'Activity-Question'),
+ )
+
+FIELD_TYPE_CHOICES = (
+ ('1', 'CharField'),
+ ('2', 'TextField'),
+ ('3', 'IntegerField'),
+ ('4', 'CommaSeparatedIntegerField'),
+ ('5', 'BigIntegerField'),
+ ('6', 'PositiveIntegerField'),
+ ('7', 'DecimalField'),
+ ('8', 'FloatField'),
+ ('9', 'BooleanField'),
+ ('10', 'NullBooleanField'),
+ ('11', 'DateField'),
+ ('12', 'DateTimeField'),
+ ('13', 'TimeField'),
+ ('14', 'EmailField'),
+ ('15', 'FileField'),
+ ('16', 'FilePathField'),
+ ('17', 'ImageField'),
+ ('18', 'URLField'),
+ ('19', 'IPAddressField'),
+ )
+
+
+STATUS_CHOICES = ((DRAFT, _('draft')),
+ (HIDDEN, _('hidden')),
+ (PUBLISHED, _('published')))
+
+class Author(User):
+ """Proxy Model around User"""
+
+ objects = models.Manager()
+ published = AuthorPublishedManager()
+
+ def nodetypes_published(self):
+ """Return only the nodetypes published"""
+ return nodetypes_published(self.nodetypes)
+
+ @property
+ def title(self):
+ return self.username
+
+ @models.permalink
+ def get_absolute_url(self):
+ """Return author's URL"""
+ #return "/authors/%s/" %(self.username)
+ return ('gstudio_author_detail', (self.username,))
+
+ class Meta:
+ """Author's Meta"""
+ proxy = True
+
+class NID(models.Model):
+ """the set of all nodes. provides node ID (NID) to all nodes in
+ the network, including edges. Edges are also first class citizens
+ in the gnowledge base. """
+
+ title = models.CharField(_('title'), help_text=_('give a name to the node'), max_length=255)
+ last_update = models.DateTimeField(_('last update'), default=datetime.now)
+ creation_date = models.DateTimeField(_('creation date'),
+ default=datetime.now)
+
+ slug = models.SlugField(help_text=_('used for publication'),
+ unique_for_date='creation_date',
+ max_length=255)
+
+
+ def get_serialized_dict(self):
+ """
+ return the fields in a serialized form of the current object using the __dict__ function.
+ """
+ return self.__dict__
+
+ @models.permalink
+ def get_absolute_url(self):
+ """Return nodetype's URL"""
+
+ return ('gstudio_nodetype_detail', (), {
+ 'year': self.creation_date.strftime('%Y'),
+ 'month': self.creation_date.strftime('%m'),
+ 'day': self.creation_date.strftime('%d'),
+ 'slug': self.slug})
+
+ @property
+ def ref(self):
+ """
+ Returns the object reference the id belongs to.
+ """
+ try:
+ """
+ ALGO: get object id, go to version model, return for the given id.
+ """
+
+ # Retrieving only the relevant tupleset for the versioned objects
+ vrs = Version.objects.filter(type=0 , object_id=self.id)
+ # Returned value is a list, so splice it.
+ vrs = vrs[0]
+ except:
+ return None
+
+ return vrs.object
+
+ @property
+ def get_edit_url(self):
+ return "/admin/" + self._meta.app_label + "/" + self._meta.module_name + "/" + str(self.id)
+
+
+
+ def get_serialized_data(self):
+ """
+ return the fields in a serialized form of the current object.
+ get object id, go to version model, return serialized_data for the given id
+ """
+ from reversion.models import Version
+ version = Version.objects.get(id=self.id)
+ return version.serialized_data
+
+ def __unicode__(self):
+ return self.title
+
+
+ class Meta:
+ """NID's Meta"""
+
+
+
+class Node(NID):
+ """
+ Super class
+ """
+
+ altnames = TagField(_('alternate names'), help_text=_('alternate names if any'), blank=True, null=True)
+ plural = models.CharField(_('plural name'), help_text=_('plural form of the node name if any'), max_length=255, blank=True, null=True)
+ rating = RatingField(range=5, can_change_vote = True, help_text=_('your rating'), blank=True, null=True)
+
+ def __unicode__(self):
+ return self.title
+
+ class Meta:
+ abstract=False
+
+class Edge(NID):
+
+
+ def __unicode__(self):
+ return self.title
+
+ class Meta:
+ abstract=False
+
+
+class Metatype(Node):
+ """
+ Metatype object for Nodetype
+ """
+
+
+ description = models.TextField(_('description'), blank=True, null=True)
+ parent = models.ForeignKey('self', null=True, blank=True, verbose_name=_('parent metatype'), related_name='children')
+
+
+ def nodetypes_published(self):
+ """
+ Return only the published nodetypes
+ """
+ return nodetypes_published(self.member_types)
+
+ @property
+ def get_nbh(self):
+ """
+ Returns the neighbourhood of the metatype
+ """
+ nbh = {}
+ nbh['title'] = self.title
+ nbh['altnames'] = self.altnames
+ nbh['plural'] = self.plural
+
+ if self.parent:
+ nbh['typeof'] = self.parent
+ # generate ids and names of children/members
+ nbh['contains_subtypes'] = self.children.get_query_set()
+ nbh['contains_members'] = self.nodetypes.all()
+ nbh['left_subjecttype_of'] = Relationtype.objects.filter(left_subjecttype=self.id)
+ nbh['right_subjecttype_of'] = Relationtype.objects.filter(right_subjecttype=self.id)
+ nbh['attributetypes'] = Attributetype.objects.filter(subjecttype=self.id)
+
+ return nbh
+
+
+ @property
+ def get_possible_attributetypes(self):
+ """
+ Gets the relations possible for this metatype
+ 1. Recursively create a set of all the ancestors i.e. parent/subtypes of the MT.
+ 2. Get all the AT's linked to each ancestor
+ """
+ #Step 1.
+ ancestor_list = []
+ this_parent = self.parent
+
+ # recursive thru parent field and append
+ while this_parent:
+ ancestor_list.append(this_parent)
+ this_parent = this_parent.parent
+
+ #Step 2.
+ attrtypes = []
+
+ for each in ancestor_list:
+ # retrieve all the AT's from each ancestor
+ attrtypes.extend(Attributetype.objects.filter(subjecttype=each.id))
+
+ return attrtypes
+
+
+ @property
+ def get_possible_rels(self):
+ """
+ Gets the relations possible for this metatype
+ 1. Recursively create a set of all the ancestors i.e. parent/subtypes of the MT.
+ 2. Get all the R's linked to each ancestor
+ """
+ #Step 1.
+ ancestor_list = []
+ this_parent = self.parent
+
+ # append
+ while this_parent:
+ ancestor_list.append(this_parent)
+ this_parent = this_parent.parent
+
+ #Step 2.
+ rels = {}
+ rt_set = Relation.objects.all()
+ right_subset = []
+ left_subset = []
+
+ for each in ancestor_list:
+ # retrieve all the RT's from each ancestor
+ right_subset.extend(rt_set.filter(subject1=each.id))
+ left_subset.extend(rt_set.filter(subject2=each.id))
+
+ rels['possible_leftroles'] = left_subset
+ rels['possible_rightroles'] = right_subset
+
+ return rels
+
+
+
+ @property
+ def get_possible_attributes(self):
+ """
+ Gets the relations possible for this metatype
+ 1. Recursively create a set of all the ancestors i.e. parent/subtypes of the MT.
+ 2. Get all the RT's linked to each ancestor
+ """
+ #Step 1.
+ ancestor_list = []
+ this_parent = self.parent
+
+ # recursive thru parent field and append
+ while this_parent:
+ ancestor_list.append(this_parent)
+ this_parent = this_parent.parent
+
+ #Step 2.
+ attrs = []
+
+ for each in ancestor_list:
+ # retrieve all the AT's from each ancestor
+ attrs.extend(Attribute.objects.filter(subject=each.id))
+
+ return attrs
+
+ @property
+ def get_rendered_nbh(self):
+ """
+ Returns the neighbourhood of the metatype
+ """
+ nbh = {}
+ nbh['title'] = self.title
+ nbh['altnames'] = self.altnames
+ nbh['plural'] = self.plural
+
+ if self.parent:
+ nbh['typeof'] = self.parent
+ # generate ids and names of children
+ nbh['contains_subtypes'] = self.children.get_query_set()
+ contains_members_list = []
+ for each in self.nodetypes.all():
+ contains_members_list.append('<a href="%s">%s</a>' % (each.get_absolute_url(), each.title))
+ nbh['contains_members'] = contains_members_list
+ nbh['left_subjecttype_of'] = Relationtype.objects.filter(left_subjecttype=self.id)
+ nbh['right_subjecttype_of'] = Relationtype.objects.filter(right_subjecttype=self.id)
+ nbh['attributetypes'] = Attributetype.objects.filter(subjecttype=self.id)
+
+
+ return nbh
+
+
+ @property
+ def tree_path(self):
+ """Return metatype's tree path, by its ancestors"""
+ if self.parent:
+ return '%s/%s' % (self.parent.tree_path, self.slug)
+ return self.slug
+
+ def __unicode__(self):
+ return self.title
+
+ @property
+ def composed_sentence(self):
+ "composes the relation as a sentence in triple format."
+ if self.parent:
+ return '%s is a kind of %s' % (self.title, self.parent.tree_path)
+ return '%s is a root node' % (self.slug)
+
+
+ @models.permalink
+ def get_absolute_url(self):
+ """Return metatype's URL"""
+ return ('gstudio_metatype_detail', (self.tree_path,))
+
+
+ class Meta:
+ """Metatype's Meta"""
+ ordering = ['title']
+ verbose_name = _('metatype')
+ verbose_name_plural = _('metatypes')
+
+
+
+
+
+class Nodetype(Node):
+ """
+ Model design for publishing nodetypes. Other nodetypes inherit this class.
+ """
+
+
+
+ STATUS_CHOICES = ((DRAFT, _('draft')),
+ (HIDDEN, _('hidden')),
+ (PUBLISHED, _('published')))
+
+ content = models.TextField(_('content'), null=True, blank=True)
+ content_org = models.TextField(_('content'), null=True, blank=True)
+ parent = models.ForeignKey('self', null=True, blank=True,
+ verbose_name=_('is a kind of'),
+ related_name='children')
+
+ prior_nodes = models.ManyToManyField('self', null=True, blank=True,
+ verbose_name=_('its meaning depends on '),
+ related_name='posterior_nodes')
+ posterior_nodes = models.ManyToManyField('self', null=True, blank=True,
+ verbose_name=_('required for the meaning of '),
+ related_name='prior_nodes')
+
+ image = models.ImageField(_('image'), upload_to=UPLOAD_TO,
+ blank=True, help_text=_('used for illustration'))
+
+ excerpt = models.TextField(_('excerpt'), blank=True,
+ help_text=_('optional element'))
+
+ tags = TagField(_('tags'))
+ metatypes = models.ManyToManyField(Metatype, verbose_name=_('member of metatypes'),
+ related_name='member_types',
+ blank=True, null=True)
+
+
+
+ authors = models.ManyToManyField(User, verbose_name=_('authors'),
+ related_name='nodetypes',
+ blank=True, null=False)
+
+ status = models.IntegerField(choices=STATUS_CHOICES, default=PUBLISHED)
+
+ featured = models.BooleanField(_('featured'), default=False)
+ comment_enabled = models.BooleanField(_('comment enabled'), default=True)
+ pingback_enabled = models.BooleanField(_('linkback enabled'), default=True)
+
+
+
+ start_publication = models.DateTimeField(_('start publication'),
+ help_text=_('date start publish'),
+ default=datetime.now)
+ end_publication = models.DateTimeField(_('end publication'),
+ help_text=_('date end publish'),
+ default=datetime(2042, 3, 15))
+
+ sites = models.ManyToManyField(Site, verbose_name=_('sites publication'),
+ related_name='nodetypes')
+
+ login_required = models.BooleanField(
+ _('login required'), default=False,
+ help_text=_('only authenticated users can view the nodetype'))
+ password = models.CharField(
+ _('password'), max_length=50, blank=True,
+ help_text=_('protect the nodetype with a password'))
+
+ template = models.CharField(
+ _('template'), max_length=250,
+ default='gstudio/nodetype_detail.html',
+ choices=[('gstudio/nodetype_detail.html', _('Default template'))] + \
+ NODETYPE_TEMPLATES,
+ help_text=_('template used to display the nodetype'))
+ rurl=models.URLField(_('rurl'),verify_exists=True,null=True, blank=True)
+ objects = models.Manager()
+ published = NodetypePublishedManager()
+
+
+ def get_possible_reltypes(self):
+ """
+ Gets the relations possible for this metatype
+ 1. Recursively create a set of all the ancestors i.e. parent/subtypes of the MT.
+ 2. Get all the RT's linked to each ancestor
+ """
+ #Step 1.
+ ancestor_list = []
+ this_parent = self.parent
+
+ # append
+ while this_parent:
+ ancestor_list.append(this_parent)
+ this_parent = this_parent.parent
+
+ #Step 2.
+ reltypes = {}
+ rt_set = Relationtype.objects.all()
+ right_subset = []
+ left_subset = []
+
+ for each in ancestor_list:
+ # retrieve all the RT's from each ancestor
+ right_subset.extend(rt_set.filter(subjecttypeLeft=each.id))
+ left_subset.extend(rt_set.filter(subjecttypeRight=each.id))
+
+ reltypes['possible_leftroles'] = left_subset
+ reltypes['possible_rightroles'] = right_subset
+
+ return reltypes
+
+
+ @property
+ def get_possible_attributetypes(self):
+ """
+ Gets the relations possible for this metatype
+ 1. Recursively create a set of all the ancestors i.e. parent/subtypes of the MT.
+ 2. Get all the AT's linked to each ancestor
+ """
+ #Step 1.
+ ancestor_list = []
+ this_parent = self.parent
+
+ # recursive thru parent field and append
+ while this_parent:
+ ancestor_list.append(this_parent)
+ this_parent = this_parent.parent
+
+ #Step 2.
+ attrtypes = []
+
+ for each in ancestor_list:
+ # retrieve all the AT's from each ancestor
+ attrtypes.extend(Attributetype.objects.filter(subjecttype=each.id))
+
+ return attrtypes
+
+
+ @property
+ def get_possible_rels(self):
+ """
+ Gets the relations possible for this metatype
+ 1. Recursively create a set of all the ancestors i.e. parent/subtypes of the MT.
+ 2. Get all the R's linked to each ancestor
+ """
+ #Step 1.
+ ancestor_list = []
+ this_parent = self.parent
+
+ # append
+ while this_parent:
+ ancestor_list.append(this_parent)
+ this_parent = this_parent.parent
+
+ #Step 2.
+ rels = {}
+ rt_set = Relation.objects.all()
+ right_subset = []
+ left_subset = []
+
+ for each in ancestor_list:
+ # retrieve all the RT's from each ancestor
+ right_subset.extend(rt_set.filter(subject1=each.id))
+ left_subset.extend(rt_set.filter(subject2=each.id))
+
+ rels['possible_leftroles'] = left_subset
+ rels['possible_rightroles'] = right_subset
+
+ return rels
+
+
+
+ @property
+ def get_possible_attributes(self):
+ """
+ Gets the relations possible for this metatype
+ 1. Recursively create a set of all the ancestors i.e. parent/subtypes of the MT.
+ 2. Get all the RT's linked to each ancestor
+ """
+ #Step 1.
+ ancestor_list = []
+ this_parent = self.parent
+
+ # recursive thru parent field and append
+ while this_parent:
+ ancestor_list.append(this_parent)
+ this_parent = this_parent.parent
+
+ #Step 2.
+ attrs = []
+
+ for each in ancestor_list:
+ # retrieve all the AT's from each ancestor
+ attrs.extend(Attribute.objects.filter(subject=each.id))
+
+ return attrs
+
+ def get_graph_json(self):
+
+
+ # predicate_id={"plural":"a1","altnames":"a2","contains_members":"a3","contains_subtypes":"a4","prior_nodes":"a5", "posterior_nodes":"a6"}
+ g_json = {}
+ g_json["node_metadata"]= []
+
+
+ nbh = self.get_nbh
+ predicate_id = {}
+ counter = 1
+ for key in nbh.keys():
+ val = "a" + str(counter)
+ predicate_id[key] = val
+ counter = counter + 1
+ #print predicate_id
+
+ attr_counter = -1
+
+ this_node = {"_id":str(self.id),"title":self.title,"screen_name":self.title, "url":self.get_absolute_url()}
+ g_json["node_metadata"].append(this_node)
+
+ for key in predicate_id.keys():
+ if nbh[key]:
+ try:
+ g_json[str(key)]=[]
+ g_json["node_metadata"].append({"_id":str(predicate_id[key]),"screen_name":key})
+ g_json[str(key)].append({"from":self.id , "to":predicate_id[key],"value":1, "level":1 })
+ if not isinstance(nbh[key],basestring):
+ for item in nbh[key]:
+ # user
+ g_json["node_metadata"].append({"_id":str(item.id),"screen_name":item.title, "title":item.title, "url":item.get_absolute_url()})
+ g_json[str(key)].append({"from":predicate_id[key] , "to":item.id ,"value":1 })
+
+ else:
+ #value={nbh["plural"]:"a4",nbh["altnames"]:"a5"}
+ #this_node[str(key)]=nbh[key] key, nbh[key]
+ #for item in value.keys():
+ g_json["node_metadata"].append({"_id":attr_counter,"screen_name":nbh[key]})
+ g_json[str(key)].append({"from":predicate_id[key] , "to":attr_counter ,"value":1, "level":2 })
+ attr_counter-=1
+
+ except:
+ pass
+ # print g_json
+ return json.dumps(g_json)
+
+
+ @property
+ def tree_path(self):
+ """Return nodetype's tree path, by its ancestors"""
+ if self.parent:
+ return '%s/%s' % (self.parent.tree_path, self.slug)
+ return self.slug
+
+ @property
+ def tree_path_sentence(self):
+ """ Return the parent of the nodetype in a triple form """
+ if self.parent:
+ return '%s is a kind of %s' % (self.title, self.parent.tree_path)
+ return '%s is a root node' % (self.title)
+
+
+ @property
+ def html_content(self):
+ """Return the content correctly formatted"""
+ if MARKUP_LANGUAGE == 'markdown':
+ return markdown(self.content, MARKDOWN_EXTENSIONS)
+ elif MARKUP_LANGUAGE == 'textile':
+ return textile(self.content)
+ elif MARKUP_LANGUAGE == 'restructuredtext':
+ return restructuredtext(self.content)
+ elif not '</p>' in self.content:
+ return linebreaks(self.content)
+ return self.content
+ @property
+ def get_relations(self):
+ """
+ Returns all the relations of the nodetype
+ """
+ relations={}
+
+ left_relations=Relation.objects.filter(left_subject=self.id)
+ if left_relations:
+ for each in left_relations:
+ relation=each.relationtype.title
+ predicate=each.right_subject
+ relations[relation]=predicate
+
+ right_relations=Relation.objects.filter(right_subject=self.id)
+ if right_relations:
+ for each in right_relations:
+ relation=each.relationtype.inverse
+ predicate=each.left_subject
+ relations[relation]=predicate
+ return relations
+
+ @property
+ def get_relations1(self):
+ """
+ Returns all the relations of the nodetype
+ """
+ relations={}
+ reltype={}
+ left_relations=Relation.objects.filter(left_subject=self.id)
+ if left_relations:
+ for each in left_relations:
+ relation=each.relationtype.title
+ predicate=each.right_subject
+ predicate_values=[]
+ if reltype:
+ fl=0
+ for key,value in reltype.items():
+ if type(value) <> list:
+ t=[]
+ t.append(value)
+ predicate_values=t
+ else:
+ predicate_values=value
+ if each.relationtype.title==key:
+ fl=1
+ predicate_values.append(predicate)
+ reltype[key]=predicate_values
+ if fl==0:
+ predicate_values=predicate
+ reltype[relation]=predicate_values
+ else:
+ predicate_values.append(predicate)
+ reltype[relation]=predicate_values
+ relations['lrelations']=reltype
+
+ right_relations=Relation.objects.filter(right_subject=self.id)
+ reltype={}
+ if right_relations:
+ for each in right_relations:
+ relation=each.relationtype.inverse
+ predicate=each.left_subject
+ predicate_values=[]
+ if reltype:
+ fl=0
+ for key,value in reltype.items():
+ if type(value) <> list:
+ t=[]
+ t.append(value)
+ prdicate_values=t
+ else:
+ predicate_values=value
+ if each.relationtype.inverse==key:
+ fl=1
+ predicate_values.append(predicate)
+ reltype[key]=predicate_values
+
+ if fl==0:
+ predicate_values=predicate
+ reltype[relation]=predicate_values
+
+ else:
+ predicate_values.append(predicate)
+ reltype[relation]=predicate_values
+ relations['rrelations']=reltype
+ return relations
+
+ @property
+ def get_attributes(self):
+ attributes_dict = {}
+ all_attributes=self.subject_of.all()
+ for attributes in all_attributes:
+ val=[]
+ atr_key=attributes.attributetype.title
+ val.append(attributes.svalue)
+
+ if attributes_dict:
+ fl=0
+ itms=attributes_dict
+
+ for key,value in itms.items():
+ if atr_key in key:
+ fl=1
+ if type(value) <> list:
+ t=[]
+ t.append(value)
+ val.extend(t)
+
+ else:
+ val.extend(value)
+ attributes_dict[atr_key]=val
+ return attributes_dict
+
+ @property
+ def get_rendered_nbh(self):
+ """
+ Returns the neighbourhood of the nodetype
+ """
+ nbh = {}
+ nbh['title'] = self.title
+ nbh['altnames'] = self.altnames
+ nbh['plural'] = self.plural
+ #get all MTs
+ member_of_dict = {}
+ for each in self.metatypes.all():
+ member_of_dict[each.title]= each.get_absolute_url()
+ nbh['member_of_metatypes']=member_of_dict
+ typeof={}
+ parent=self.parent
+ if parent:
+ typeof[parent] = parent.get_absolute_url()
+ nbh['type_of']=typeof
+ #get all subtypes
+ subtypes={}
+ for each in Nodetype.objects.filter(parent=self.id):
+ subtypes[each.title] =each.get_absolute_url()
+ nbh['contains_subtypes']=subtypes
+ # get all the objects inheriting this OT
+ contains_members_dict = {}
+ for each in self.member_objects.all():
+ contains_members_dict[each.title]= each.get_absolute_url()
+ nbh['contains_members'] = contains_members_dict
+ #get prior nodes
+ priornodes_dict = {}
+ for each in self.prior_nodes.all():
+ priornodes_dict[each.title]= each.get_absolute_url()
+ nbh['priornodes'] = priornodes_dict
+ #get posterior nodes
+ posteriornodes_dict = {}
+ for each in self.posterior_nodes.all():
+ posteriornodes_dict[each.title]= each.get_absolute_url()
+ nbh['posteriornodes'] = posteriornodes_dict
+ #get authors
+ author_dict = {}
+ for each in self.authors.all():
+ author_dict['User'] = each.get_absolute_url()
+ nbh['authors'] = author_dict
+ #get siblings
+ siblings={}
+ for each in self.get_siblings():
+ siblings[each.title]=each.get_absolute_url()
+ nbh['siblings']=siblings
+ #get Relations
+ relns={}
+ rellft={}
+ relrgt={}
+ if self.get_relations1:
+ NTrelns=self.get_relations1
+ for key,value in NTrelns.items():
+ if key=="rrelations":
+ relrgt={}
+ for rgtkey,rgtvalue in value.items():
+ relnvalue={}
+ if isinstance(rgtvalue,list):
+ for items in rgtvalue:
+ relnvalue[items]=items.get_absolute_url()
+ else:
+ relnvalue[rgtvalue]=rgtvalue.get_absolute_url()
+
+ relrgt[rgtkey]=relnvalue
+
+ else:
+ rellft={}
+ relns['left']=rellft
+ for lftkey,lftvalue in value.items():
+ relnvalue={}
+ if isinstance(lftvalue,list):
+ for items in lftvalue:
+ relnvalue[items]=items.get_absolute_url()
+ else:
+ relnvalue[lftvalue]=lftvalue.get_absolute_url()
+
+ rellft[lftkey]=relnvalue
+
+ nbh['relations']=relrgt
+ nbh['relations'].update(rellft)
+ #get Attributes
+ attributes =self.get_attributes
+ nbh['attributes']=attributes
+ #get ATs
+ attributetypes={}
+ for each in self.subjecttype_of.all():
+ attributetypes[each.title]=each.get_absolute_url()
+ nbh['ats']=attributetypes
+ #get RTs as leftroles and rightroles
+ leftroles = {}
+ for each in self.left_subjecttype_of.all():
+ leftroles[each.title]=each.get_absolute_url()
+ nbh['leftroles']=leftroles
+ rightroles = {}
+ for each in self.right_subjecttype_of.all():
+ rightroles[each.title]=each.get_absolute_url()
+ nbh['rightroles']=rightroles
+ return nbh
+
+
+ @property
+ def previous_nodetype(self):
+ """Return the previous nodetype"""
+ nodetypes = Nodetype.published.filter(
+ creation_date__lt=self.creation_date)[:1]
+ if nodetypes:
+ return nodetypes[0]
+
+ @property
+ def next_nodetype(self):
+ """Return the next nodetype"""
+ nodetypes = Nodetype.published.filter(
+ creation_date__gt=self.creation_date).order_by('creation_date')[:1]
+ if nodetypes:
+ return nodetypes[0]
+
+ @property
+ def word_count(self):
+ """Count the words of a nodetype"""
+ return len(strip_tags(self.html_content).split())
+
+ @property
+ def is_actual(self):
+ """Check if a nodetype is within publication period"""
+ now = datetime.now()
+ return now >= self.start_publication and now < self.end_publication
+
+ @property
+ def is_visible(self):
+ """Check if a nodetype is visible on site"""
+ return self.is_actual and self.status == PUBLISHED
+
+ @property
+ def related_published(self):
+ """Return only related nodetypes published"""
+ return nodetypes_published(self.related)
+
+ @property
+ def discussions(self):
+ """Return published discussions"""
+ return comments.get_model().objects.for_model(
+ self).filter(is_public=True)
+
+ @property
+ def comments(self):
+ """Return published comments"""
+ return self.discussions.filter(Q(flags=None) | Q(
+ flags__flag=CommentFlag.MODERATOR_APPROVAL))
+
+ @property
+ def pingbacks(self):
+ """Return published pingbacks"""
+ return self.discussions.filter(flags__flag='pingback')
+
+ @property
+ def trackbacks(self):
+ """Return published trackbacks"""
+ return self.discussions.filter(flags__flag='trackback')
+
+ @property
+ def comments_are_open(self):
+ """Check if comments are open"""
+ if AUTO_CLOSE_COMMENTS_AFTER and self.comment_enabled:
+ return (datetime.now() - self.start_publication).days < \
+ AUTO_CLOSE_COMMENTS_AFTER
+ return self.comment_enabled
+
+ @property
+ def short_url(self):
+ """Return the nodetype's short url"""
+ return get_url_shortener()(self)
+
+ def __unicode__(self):
+ return self.title
+
+ @property
+ def memberof_sentence(self):
+ """Return the metatype of which the nodetype is a member of"""
+
+ if self.metatypes.count:
+ for each in self.metatypes.all():
+ return '%s is a member of metatype %s' % (self.title, each)
+ return '%s is not a fully defined name, consider making it a member of a suitable metatype' % (self.title)
+
+
+ @property
+ def subtypeof_sentence(self):
+ "composes the relation as a sentence in triple format."
+ if self.parent:
+ return '%s is a subtype of %s' % (self.title, self.parent.tree_path)
+ return '%s is a root node' % (self.title)
+ composed_sentence = property(subtypeof_sentence)
+
+ def subtypeof(self):
+ "retuns the parent nodetype."
+ if self.parent:
+ return '%s' % (self.parent.tree_path)
+ return None
+
+ @models.permalink
+ def get_absolute_url(self):
+ """Return nodetype's URL"""
+ return ('gstudio_nodetype_detail', (), {
+ 'year': self.creation_date.strftime('%Y'),
+ 'month': self.creation_date.strftime('%m'),
+ 'day': self.creation_date.strftime('%d'),
+ 'slug': self.slug})
+
+ def get_serialized_data(self):
+ """
+ return the fields in a serialized form of the current object.
+ get object id, go to version model, return serialized_data for the given id
+ """
+ from reversion.models import Version
+ version = Version.objects.get(id=self.node_ptr_id)
+ return version.serialized_data
+
+ class Meta:
+ """Nodetype's Meta"""
+ ordering = ['-creation_date']
+ verbose_name = _('node type')
+ verbose_name_plural = _('node types')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+class Objecttype(Nodetype):
+ '''
+ Object class
+ '''
+
+ def __unicode__(self):
+ return self.title
+
+ #def get_graph_json(self):
+
+
+
+
+ @property
+ def get_attributetypes(self):
+ return self.subjecttype_of.all()
+
+ @property
+ def get_relationtypes(self):
+
+ left_relset = self.left_subjecttype_of.all()
+ right_relset = self.right_subjecttype_of.all()
+
+ reltypes = {}
+ reltypes['left_subjecttype_of']=left_relset
+ reltypes['right_subjecttype_of']=right_relset
+ return reltypes
+
+ @property
+ def get_left_subjecttypes(self):
+ """
+ for which relation types does this object become a domain of any relation type
+ """
+ reltypes = []
+ left_relset = self.left_subjecttype_of.all()
+ for relationtype in left_relset:
+ reltypes.append(relationtype)
+ return reltypes
+
+ @property
+ def get_rightroles(self):
+ """
+ for which relation types does this object become a domain of any relation type
+ """
+ reltypes = []
+ right_relset = self.right_subjecttype_of.all()
+ for relationtype in right_relset:
+ reltypes.append(relationtype)
+ return reltypes
+
+ @property
+ def get_subjecttypes(self):
+ """
+ for which relation types does this object become a domain of any relation type
+ """
+ subjecttypes = []
+ attrset = self.subjecttype_of.all()
+ for subjecttype in attrset:
+ subjecttypes.append(subjecttype)
+ return subjecttypes
+
+
+ @property
+ def member_of_metatypes(self):
+ """
+ returns if the objecttype is a member of the membership in a metatype class
+ """
+ types = []
+ if self.metatypes.all():
+ for metatype in self.metatypes.all():
+ types.append(metatype.title)
+ return types
+
+
+ @property
+ def get_members(self):
+ """
+ get members of the object type
+ """
+ members = []
+ if self.member_objects.all():
+ for gbobject in self.member_objects.all():
+ members.append(gbobject)
+ return members
+
+ @property
+ def get_nbh(self):
+ """
+ Returns the neighbourhood of the nodetype
+ """
+ nbh = {}
+ nbh['title'] = self.title
+ nbh['altnames'] = self.altnames
+ nbh['plural'] = self.plural
+ nbh['member_of_metatype'] = self.metatypes.all()
+ # get all the ATs for the objecttype
+ nbh['subjecttype_of']= self.subjecttype_of.all()
+ # get all the RTs for the objecttype
+ nbh.update(self.get_relationtypes)
+ if self.parent:
+ nbh['type_of'] = [self.parent]
+
+ nbh['contains_subtypes'] = Nodetype.objects.filter(parent=self.id)
+ # get all the objects inheriting this OT
+ nbh['contains_members'] = self.member_objects.all()
+
+ nbh['prior_nodes'] = self.prior_nodes.all()
+
+ nbh['posterior_nodes'] = self.posterior_nodes.all()
+
+ nbh['authors'] = self.authors.all()
+
+ return nbh
+
+ @property
+ def get_rendered_nbh(self):
+ """
+ Returns the neighbourhood of the nodetype with the hyperlinks of nodes rendered
+ """
+ nbh = {}
+ nbh['title'] = self.title
+ nbh['altnames'] = self.altnames
+ nbh['plural'] = self.plural
+ member_of_metatypes_list = []
+ for each in self.metatypes.all():
+ member_of_metatypes_list.append('<a href="%s">%s</a>' % (each.get_absolute_url(), each.title))
+ nbh['member_of_metatypes'] = member_of_metatypes_list
+
+
+ attributetypes_list = []
+ for each in self.get_attributetypes:
+ attributetypes_list.append('<a href="%s">%s</a>' % (each.get_absolute_url(), each.title))
+ nbh['attributetypes'] = attributetypes_list
+
+
+ # get all the RTs for the objecttype
+ reltypes_list = []
+ for each in self.get_relationtypes:
+ reltypes_list.append('<a href="%s">%s</a>' % (each.get_absolute_url(), each.title))
+ nbh['relationtypes'] = reltypes_list
+
+ nbh['type_of'] = self.parent
+
+ nbh['contains_subtypes'] = Nodetype.objects.filter(parent=self.id)
+ # get all the objects inheriting this OT
+ contains_members_list = []
+ for each in self.gbobjects.all():
+ contains_members_list.append('<a href="%s">%s</a>' % (each.get_absolute_url(), each.title))
+ nbh['contains_members'] = contains_members_list
+
+ prior_nodes_list = []
+ for each in self.prior_nodes.all():
+ prior_nodes_list.append('<a href="%s">%s</a>' % (each.get_absolute_url(), each.title))
+ nbh['prior_nodes'] = prior_nodes_list
+
+ posterior_nodes_list = []
+ for each in self.posterior_nodes.all():
+ posterior_nodes_list.append('<a href="%s">%s</a>' % (each.get_absolute_url(), each.title))
+ nbh['posterior_nodes'] = posterior_nodes_list
+
+ author_list = []
+ for each in self.authors.all():
+ author_list.append('<a href="%s"></a>' % (each.get_absolute_url()))
+ nbh['authors'] = author_list
+ return nbh
+
+
+
+ class Meta:
+ """
+ object type's meta class
+ """
+ verbose_name = _('object type')
+ verbose_name_plural = _('object types')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+
+
+class Relationtype(Nodetype):
+ '''
+ Properties with left and right subjects (Binary relations) are defined in this class.
+ '''
+ inverse = models.CharField(_('inverse name'), help_text=_('when subjecttypes are interchanged, what should be the name of the relation type? This is mandatory field. If the relation is symmetric, same name will do.'), max_length=255,db_index=True )
+ left_subjecttype = models.ForeignKey(NID,related_name="left_subjecttype_of", verbose_name='left role')
+ left_applicable_nodetypes = models.CharField(max_length=2,choices=NODETYPE_CHOICES,default='OT', verbose_name='Node types for left role')
+ left_cardinality = models.IntegerField(null=True, blank=True, verbose_name='cardinality for the left role')
+ right_subjecttype = models.ForeignKey(NID,related_name="right_subjecttype_of", verbose_name='right role')
+ right_applicable_nodetypes = models.CharField(max_length=2,choices=NODETYPE_CHOICES,default='OT', verbose_name='Node types for right role')
+ right_cardinality = models.IntegerField(null=True, blank=True, verbose_name='cardinality for the right role')
+ is_symmetrical = models.NullBooleanField(verbose_name='Is symmetrical?')
+ is_reflexive = models.NullBooleanField(verbose_name='Is reflexive?')
+ is_transitive = models.NullBooleanField(verbose_name='Is transitive?')
+
+
+ def get_serialized_data(self):
+ """
+ return the fields in a serialized form of the current object.
+ get object id, go to version model, return serialized_data for the given id
+ """
+ from reversion.models import Version
+ version = Version.objects.get(id=self.node_ptr_id)
+ return version.serialized_data
+
+
+ def __unicode__(self):
+ return self.title
+
+ class Meta:
+ """
+ relation type's meta class
+ """
+ verbose_name = _('relation type')
+ verbose_name_plural = _('relation types')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+class Attributetype(Nodetype):
+ '''
+ To define attributes of objects. First three fields are mandatory.
+ The rest of the fields may be required depending on what type of
+ field is selected for datatype.
+ '''
+ subjecttype = models.ForeignKey(NID, related_name="subjecttype_of", verbose_name='subject type name')
+ applicable_nodetypes = models.CharField(max_length=2,choices=NODETYPE_CHOICES,default='OT', verbose_name='applicable nodetypes')
+ dataType = models.CharField(max_length=2, choices=FIELD_TYPE_CHOICES,default='01', verbose_name='data type of value')
+
+ verbose_name = models.CharField(max_length=500, null=True, blank=True, verbose_name='verbosename', help_text='verbose name')
+ null = models.NullBooleanField(verbose_name='Null', help_text='can the value be null?')
+ blank = models.NullBooleanField(verbose_name='Blank', help_text='can the form be left blank?')
+ help_text = models.CharField(max_length=500, null=True, blank=True, verbose_name='Help text', help_text='help text for the field')
+ max_digits = models.IntegerField(max_length=5, null=True, blank=True, verbose_name='Max digit', help_text='If you have selected Decimal Field for datatype, you have to specify the number of digits.')
+ decimal_places = models.IntegerField(max_length=2, null=True, blank=True, verbose_name='Decimal places', help_text='If you have selected Decimal Field for datatype, you have to specify the decimal places.')
+ auto_now = models.NullBooleanField(verbose_name='Auto now', null=True, blank=True, help_text='Use this if DateTime & Time Field was chosen above for datatype')
+ auto_now_add = models.NullBooleanField(verbose_name='Auto now add', null=True, blank=True, help_text='Use this if DateTime & Time Field was chosen above for datatype')
+ upload_to = models.CharField(max_length=500,verbose_name='Upload to', null=True, blank=True, help_text='Required for FileField and ImageField')
+ path=models.CharField(max_length=500,verbose_name='Path', null=True, blank=True, help_text='Required for FilePathField')
+ verify_exists=models.NullBooleanField(verbose_name='Verify exits', null=True, blank=True, help_text='Required for AttributeURLField')
+ min_length=models.IntegerField(max_length=10,null=True, blank=True, verbose_name='min length', help_text='minimum length')
+ required=models.NullBooleanField(verbose_name='required', null=True, blank=True, help_text='Use this for setting mandatory and optional fields')
+ label=models.CharField(max_length=500, null=True,blank=True,verbose_name='label',help_text='specify the "human-friendly" label')
+ unique=models.NullBooleanField(verbose_name='unique', null=True, blank=True, help_text='If True, this field must be unique throughout the table')
+ validators=models.ManyToManyField('self', verbose_name='validators',blank=True, null=True,help_text='A list of validators to run for this field')
+ default=models.CharField(max_length=500, null=True, blank=True, verbose_name='default', help_text='The default value for the field')
+ editable=models.NullBooleanField(verbose_name='required', null=True, blank=True, help_text='If False, the field will not be editable')
+
+
+ def __unicode__(self):
+ return self.title
+
+ class Meta:
+ """
+ attribute type's meta class
+ """
+ verbose_name = _('attribute type')
+ verbose_name_plural = _('attribute types')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+
+class Relation(Edge):
+ '''
+ Relations, instances of relationtypes
+ '''
+
+ left_subject_scope = models.CharField(max_length=50, verbose_name='subject scope or qualification', null=True, blank=True)
+ left_subject = models.ForeignKey(NID, related_name="left_subject_of", verbose_name='subject name')
+ relationtype_scope = models.CharField(max_length=50, verbose_name='relation scope or qualification', null=True, blank=True)
+ relationtype = models.ForeignKey(Relationtype, verbose_name='relation name')
+ right_subject_scope = models.CharField(max_length=50, verbose_name='object scope or qualification', null=True, blank=True)
+ right_subject = models.ForeignKey(NID, related_name="right_subject_of", verbose_name='object name')
+
+ def ApplicableNodeTypes_filter(self,choice):
+
+ nodeslist = []
+
+ if choice == 'ED':
+ nodeslist = Edge.objects.all()
+ if choice == 'OB':
+ nodeslist = Objects.objects.all()
+ if choice == 'ND':
+ nodeslist = Node.objects.all()
+ if choice == 'NT':
+ nodeslist = Nodetype.objects.all()
+ if choice == 'OT':
+ nodeslist = Objecttype.objects.all()
+ if choice == 'RT':
+ nodeslist = Relationtype.objects.all()
+ if choice == 'MT':
+ nodeslist = Metatype.objects.all()
+ if choice == 'AT':
+ nodeslist = Attributetype.objects.all()
+ if choice == 'RN':
+ nodeslist = Relation.objects.all()
+ if choice == 'AS':
+ nodeslist = Attribute.objects.all()
+ if choice == 'ST':
+ nodeslist = Systemtype.objects.all()
+ if choice == 'SY':
+ nodeslist = System.objects.all()
+
+ return nodeslist
+
+
+ class Meta:
+ unique_together = (('left_subject_scope','left_subject','relationtype_scope', 'relationtype', 'right_subject_scope','right_subject'),)
+ verbose_name = _('relation')
+ verbose_name_plural = _('relations')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+ def __unicode__(self):
+ return self.composed_sentence
+
+ @property
+ def composed_sentence(self):
+ "composes the relation as a sentence in a triple format."
+ return '%s %s %s %s %s %s' % (self.left_subject_scope, self.left_subject, self.relationtype_scope, self.relationtype, self.right_subject_scope, self.right_subject)
+
+ @property
+ def inversed_sentence(self):
+ "composes the inverse relation as a sentence in a triple format."
+ return '%s %s %s %s %s' % (self.objectScope, self.right_subject, self.relationtype.inverse, self.left_subject_scope, self.left_subject )
+
+ @property
+ def key_value(self):
+ return dict({str(self.relationtype):str(self.right_subject)})
+
+ @property
+ def inverse_key_value(self):
+ return dict({str(self.relationtype.inverse):str(self.left_subject)})
+
+
+ @property
+ def relation_sentence(self):
+ """Return the relations of the objecttypes"""
+
+ if self.relationtype:
+ # for relation in self.relationtype():
+ return '%s %s %s' % (self.left_subject,self.relationtype,self.right_subject )
+
+ @property
+ def partial_composition(self):
+ '''
+ function that composes the right_subject and relation name, as in "x as a friend", "y as a sibling"
+ '''
+ return '%s as a %s' % (self.right_subject, self.relationtype)
+
+
+class Attribute(Edge):
+ '''
+ Attribute value store for default datatype varchar. Subject can be any of the
+ nodetypes.
+ '''
+
+ subject_scope = models.CharField(max_length=50, verbose_name='subject scope or qualification', null=True, blank=True)
+ subject = models.ForeignKey(NID, related_name="subject_of", verbose_name='subject name')
+ attributetype_scope = models.CharField(max_length=50, verbose_name='property scope or qualification', null=True, blank=True)
+ attributetype = models.ForeignKey(Attributetype, verbose_name='property name')
+ value_scope = models.CharField(max_length=50, verbose_name='value scope or qualification', null=True, blank=True)
+ svalue = models.CharField(max_length=100, verbose_name='serialized value')
+
+
+
+ class Meta:
+ unique_together = (('subject_scope', 'subject', 'attributetype_scope', 'attributetype', 'value_scope', 'svalue'),)
+ verbose_name = _('attribute')
+ verbose_name_plural = _('attributes')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+ def subject_filter(self,attr):
+ """
+ returns applicaable selection of nodes for selecting as subject
+ """
+ subjecttype = attr.subjecttype
+
+ for each in Objecttype.objects.all():
+ if attr.subjecttype.id == each.id:
+ return each.get_members
+
+
+
+ def __unicode__(self):
+ return self.composed_attribution
+
+ @property
+ def edge_node_dict(self):
+ '''
+ composes the attribution as a name:value pair sentence without the subject.
+ '''
+ return dict({str(self.attributetype_scope) + str(self.attributetype): str(self.value_scope)+ str(self.svalue)})
+
+ @property
+ def composed_sentence(self):
+ '''
+ composes the attribution as a sentence in a triple format.
+ '''
+ return '%s %s has %s %s %s %s' % (self.subject_scope, self.subject, self.attributetype_scope, self.attributetype, self.value_scope, self.svalue)
+
+ @property
+ def composed_attribution(self):
+ '''
+ composes a name to the attribute
+ '''
+ return 'the %s of %s is %s' % (self.attributetype, self.subject, self.svalue)
+
+ @property
+ def partial_composition(self):
+ '''
+ function that composes the value and attribute name, as in "red as color", "4 as length"
+ '''
+ return '%s as %s' % (self.svalue, self.attributetype)
+
+
+ def subject_filter(self,attr):
+ """
+ returns applicable selection of nodes for selecting objects
+ """
+ for each in Objecttype.objects.all():
+ if attr.subjecttype.id == each.id:
+ return each.get_members
+
+
+
+class AttributeCharField(Attribute):
+
+ value = models.CharField(max_length=100, verbose_name='string')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeTextField(Attribute):
+
+ value = models.TextField(verbose_name='text')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeIntegerField(Attribute):
+ value = models.IntegerField(max_length=100, verbose_name='Integer')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeCommaSeparatedIntegerField(Attribute):
+
+ value = models.CommaSeparatedIntegerField(max_length=100, verbose_name='integers separated by comma')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeBigIntegerField(Attribute):
+
+ value = models.BigIntegerField(max_length=100, verbose_name='big integer')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributePositiveIntegerField(Attribute):
+
+ value = models.PositiveIntegerField(max_length=100, verbose_name='positive integer')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeDecimalField(Attribute):
+
+ value = models.DecimalField(max_digits=3, decimal_places=2, verbose_name='decimal')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeFloatField(Attribute):
+
+ value = models.FloatField(max_length=100, verbose_name='number as float')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeBooleanField(Attribute):
+
+ value = models.BooleanField(verbose_name='boolean')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeNullBooleanField(Attribute):
+
+ value = models.NullBooleanField(verbose_name='true false or unknown')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeDateField(Attribute):
+
+ value = models.DateField(max_length=100, verbose_name='date')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeDateTimeField(Attribute):
+
+ value = models.DateTimeField(max_length=100, verbose_name='date time')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeTimeField(Attribute):
+
+ value = models.TimeField(max_length=100, verbose_name='time')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeEmailField(Attribute):
+
+ value = models.CharField(max_length=100,verbose_name='value')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeFileField(Attribute):
+
+ value = models.FileField(upload_to='/media', verbose_name='file')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeFilePathField(Attribute):
+
+ value = models.FilePathField(verbose_name='path of file')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeImageField(Attribute):
+
+ value = models.ImageField(upload_to='/media', verbose_name='image')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeURLField(Attribute):
+
+ value = models.URLField(max_length=100, verbose_name='url')
+
+ def __unicode__(self):
+ return self.title
+
+class AttributeIPAddressField(Attribute):
+
+ value = models.IPAddressField(max_length=100, verbose_name='ip address')
+
+ def __unicode__(self):
+ return self.title
+
+
+class Processtype(Nodetype):
+
+ """
+ A kind of nodetype for defining processes or events or temporal
+ objects involving change.
+ """
+ changing_attributetype_set = models.ManyToManyField(Attributetype, null=True, blank=True,
+ verbose_name=_('attribute set involved in the process'),
+ related_name=' changing_attributetype_set_of')
+ changing_relationtype_set = models.ManyToManyField(Relationtype, null=True, blank=True,
+ verbose_name=_('relation set involved in the process'),
+ related_name='changing_relationtype_set_of')
+
+
+ def __unicode__(self):
+ return self.title
+
+ class Meta:
+ verbose_name = _('process type')
+ verbose_name_plural = _('process types')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+
+
+class Systemtype(Nodetype):
+
+ """
+ class to organize Systems
+ """
+
+
+ nodetype_set = models.ManyToManyField(Nodetype, related_name="nodetype_set_of", verbose_name='Possible edges in the system',
+ blank=True, null=False)
+ relationtype_set = models.ManyToManyField(Relationtype, related_name="relationtype_set_of", verbose_name='Possible nodetypes in the system',
+ blank=True, null=False)
+ attributetype_set = models.ManyToManyField(Attributetype, related_name="attributetype_set_of", verbose_name='systems to be nested in the system',
+ blank=True, null=False)
+ metatype_set = models.ManyToManyField(Metatype, related_name="metatype_set_of", verbose_name='Possible edges in the system',
+ blank=True, null=False)
+ processtype_set = models.ManyToManyField(Processtype, related_name="processtype_set_of", verbose_name='Possible edges in the system',
+ blank=True, null=False)
+
+
+ def __unicode__(self):
+ return self.title
+
+ class Meta:
+ verbose_name = _('system type')
+ verbose_name_plural = _('system types')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+class AttributeSpecification(Node):
+ """
+ specifying an attribute by a subject to say for example:
+ population of India, color of a flower etc. These do not yeild a
+ proposition but a description, which can be used as a subject in
+ another sentence.
+ """
+ attributetype = models.ForeignKey(Attributetype, verbose_name='property name')
+ subjects = models.ManyToManyField(NID, related_name="subjects_attrspec_of", verbose_name='subjects')
+
+
+ @property
+ def composed_subject(self):
+ '''
+ composes a name to the attribute
+ '''
+ subjects = u''
+ for each in self.subjects.all():
+ subjects = subjects + each.title + ' '
+ return 'the %s of %s' % (self.attributetype, subjects)
+
+
+ def __unicode__(self):
+ return self.composed_subject
+
+
+ class Meta:
+ verbose_name = _('attribute specification')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+class RelationSpecification(Node):
+ """
+ specifying a relation with a subject
+ """
+ relationtype = models.ForeignKey(Relationtype, verbose_name='relation name')
+ subjects = models.ManyToManyField(NID, related_name="subjects_in_relspec", verbose_name='subjects')
+
+
+ @property
+ def composed_subject(self):
+ '''
+ composing an expression with relation name and subject
+ '''
+ subjects = u''
+ for each in self.subjects.all():
+ subjects = subjects + each.title + ' '
+ return 'the %s of %s' % (self.relationtype, subjects)
+
+ def __unicode__(self):
+ return self.composed_subject
+
+
+ class Meta:
+ verbose_name = _('relation specification')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+class NodeSpecification(Node):
+ """
+ A node specified (described) by its relations or attributes or both.
+ """
+ subject = models.ForeignKey(Node, related_name="subject_nodespec", verbose_name='subject name')
+ relations = models.ManyToManyField(Relation, related_name="relations_in_nodespec", verbose_name='relations used to specify the domain')
+ attributes = models.ManyToManyField(Attribute, related_name="attributes_in_nodespec", verbose_name='attributes used to specify the domain')
+
+ @property
+ def composed_subject(self):
+ '''
+ composing an expression subject and relations
+ '''
+ relations = u''
+ for each in self.relations.all():
+ relations = relations + each.partial_composition + ', '
+ attributes = u''
+ for each in self.attributes.all():
+ attributes = attributes + each.partial_composition + ', '
+ return 'the %s with %s, %s' % (self.subject, self.relations, self.attributes)
+
+ def __unicode__(self):
+ return self.composed_subject
+
+
+ class Meta:
+ verbose_name = _('Node specification')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+class Expression(Node):
+ """
+ Expression constructor
+ """
+
+ left_term = models.ForeignKey(NID, related_name="left_term_of", verbose_name='left term name')
+ relationtype = models.ForeignKey(Relationtype, verbose_name='relation name')
+ right_term = models.ForeignKey(NID, related_name="right_term_of", verbose_name='right term name')
+
+
+ def __unicode__(self):
+ return self.composed_sentence
+
+ @property
+ def composed_sentence(self):
+ "composes the relation as a sentence in a triple format."
+ return '%s %s %s' % (self.left_term, self.relationtype, self.right_term)
+
+
+ class Meta:
+ unique_together = (('left_term','relationtype','right_term'),)
+ verbose_name = _('expression')
+ verbose_name_plural = _('expressionss')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+
+class Union(Node):
+ """
+ union of two classes
+ """
+ nodetypes = models.ManyToManyField(Nodetype, related_name = 'union_of', verbose_name='node types for union')
+
+ def __unicode__(self):
+ return self.title
+
+
+
+class Complement(Node):
+ """
+ complement of a class
+ """
+ nodetypes = models.ManyToManyField(Nodetype, related_name = 'complement_of', verbose_name='complementary nodes')
+
+ def __unicode__(self):
+ return self.title
+
+class Intersection(Node):
+ """
+ Intersection of classes
+ """
+ nodetypes = models.ManyToManyField(Nodetype, related_name = 'intersection_of', verbose_name='intersection of classes')
+
+ def __unicode__(self):
+ return self.title
+
+
+reversion.register(NID)
+
+if not reversion.is_registered(Systemtype):
+ reversion.register(Systemtype)
+
+if not reversion.is_registered(Objecttype):
+ reversion.register(Objecttype , follow=["nodetype_ptr"])
+
+if not reversion.is_registered(Node):
+ reversion.register(Node , follow=["nid_ptr"])
+
+if not reversion.is_registered(Edge):
+ reversion.register(Edge , follow=["nid_ptr"])
+
+
+if not reversion.is_registered(Processtype):
+ reversion.register(Processtype, follow=["changing_attributetype_set", "changing_relationtype_set"])
+
+if not reversion.is_registered(Nodetype):
+ reversion.register(Nodetype, follow=["node_ptr","parent", "metatypes","prior_nodes", "posterior_nodes"])
+
+if not reversion.is_registered(Metatype):
+ reversion.register(Metatype, follow=["node_ptr","parent"])
+
+
+if not reversion.is_registered(Relationtype):
+ reversion.register(Relationtype, follow=["left_subjecttype", "right_subjecttype"])
+
+if not reversion.is_registered(Attributetype):
+ reversion.register(Attributetype, follow=["subjecttype"])
+
+if not reversion.is_registered(Attribute):
+ reversion.register(Attribute, follow=["subject", "attributetype"])
+
+if not reversion.is_registered(Relation):
+ reversion.register(Relation, follow=["left_subject", "right_subject", "relationtype"])
+
+moderator.register(Nodetype, NodetypeCommentModerator)
+mptt.register(Metatype, order_insertion_by=['title'])
+mptt.register(Nodetype, order_insertion_by=['title'])
+mptt.register(Objecttype, order_insertion_by=['title'])
+mptt.register(Relationtype, order_insertion_by=['title'])
+mptt.register(Attributetype, order_insertion_by=['title'])
+mptt.register(Systemtype, order_insertion_by=['title'])
+mptt.register(Processtype, order_insertion_by=['title'])
+post_save.connect(ping_directories_handler, sender=Nodetype,
+ dispatch_uid='gstudio.nodetype.post_save.ping_directories')
+post_save.connect(ping_external_urls_handler, sender=Nodetype,
+ dispatch_uid='gstudio.nodetype.post_save.ping_external_urls')
+
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/moderator.py b/build/lib.linux-i686-2.6/gstudio/moderator.py
new file mode 100644
index 0000000..23c3231
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/moderator.py
@@ -0,0 +1,194 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+"""Moderator of Gstudio comments"""
+from django.conf import settings
+from django.template import Context
+from django.template import loader
+from django.core.mail import send_mail
+from django.core.mail import EmailMessage
+from django.contrib.sites.models import Site
+from django.utils.translation import activate
+from django.utils.translation import get_language
+from django.utils.translation import ugettext_lazy as _
+from django.contrib.comments.moderation import CommentModerator
+
+from gstudio.settings import PROTOCOL
+from gstudio.settings import MAIL_COMMENT_REPLY
+from gstudio.settings import MAIL_COMMENT_AUTHORS
+from gstudio.settings import AUTO_MODERATE_COMMENTS
+from gstudio.settings import AUTO_CLOSE_COMMENTS_AFTER
+from gstudio.settings import MAIL_COMMENT_NOTIFICATION_RECIPIENTS
+from gstudio.settings import SPAM_CHECKER_BACKENDS
+from gstudio.spam_checker import check_is_spam
+
+class NodetypeCommentModerator(CommentModerator):
+ """Moderate the comment of Nodes"""
+ email_reply = MAIL_COMMENT_REPLY
+ email_authors = MAIL_COMMENT_AUTHORS
+ enable_field = 'comment_enabled'
+ auto_close_field = 'start_publication'
+ close_after = AUTO_CLOSE_COMMENTS_AFTER
+ spam_checker_backends = SPAM_CHECKER_BACKENDS
+ auto_moderate_comments = AUTO_MODERATE_COMMENTS
+ mail_comment_notification_recipients = MAIL_COMMENT_NOTIFICATION_RECIPIENTS
+
+ def email(self, comment, content_object, request):
+ if comment.is_public:
+ current_language = get_language()
+ try:
+ activate(settings.LANGUAGE_CODE)
+ if self.mail_comment_notification_recipients:
+ self.do_email_notification(comment, content_object,
+ request)
+ if self.email_authors:
+ self.do_email_authors(comment, content_object,
+ request)
+ if self.email_reply:
+ self.do_email_reply(comment, content_object, request)
+ finally:
+ activate(current_language)
+
+ def do_email_notification(self, comment, content_object, request):
+ """Send email notification of a new comment to site staff when email
+ notifications have been requested."""
+ site = Site.objects.get_current()
+ template = loader.get_template(
+ 'comments/comment_notification_email.txt')
+ context = Context({'comment': comment, 'site': site,
+ 'protocol': PROTOCOL,
+ 'content_object': content_object})
+ subject = _('[%(site)s] New comment posted on "%(title)s"') % \
+ {'site': site.name,
+ 'title': content_object.title}
+ message = template.render(context)
+ send_mail(subject, message, settings.DEFAULT_FROM_EMAIL,
+ self.mail_comment_notification_recipients,
+ fail_silently=not settings.DEBUG)
+
+ def do_email_authors(self, comment, content_object, request):
+ """Send email notification of a new comment to the authors of the
+ nodetype when email notifications have been requested."""
+ exclude_list = self.mail_comment_notification_recipients
+ recipient_list = set([author.email
+ for author in content_object.authors.all()]) ^ \
+ set(exclude_list)
+
+ if recipient_list:
+ site = Site.objects.get_current()
+ template = loader.get_template(
+ 'comments/comment_authors_email.txt')
+ context = Context({'comment': comment, 'site': site,
+ 'protocol': PROTOCOL,
+ 'content_object': content_object})
+ subject = _('[%(site)s] New comment posted on "%(title)s"') % \
+ {'site': site.name,
+ 'title': content_object.title}
+ message = template.render(context)
+ send_mail(subject, message, settings.DEFAULT_FROM_EMAIL,
+ recipient_list, fail_silently=not settings.DEBUG)
+
+ def do_email_reply(self, comment, content_object, request):
+ """Send email notification of a new comment to the authors of
+ the previous comments when email notifications have been requested."""
+ exclude_list = self.mail_comment_notification_recipients + \
+ [author.email
+ for author in content_object.authors.all()] + \
+ [comment.userinfo['email']]
+ recipient_list = set([comment.userinfo['email']
+ for comment in content_object.comments
+ if comment.userinfo['email']]) ^ \
+ set(exclude_list)
+
+ if recipient_list:
+ site = Site.objects.get_current()
+ template = loader.get_template('comments/comment_reply_email.txt')
+ context = Context({'comment': comment, 'site': site,
+ 'protocol': PROTOCOL,
+ 'content_object': content_object})
+ subject = _('[%(site)s] New comment posted on "%(title)s"') % \
+ {'site': site.name,
+ 'title': content_object.title}
+ message = template.render(context)
+ mail = EmailMessage(subject, message,
+ settings.DEFAULT_FROM_EMAIL,
+ bcc=recipient_list)
+ mail.send(fail_silently=not settings.DEBUG)
+
+ def moderate(self, comment, content_object, request):
+ """Determine whether a given comment on a given object should be
+ allowed to show up immediately, or should be marked non-public
+ and await approval."""
+ if self.auto_moderate_comments:
+ return True
+
+ if check_is_spam(comment, content_object, request,
+ self.spam_checker_backends):
+ comment.save()
+ user = comment.content_object.authors.all()[0]
+ comment.flags.create(user=user, flag='spam')
+ return True
+
+ return False
diff --git a/build/lib.linux-i686-2.6/gstudio/ping.py b/build/lib.linux-i686-2.6/gstudio/ping.py
new file mode 100644
index 0000000..f3ed600
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/ping.py
@@ -0,0 +1,231 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Pings utilities for Gstudio"""
+import socket
+import xmlrpclib
+import threading
+from urllib2 import urlopen
+from urlparse import urlsplit
+from logging import getLogger
+
+from BeautifulSoup import BeautifulSoup
+
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+
+from gstudio.settings import PROTOCOL
+
+
+class URLRessources(object):
+ """Object defining the ressources of the website"""
+
+ def __init__(self):
+ self.current_site = Site.objects.get_current()
+ self.site_url = '%s://%s' % (PROTOCOL, self.current_site.domain)
+ self.blog_url = '%s%s' % (self.site_url,
+ reverse('gstudio_nodetype_archive_index'))
+ self.blog_feed = '%s%s' % (self.site_url,
+ reverse('gstudio_nodetype_latest_feed'))
+
+
+class DirectoryPinger(threading.Thread):
+ """Threaded Directory Pinger"""
+
+ def __init__(self, server_name, nodetypes, timeout=10, start_now=True):
+ self.results = []
+ self.timeout = timeout
+ self.nodetypes = nodetypes
+ self.server_name = server_name
+ self.server = xmlrpclib.ServerProxy(self.server_name)
+ self.ressources = URLRessources()
+
+ threading.Thread.__init__(self)
+ if start_now:
+ self.start()
+
+ def run(self):
+ """Ping nodetypes to a Directory in a Thread"""
+ logger = getLogger('gstudio.ping.directory')
+ socket.setdefaulttimeout(self.timeout)
+ for nodetype in self.nodetypes:
+ reply = self.ping_nodetype(nodetype)
+ self.results.append(reply)
+ logger.info('%s : %s' % (self.server_name, reply['message']))
+ socket.setdefaulttimeout(None)
+
+ def ping_nodetype(self, nodetype):
+ """Ping a nodetype to a Directory"""
+ nodetype_url = '%s%s' % (self.ressources.site_url,
+ nodetype.get_absolute_url())
+ metatypes = '|'.join([c.title for c in nodetype.metatypes.all()])
+
+ try:
+ reply = self.server.weblogUpdates.extendedPing(
+ self.ressources.current_site.name,
+ self.ressources.blog_url, nodetype_url,
+ self.ressources.blog_feed, metatypes)
+ except Exception:
+ try:
+ reply = self.server.weblogUpdates.ping(
+ self.ressources.current_site.name,
+ self.ressources.blog_url, nodetype_url,
+ metatypes)
+ except Exception:
+ reply = {'message': '%s is an invalid directory.' % \
+ self.server_name,
+ 'flerror': True}
+ return reply
+
+
+class ExternalUrlsPinger(threading.Thread):
+ """Threaded ExternalUrls Pinger"""
+
+ def __init__(self, nodetype, timeout=10, start_now=True):
+ self.results = []
+ self.nodetype = nodetype
+ self.timeout = timeout
+ self.ressources = URLRessources()
+ self.nodetype_url = '%s%s' % (self.ressources.site_url,
+ self.nodetype.get_absolute_url())
+
+ threading.Thread.__init__(self)
+ if start_now:
+ self.start()
+
+ def run(self):
+ """Ping external URLS in a Thread"""
+ logger = getLogger('gstudio.ping.external_urls')
+ socket.setdefaulttimeout(self.timeout)
+
+ external_urls = self.find_external_urls(self.nodetype)
+ external_urls_pingable = self.find_pingback_urls(external_urls)
+
+ for url, server_name in external_urls_pingable.items():
+ reply = self.pingback_url(server_name, url)
+ self.results.append(reply)
+ logger.info('%s : %s' % (url, reply))
+
+ socket.setdefaulttimeout(None)
+
+ def is_external_url(self, url, site_url):
+ """Check of the url in an external url"""
+ url_splitted = urlsplit(url)
+ if not url_splitted.netloc:
+ return False
+ return url_splitted.netloc != urlsplit(site_url).netloc
+
+ def find_external_urls(self, nodetype):
+ """Find external urls in a nodetype"""
+ soup = BeautifulSoup(nodetype.html_content)
+ external_urls = [a['href'] for a in soup.findAll('a')
+ if self.is_external_url(
+ a['href'], self.ressources.site_url)]
+ return external_urls
+
+ def find_pingback_href(self, content):
+ """Try to find Link markup to pingback url"""
+ soup = BeautifulSoup(content)
+ for link in soup.findAll('link'):
+ dict_attr = dict(link.attrs)
+ if 'rel' in dict_attr and 'href' in dict_attr:
+ if dict_attr['rel'].lower() == 'pingback':
+ return dict_attr.get('href')
+
+ def find_pingback_urls(self, urls):
+ """Find the pingback urls of each urls"""
+ pingback_urls = {}
+
+ for url in urls:
+ try:
+ page = urlopen(url)
+ headers = page.info()
+
+ if 'text/' not in headers.get('Content-Type', '').lower():
+ continue
+
+ server_url = headers.get('X-Pingback')
+ if not server_url:
+ server_url = self.find_pingback_href(page.read())
+
+ if server_url:
+ server_url_splitted = urlsplit(server_url)
+ if not server_url_splitted.netloc:
+ url_splitted = urlsplit(url)
+ server_url = '%s://%s%s' % (url_splitted.scheme,
+ url_splitted.netloc,
+ server_url)
+ pingback_urls[url] = server_url
+ except IOError:
+ pass
+ return pingback_urls
+
+ def pingback_url(self, server_name, target_url):
+ """Do a pingback call for the target url"""
+ try:
+ server = xmlrpclib.ServerProxy(server_name)
+ reply = server.pingback.ping(self.nodetype_url, target_url)
+ except (xmlrpclib.Error, socket.error):
+ reply = '%s cannot be pinged.' % target_url
+ return reply
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/__init__.py b/build/lib.linux-i686-2.6/gstudio/plugins/__init__.py
new file mode 100644
index 0000000..fa1f3e5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/__init__.py
@@ -0,0 +1 @@
+"""Plugins for Gstudio"""
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/admin.py b/build/lib.linux-i686-2.6/gstudio/plugins/admin.py
new file mode 100644
index 0000000..9749520
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/admin.py
@@ -0,0 +1,106 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""Admin of Gstudio CMS Plugins"""
+from django.contrib import admin
+from django.template import RequestContext
+from django.utils.translation import ugettext_lazy as _
+
+from cms.plugin_rendering import render_placeholder
+from cms.admin.placeholderadmin import PlaceholderAdmin
+
+from gstudio.models import Nodetype
+from gstudio.admin.nodetype import NodetypeAdmin
+from gstudio.settings import NODETYPE_BASE_MODEL
+
+
+class NodetypePlaceholderAdmin(PlaceholderAdmin, NodetypeAdmin):
+ """NodetypePlaceholder Admin"""
+ fieldsets = ((None, {'fields': ('title', 'image', 'status')}),
+ (_('Content'), {'fields': ('content_placeholder',),
+ 'classes': ('plugin-holder',
+ 'plugin-holder-nopage')}),
+ (_('Options'), {'fields': ('featured', 'excerpt', 'template',
+ 'related', 'authors',
+ 'creation_date',
+ 'start_publication',
+ 'end_publication'),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Privacy'), {'fields': ('password', 'login_required',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Discussion'), {'fields': ('comment_enabled',
+ 'pingback_enabled')}),
+ (_('Publication'), {'fields': ('sites', 'metatypes',
+ 'tags', 'slug')}))
+
+ def save_model(self, request, nodetype, form, change):
+ """Fill the content field with the interpretation
+ of the placeholder"""
+ context = RequestContext(request)
+ nodetype.content = render_placeholder(nodetype.content_placeholder, context)
+ super(NodetypePlaceholderAdmin, self).save_model(
+ request, nodetype, form, change)
+
+
+if NODETYPE_BASE_MODEL == 'gstudio.plugins.placeholder.NodetypePlaceholder':
+ admin.site.unregister(Nodetype)
+ admin.site.register(Nodetype, NodetypePlaceholderAdmin)
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/cms_app.py b/build/lib.linux-i686-2.6/gstudio/plugins/cms_app.py
new file mode 100644
index 0000000..05c4008
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/cms_app.py
@@ -0,0 +1,16 @@
+"""Applications hooks for gstudio.plugins"""
+from django.utils.translation import ugettext_lazy as _
+
+from cms.app_base import CMSApp
+from cms.apphook_pool import apphook_pool
+
+from gstudio.plugins.settings import APP_MENUS
+
+
+class GstudioApphook(CMSApp):
+ """Gstudio's Apphook"""
+ name = _('Gstudio App Hook')
+ urls = ['gstudio.urls']
+ menus = APP_MENUS
+
+apphook_pool.register(GstudioApphook)
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/cms_plugins.py b/build/lib.linux-i686-2.6/gstudio/plugins/cms_plugins.py
new file mode 100644
index 0000000..6661e21
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/cms_plugins.py
@@ -0,0 +1,201 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Plugins for CMS"""
+import itertools
+
+from django.conf import settings
+from django.utils.translation import ugettext as _
+
+from tagging.models import TaggedItem
+from cms.plugin_base import CMSPluginBase
+from cms.plugin_pool import plugin_pool
+
+from gstudio.models import Nodetype
+from gstudio.models import Author
+from gstudio.managers import tags_published
+from gstudio.plugins.models import RandomNodetypesPlugin
+from gstudio.plugins.models import LatestNodetypesPlugin
+from gstudio.plugins.models import SelectedNodetypesPlugin
+
+
+class CMSLatestNodetypesPlugin(CMSPluginBase):
+ """Django-cms plugin for the latest nodetypes filtered"""
+ module = _('nodetypes')
+ model = LatestNodetypesPlugin
+ name = _('Latest nodetypes')
+ render_template = 'gstudio/cms/nodetype_list.html'
+ filter_horizontal = ['metatypes', 'authors', 'tags']
+ fieldsets = (
+ (None, {
+ 'fields': (
+ 'number_of_nodetypes',
+ 'template_to_render'
+ )
+ }),
+ (_('Sorting'), {
+ 'fields': (
+ 'metatypes',
+ 'authors',
+ 'tags'
+ ),
+ 'classes': (
+ 'collapse',
+ )
+ }),
+ (_('Advanced'), {
+ 'fields': (
+ 'submetatypes',
+ ),
+ }),
+ )
+
+ text_enabled = True
+
+ def formfield_for_manytomany(self, db_field, request, **kwargs):
+ """Filtering manytomany field"""
+ if db_field.name == 'authors':
+ kwargs['queryset'] = Author.published.all()
+ if db_field.name == 'tags':
+ kwargs['queryset'] = tags_published()
+ return super(CMSLatestNodetypesPlugin, self).formfield_for_manytomany(
+ db_field, request, **kwargs)
+
+ def render(self, context, instance, placeholder):
+ """Update the context with plugin's data"""
+ nodetypes = Nodetype.published.all()
+
+ if instance.metatypes.count():
+ cats = instance.metatypes.all()
+
+ if instance.submetatypes:
+ cats = itertools.chain(cats, *[c.get_descendants()
+ for c in cats])
+
+ nodetypes = nodetypes.filter(metatypes__in=cats)
+ if instance.authors.count():
+ nodetypes = nodetypes.filter(authors__in=instance.authors.all())
+ if instance.tags.count():
+ nodetypes = TaggedItem.objects.get_union_by_model(
+ nodetypes, instance.tags.all())
+
+ nodetypes = nodetypes.distinct()[:instance.number_of_nodetypes]
+ context.update({'nodetypes': nodetypes,
+ 'object': instance,
+ 'placeholder': placeholder})
+ return context
+
+ def icon_src(self, instance):
+ """Icon source of the plugin"""
+ return settings.STATIC_URL + u'gstudio/img/plugin.png'
+
+
+class CMSSelectedNodetypesPlugin(CMSPluginBase):
+ """Django-cms plugin for a selection of nodetypes"""
+ module = _('nodetypes')
+ model = SelectedNodetypesPlugin
+ name = _('Selected nodetypes')
+ render_template = 'gstudio/cms/nodetype_list.html'
+ fields = ('nodetypes', 'template_to_render')
+ filter_horizontal = ['nodetypes']
+ text_enabled = True
+
+ def render(self, context, instance, placeholder):
+ """Update the context with plugin's data"""
+ context.update({'nodetypes': instance.nodetypes.all(),
+ 'object': instance,
+ 'placeholder': placeholder})
+ return context
+
+ def icon_src(self, instance):
+ """Icon source of the plugin"""
+ return settings.STATIC_URL + u'gstudio/img/plugin.png'
+
+
+class CMSRandomNodetypesPlugin(CMSPluginBase):
+ """Django-cms plugin for random nodetypes"""
+ module = _('nodetypes')
+ model = RandomNodetypesPlugin
+ name = _('Random node types')
+ render_template = 'gstudio/cms/random_nodetypes.html'
+ fields = ('number_of_nodetypes', 'template_to_render')
+ text_enabled = True
+
+ def render(self, context, instance, placeholder):
+ """Update the context with plugin's data"""
+ context.update(
+ {'number_of_nodetypes': instance.number_of_nodetypes,
+ 'template_to_render': str(instance.template_to_render) or
+ 'gstudio/tags/random_nodetypes.html'})
+ return context
+
+ def icon_src(self, instance):
+ """Icon source of the plugin"""
+ return settings.STATIC_URL + u'gstudio/img/plugin.png'
+
+plugin_pool.register_plugin(CMSLatestNodetypesPlugin)
+plugin_pool.register_plugin(CMSSelectedNodetypesPlugin)
+plugin_pool.register_plugin(CMSRandomNodetypesPlugin)
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/menu.py b/build/lib.linux-i686-2.6/gstudio/plugins/menu.py
new file mode 100644
index 0000000..d03b762
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/menu.py
@@ -0,0 +1,198 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Menus for gstudio.plugins"""
+from django.core.urlresolvers import reverse
+from django.utils.translation import ugettext_lazy as _
+
+from menus.base import Modifier
+from menus.base import NavigationNode
+from menus.menu_pool import menu_pool
+from cms.menu_bases import CMSAttachMenu
+
+from gstudio.models import Nodetype
+from gstudio.models import Author
+from gstudio.models import Metatype
+from gstudio.managers import tags_published
+from gstudio.plugins.settings import HIDE_NODETYPE_MENU
+
+
+class NodetypeMenu(CMSAttachMenu):
+ """Menu for the nodetypes organized by archives dates"""
+ name = _('Gstudio Nodetype Menu')
+
+ def get_nodes(self, request):
+ """Return menu's node for nodetypes"""
+ nodes = []
+ archives = []
+ attributes = {'hidden': HIDE_NODETYPE_MENU}
+ for nodetype in Nodetype.published.all():
+ year = nodetype.creation_date.strftime('%Y')
+ month = nodetype.creation_date.strftime('%m')
+ month_text = nodetype.creation_date.strftime('%b')
+ day = nodetype.creation_date.strftime('%d')
+
+ key_archive_year = 'year-%s' % year
+ key_archive_month = 'month-%s-%s' % (year, month)
+ key_archive_day = 'day-%s-%s-%s' % (year, month, day)
+
+ if not key_archive_year in archives:
+ nodes.append(NavigationNode(
+ year, reverse('gstudio_nodetype_archive_year', args=[year]),
+ key_archive_year, attr=attributes))
+ archives.append(key_archive_year)
+
+ if not key_archive_month in archives:
+ nodes.append(NavigationNode(
+ month_text,
+ reverse('gstudio_nodetype_archive_month', args=[year, month]),
+ key_archive_month, key_archive_year,
+ attr=attributes))
+ archives.append(key_archive_month)
+
+ if not key_archive_day in archives:
+ nodes.append(NavigationNode(
+ day, reverse('gstudio_nodetype_archive_day',
+ args=[year, month, day]),
+ key_archive_day, key_archive_month,
+ attr=attributes))
+ archives.append(key_archive_day)
+
+ nodes.append(NavigationNode(nodetype.title, nodetype.get_absolute_url(),
+ nodetype.pk, key_archive_day))
+ return nodes
+
+
+class MetatypeMenu(CMSAttachMenu):
+ """Menu for the metatypes"""
+ name = _('Gstudio Metatype Menu')
+
+ def get_nodes(self, request):
+ """Return menu's node for metatypes"""
+ nodes = []
+ nodes.append(NavigationNode(_('Metatypes'),
+ reverse('gstudio_metatype_list'),
+ 'metatypes'))
+ for metatype in Metatype.objects.all():
+ nodes.append(NavigationNode(metatype.title,
+ metatype.get_absolute_url(),
+ metatype.pk, 'metatypes'))
+ return nodes
+
+
+class AuthorMenu(CMSAttachMenu):
+ """Menu for the authors"""
+ name = _('Gstudio Author Menu')
+
+ def get_nodes(self, request):
+ """Return menu's node for authors"""
+ nodes = []
+ nodes.append(NavigationNode(_('Authors'),
+ reverse('gstudio_author_list'),
+ 'authors'))
+ for author in Author.published.all():
+ nodes.append(NavigationNode(author.username,
+ reverse('gstudio_author_detail',
+ args=[author.username]),
+ author.pk, 'authors'))
+ return nodes
+
+
+class TagMenu(CMSAttachMenu):
+ """Menu for the tags"""
+ name = _('Gstudio Tag Menu')
+
+ def get_nodes(self, request):
+ """Return menu's node for tags"""
+ nodes = []
+ nodes.append(NavigationNode(_('Tags'), reverse('gstudio_tag_list'),
+ 'tags'))
+ for tag in tags_published():
+ nodes.append(NavigationNode(tag.name,
+ reverse('gstudio_tag_detail',
+ args=[tag.name]),
+ tag.pk, 'tags'))
+ return nodes
+
+
+class NodetypeModifier(Modifier):
+ """Menu Modifier for nodetypes,
+ hide the MenuNodetype in navigation, not in breadcrumbs"""
+
+ def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
+ """Modify nodes of a menu"""
+ if breadcrumb:
+ return nodes
+ for node in nodes:
+ if node.attr.get('hidden'):
+ nodes.remove(node)
+ return nodes
+
+
+menu_pool.register_menu(NodetypeMenu)
+menu_pool.register_menu(MetatypeMenu)
+menu_pool.register_menu(AuthorMenu)
+menu_pool.register_menu(TagMenu)
+menu_pool.register_modifier(NodetypeModifier)
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0001_initial.py b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0001_initial.py
new file mode 100644
index 0000000..3dc5163
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0001_initial.py
@@ -0,0 +1,151 @@
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding model 'LatestNodetypesPlugin'
+ db.create_table('cmsplugin_latestnodetypesplugin', (
+ ('metatype', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['gstudio.Metatype'], null=True, blank=True)),
+ ('cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)),
+ ('number_of_nodetypes', self.gf('django.db.models.fields.IntegerField')(default=5)),
+ ('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)),
+ ))
+ db.send_create_signal('plugins', ['LatestNodetypesPlugin'])
+
+ # Adding model 'SelectedNodetypesPlugin'
+ db.create_table('cmsplugin_selectednodetypesplugin', (
+ ('cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)),
+ ))
+ db.send_create_signal('plugins', ['SelectedNodetypesPlugin'])
+
+ # Adding M2M table for field nodetypes on 'SelectedNodetypesPlugin'
+ db.create_table('plugins_selectednodetypesplugin_nodetypes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('selectednodetypesplugin', models.ForeignKey(orm['plugins.selectednodetypesplugin'], null=False)),
+ ('nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False))
+ ))
+ db.create_unique('plugins_selectednodetypesplugin_nodetypes', ['selectednodetypesplugin_id', 'nodetype_id'])
+
+ def backwards(self, orm):
+
+ # Deleting model 'LatestNodetypesPlugin'
+ db.delete_table('cmsplugin_latestnodetypesplugin')
+
+ # Deleting model 'SelectedNodetypesPlugin'
+ db.delete_table('cmsplugin_selectednodetypesplugin')
+
+ # Removing M2M table for field nodetypes on 'SelectedNodetypesPlugin'
+ db.delete_table('plugins_selectednodetypesplugin_nodetypes')
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'cms.cmsplugin': {
+ 'Meta': {'object_name': 'CMSPlugin'},
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'language': ('django.db.models.fields.CharField', [], {'max_length': '5', 'db_index': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
+ 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
+ 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'publisher_is_draft': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True', 'blank': 'True'}),
+ 'publisher_public': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'publisher_draft'", 'unique': 'True', 'null': 'True', 'to': "orm['cms.CMSPlugin']"}),
+ 'publisher_state': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'cms.placeholder': {
+ 'Meta': {'object_name': 'Placeholder'},
+ 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'plugins.latestnodetypesplugin': {
+ 'Meta': {'object_name': 'LatestNodetypesPlugin', 'db_table': "'cmsplugin_latestnodetypesplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'metatype': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gstudio.Metatype']", 'null': 'True', 'blank': 'True'}),
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_nodetypes': ('django.db.models.fields.IntegerField', [], {'default': '5'})
+ },
+ 'plugins.selectednodetypesplugin': {
+ 'Meta': {'object_name': 'SelectedNodetypesPlugin', 'db_table': "'cmsplugin_selectednodetypesplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'nodetypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gstudio.Nodetype']", 'symmetrical': 'False'})
+ },
+ 'sites.site': {
+ 'Meta': {'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'gstudio.metatype': {
+ 'Meta': {'object_name': 'Metatype'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'gstudio.nodetype': {
+ 'Meta': {'object_name': 'Nodetype'},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'metatypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gstudio.Metatype']", 'symmetrical': 'False'}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'related': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'related_rel_+'", 'null': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ }
+ }
+
+ complete_apps = ['plugins']
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0002_auto__add_field_latestnodetypesplugin_template_to_render__add_field_sele.py b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0002_auto__add_field_latestnodetypesplugin_template_to_render__add_field_sele.py
new file mode 100644
index 0000000..f70e114
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0002_auto__add_field_latestnodetypesplugin_template_to_render__add_field_sele.py
@@ -0,0 +1,132 @@
+from south.db import db
+from south.v2 import SchemaMigration
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'LatestNodetypesPlugin.template_to_render'
+ db.add_column('cmsplugin_latestnodetypesplugin', 'template_to_render', self.gf('django.db.models.fields.CharField')(default='gstudio/cms/nodetype_list.html', max_length=250, blank=True), keep_default=False)
+
+ # Adding field 'SelectedNodetypesPlugin.template_to_render'
+ db.add_column('cmsplugin_selectednodetypesplugin', 'template_to_render', self.gf('django.db.models.fields.CharField')(default='gstudio/cms/nodetype_list.html', max_length=250, blank=True), keep_default=False)
+
+ def backwards(self, orm):
+
+ # Deleting field 'LatestNodetypesPlugin.template_to_render'
+ db.delete_column('cmsplugin_latestnodetypesplugin', 'template_to_render')
+
+ # Deleting field 'SelectedNodetypesPlugin.template_to_render'
+ db.delete_column('cmsplugin_selectednodetypesplugin', 'template_to_render')
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'cms.cmsplugin': {
+ 'Meta': {'object_name': 'CMSPlugin'},
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'language': ('django.db.models.fields.CharField', [], {'max_length': '5', 'db_index': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
+ 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
+ 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'publisher_is_draft': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True', 'blank': 'True'}),
+ 'publisher_public': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'publisher_draft'", 'unique': 'True', 'null': 'True', 'to': "orm['cms.CMSPlugin']"}),
+ 'publisher_state': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'cms.placeholder': {
+ 'Meta': {'object_name': 'Placeholder'},
+ 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'plugins.latestnodetypesplugin': {
+ 'Meta': {'object_name': 'LatestNodetypesPlugin', 'db_table': "'cmsplugin_latestnodetypesplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'metatype': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gstudio.Metatype']", 'null': 'True', 'blank': 'True'}),
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_nodetypes': ('django.db.models.fields.IntegerField', [], {'default': '5'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'plugins.selectednodetypesplugin': {
+ 'Meta': {'object_name': 'SelectedNodetypesPlugin', 'db_table': "'cmsplugin_selectednodetypesplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'nodetypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gstudio.Nodetype']", 'symmetrical': 'False'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'sites.site': {
+ 'Meta': {'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'gstudio.metatype': {
+ 'Meta': {'object_name': 'Metatype'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'gstudio.nodetype': {
+ 'Meta': {'object_name': 'Nodetype'},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'metatypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gstudio.Metatype']", 'symmetrical': 'False'}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'related': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'related_rel_+'", 'null': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ }
+ }
+
+ complete_apps = ['plugins']
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0003_auto__del_field_latestnodetypesplugin_metatype__del_field_latestnodetypesp.py b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0003_auto__del_field_latestnodetypesplugin_metatype__del_field_latestnodetypesp.py
new file mode 100644
index 0000000..271113e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0003_auto__del_field_latestnodetypesplugin_metatype__del_field_latestnodetypesp.py
@@ -0,0 +1,172 @@
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Deleting field 'LatestNodetypesPlugin.metatype'
+ db.delete_column('cmsplugin_latestnodetypesplugin', 'metatype_id')
+
+ # Deleting field 'LatestNodetypesPlugin.author'
+ db.delete_column('cmsplugin_latestnodetypesplugin', 'author_id')
+
+ # Adding M2M table for field tags on 'LatestNodetypesPlugin'
+ db.create_table('plugins_latestnodetypesplugin_tags', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('latestnodetypesplugin', models.ForeignKey(orm['plugins.latestnodetypesplugin'], null=False)),
+ ('tag', models.ForeignKey(orm['tagging.tag'], null=False))
+ ))
+ db.create_unique('plugins_latestnodetypesplugin_tags', ['latestnodetypesplugin_id', 'tag_id'])
+
+ # Adding M2M table for field metatypes on 'LatestNodetypesPlugin'
+ db.create_table('plugins_latestnodetypesplugin_metatypes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('latestnodetypesplugin', models.ForeignKey(orm['plugins.latestnodetypesplugin'], null=False)),
+ ('metatype', models.ForeignKey(orm['gstudio.metatype'], null=False))
+ ))
+ db.create_unique('plugins_latestnodetypesplugin_metatypes', ['latestnodetypesplugin_id', 'metatype_id'])
+
+ # Adding M2M table for field authors on 'LatestNodetypesPlugin'
+ db.create_table('plugins_latestnodetypesplugin_authors', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('latestnodetypesplugin', models.ForeignKey(orm['plugins.latestnodetypesplugin'], null=False)),
+ ('user', models.ForeignKey(orm['auth.user'], null=False))
+ ))
+ db.create_unique('plugins_latestnodetypesplugin_authors', ['latestnodetypesplugin_id', 'user_id'])
+
+ def backwards(self, orm):
+
+ # Adding field 'LatestNodetypesPlugin.metatype'
+ db.add_column('cmsplugin_latestnodetypesplugin', 'metatype', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['gstudio.Metatype'], null=True, blank=True), keep_default=False)
+
+ # Adding field 'LatestNodetypesPlugin.author'
+ db.add_column('cmsplugin_latestnodetypesplugin', 'author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True), keep_default=False)
+
+ # Removing M2M table for field tags on 'LatestNodetypesPlugin'
+ db.delete_table('plugins_latestnodetypesplugin_tags')
+
+ # Removing M2M table for field metatypes on 'LatestNodetypesPlugin'
+ db.delete_table('plugins_latestnodetypesplugin_metatypes')
+
+ # Removing M2M table for field authors on 'LatestNodetypesPlugin'
+ db.delete_table('plugins_latestnodetypesplugin_authors')
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'cms.cmsplugin': {
+ 'Meta': {'object_name': 'CMSPlugin'},
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'language': ('django.db.models.fields.CharField', [], {'max_length': '5', 'db_index': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
+ 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
+ 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'publisher_is_draft': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True', 'blank': 'True'}),
+ 'publisher_public': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'publisher_draft'", 'unique': 'True', 'null': 'True', 'to': "orm['cms.CMSPlugin']"}),
+ 'publisher_state': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'cms.placeholder': {
+ 'Meta': {'object_name': 'Placeholder'},
+ 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'plugins.latestnodetypesplugin': {
+ 'Meta': {'object_name': 'LatestNodetypesPlugin', 'db_table': "'cmsplugin_latestnodetypesplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'metatypes': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['gstudio.Metatype']", 'null': 'True', 'blank': 'True'}),
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_nodetypes': ('django.db.models.fields.IntegerField', [], {'default': '5'}),
+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['tagging.Tag']", 'null': 'True', 'blank': 'True'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'plugins.selectednodetypesplugin': {
+ 'Meta': {'object_name': 'SelectedNodetypesPlugin', 'db_table': "'cmsplugin_selectednodetypesplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'nodetypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gstudio.Nodetype']", 'symmetrical': 'False'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'sites.site': {
+ 'Meta': {'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'tagging.tag': {
+ 'Meta': {'object_name': 'Tag'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'})
+ },
+ 'gstudio.metatype': {
+ 'Meta': {'object_name': 'Metatype'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'gstudio.nodetype': {
+ 'Meta': {'object_name': 'Nodetype'},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'metatypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gstudio.Metatype']", 'symmetrical': 'False'}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'related': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'related_rel_+'", 'null': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ }
+ }
+
+ complete_apps = ['plugins']
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0004_auto__add_field_latestnodetypesplugin_submetatypes.py b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0004_auto__add_field_latestnodetypesplugin_submetatypes.py
new file mode 100644
index 0000000..1d21430
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0004_auto__add_field_latestnodetypesplugin_submetatypes.py
@@ -0,0 +1,142 @@
+from south.db import db
+from south.v2 import SchemaMigration
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'LatestNodetypesPlugin.submetatypes'
+ db.add_column('cmsplugin_latestnodetypesplugin', 'submetatypes', self.gf('django.db.models.fields.BooleanField')(default=True), keep_default=False)
+
+ def backwards(self, orm):
+
+ # Deleting field 'LatestNodetypesPlugin.submetatypes'
+ db.delete_column('cmsplugin_latestnodetypesplugin', 'submetatypes')
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'cms.cmsplugin': {
+ 'Meta': {'object_name': 'CMSPlugin'},
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
+ 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
+ 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'publisher_is_draft': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
+ 'publisher_public': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'publisher_draft'", 'unique': 'True', 'null': 'True', 'to': "orm['cms.CMSPlugin']"}),
+ 'publisher_state': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'cms.placeholder': {
+ 'Meta': {'object_name': 'Placeholder'},
+ 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'plugins.latestnodetypesplugin': {
+ 'Meta': {'object_name': 'LatestNodetypesPlugin', 'db_table': "'cmsplugin_latestnodetypesplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'metatypes': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['gstudio.Metatype']", 'null': 'True', 'blank': 'True'}),
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_nodetypes': ('django.db.models.fields.IntegerField', [], {'default': '5'}),
+ 'submetatypes': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['tagging.Tag']", 'null': 'True', 'blank': 'True'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'plugins.selectednodetypesplugin': {
+ 'Meta': {'object_name': 'SelectedNodetypesPlugin', 'db_table': "'cmsplugin_selectednodetypesplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'nodetypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gstudio.Nodetype']", 'symmetrical': 'False'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'sites.site': {
+ 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'tagging.tag': {
+ 'Meta': {'ordering': "('name',)", 'object_name': 'Tag'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'})
+ },
+ 'gstudio.metatype': {
+ 'Meta': {'ordering': "['title']", 'object_name': 'Metatype'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['gstudio.Metatype']"}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'gstudio.nodetype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Nodetype'},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'metatypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gstudio.Metatype']", 'symmetrical': 'False'}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'login_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'pingback_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'related': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'related_rel_+'", 'null': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'template': ('django.db.models.fields.CharField', [], {'max_length': '250'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ }
+ }
+
+ complete_apps = ['plugins']
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0005_auto__add_randomnodetypesplugin.py b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0005_auto__add_randomnodetypesplugin.py
new file mode 100644
index 0000000..6c8bc5c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/0005_auto__add_randomnodetypesplugin.py
@@ -0,0 +1,151 @@
+from south.db import db
+from south.v2 import SchemaMigration
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding model 'RandomNodetypesPlugin'
+ db.create_table('cmsplugin_randomnodetypesplugin', (
+ ('cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)),
+ ('number_of_nodetypes', self.gf('django.db.models.fields.IntegerField')(default=5)),
+ ('template_to_render', self.gf('django.db.models.fields.CharField')(max_length=250, blank=True)),
+ ))
+ db.send_create_signal('plugins', ['RandomNodetypesPlugin'])
+
+ def backwards(self, orm):
+
+ # Deleting model 'RandomNodetypesPlugin'
+ db.delete_table('cmsplugin_randomnodetypesplugin')
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'cms.cmsplugin': {
+ 'Meta': {'object_name': 'CMSPlugin'},
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
+ 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
+ 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'cms.placeholder': {
+ 'Meta': {'object_name': 'Placeholder'},
+ 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'plugins.latestnodetypesplugin': {
+ 'Meta': {'object_name': 'LatestNodetypesPlugin', 'db_table': "'cmsplugin_latestnodetypesplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'metatypes': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['gstudio.Metatype']", 'null': 'True', 'blank': 'True'}),
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_nodetypes': ('django.db.models.fields.IntegerField', [], {'default': '5'}),
+ 'submetatypes': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['tagging.Tag']", 'null': 'True', 'blank': 'True'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'plugins.randomnodetypesplugin': {
+ 'Meta': {'object_name': 'RandomNodetypesPlugin', 'db_table': "'cmsplugin_randomnodetypesplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_nodetypes': ('django.db.models.fields.IntegerField', [], {'default': '5'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'plugins.selectednodetypesplugin': {
+ 'Meta': {'object_name': 'SelectedNodetypesPlugin', 'db_table': "'cmsplugin_selectednodetypesplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'nodetypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['gstudio.Nodetype']", 'symmetrical': 'False'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'sites.site': {
+ 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'tagging.tag': {
+ 'Meta': {'ordering': "('name',)", 'object_name': 'Tag'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'})
+ },
+ 'gstudio.metatype': {
+ 'Meta': {'ordering': "['title']", 'object_name': 'Metatype'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['gstudio.Metatype']"}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'gstudio.nodetype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Nodetype'},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'metatypes': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['gstudio.Metatype']", 'null': 'True', 'blank': 'True'}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'login_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'pingback_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'related': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'related_rel_+'", 'null': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'template': ('django.db.models.fields.CharField', [], {'default': "'gstudio/nodetype_detail.html'", 'max_length': '250'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ }
+ }
+
+ complete_apps = ['plugins']
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/migrations/__init__.py b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/__init__.py
new file mode 100644
index 0000000..d8c89e8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/migrations/__init__.py
@@ -0,0 +1 @@
+"""Migrations for Gstudio Plugins"""
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/models.py b/build/lib.linux-i686-2.6/gstudio/plugins/models.py
new file mode 100644
index 0000000..a13bc8a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/models.py
@@ -0,0 +1,170 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Models of Gstudio CMS Plugins"""
+from django.db import models
+from django.contrib.auth.models import User
+from django.db.models.signals import post_save
+from django.db.models.signals import post_delete
+from django.utils.translation import ugettext_lazy as _
+
+from tagging.models import Tag
+from cms.models import CMSPlugin
+from menus.menu_pool import menu_pool
+
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+from gstudio.plugins.settings import PLUGINS_TEMPLATES
+
+TEMPLATES = [('gstudio/cms/nodetype_list.html', _('Nodetype list (default)')),
+ ('gstudio/cms/nodetype_detail.html', _('Nodetype detailed'))] + \
+ PLUGINS_TEMPLATES
+
+
+class LatestNodetypesPlugin(CMSPlugin):
+ """CMS Plugin for displaying latest nodetypes"""
+
+ metatypes = models.ManyToManyField(
+ Metatype, verbose_name=_('metatypes'),
+ blank=True, null=True)
+ submetatypes = models.BooleanField(
+ default=True, verbose_name=_('include submetatypes'))
+ authors = models.ManyToManyField(
+ User, verbose_name=_('authors'), blank=True, null=True)
+ tags = models.ManyToManyField(
+ Tag, verbose_name=_('tags'), blank=True, null=True)
+
+ number_of_nodetypes = models.IntegerField(
+ _('number of nodetypes'), default=5)
+ template_to_render = models.CharField(
+ _('template'), blank=True,
+ max_length=250, choices=TEMPLATES,
+ help_text=_('Template used to display the plugin'))
+
+ @property
+ def render_template(self):
+ """Override render_template to use
+ the template_to_render attribute"""
+ return self.template_to_render
+
+ def copy_relations(self, old_instance):
+ """Duplicate ManyToMany relations on plugin copy"""
+ self.tags = old_instance.tags.all()
+ self.authors = old_instance.authors.all()
+ self.metatypes = old_instance.metatypes.all()
+
+ def __unicode__(self):
+ return _('%s nodetypes') % self.number_of_nodetypes
+
+
+class SelectedNodetypesPlugin(CMSPlugin):
+ """CMS Plugin for displaying custom nodetypes"""
+
+ nodetypes = models.ManyToManyField(
+ Nodetype, verbose_name=_('nodetypes'))
+ template_to_render = models.CharField(
+ _('template'), blank=True,
+ max_length=250, choices=TEMPLATES,
+ help_text=_('Template used to display the plugin'))
+
+ @property
+ def render_template(self):
+ """Override render_template to use
+ the template_to_render attribute"""
+ return self.template_to_render
+
+ def copy_relations(self, old_instance):
+ """Duplicate ManyToMany relations on plugin copy"""
+ self.nodetypes = old_instance.nodetypes.all()
+
+ def __unicode__(self):
+ return _('%s nodetypes') % self.nodetypes.count()
+
+
+class RandomNodetypesPlugin(CMSPlugin):
+ """CMS Plugin for displaying random nodetypes"""
+
+ number_of_nodetypes = models.IntegerField(
+ _('number of nodetypes'), default=5)
+ template_to_render = models.CharField(
+ _('template'), blank=True,
+ max_length=250, choices=TEMPLATES,
+ help_text=_('Template used to display the plugin'))
+
+ def __unicode__(self):
+ return _('%s nodetypes') % self.number_of_nodetypes
+
+
+def invalidate_menu_cache(sender, **kwargs):
+ """Signal receiver to invalidate the menu_pool
+ cache when a nodetype is posted"""
+ menu_pool.clear()
+
+post_save.connect(
+ invalidate_menu_cache, sender=Nodetype,
+ dispatch_uid='gstudio.nodetype.postsave.invalidate_menu_cache')
+post_delete.connect(
+ invalidate_menu_cache, sender=Nodetype,
+ dispatch_uid='gstudio.nodetype.postdelete.invalidate_menu_cache')
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/placeholder.py b/build/lib.linux-i686-2.6/gstudio/plugins/placeholder.py
new file mode 100644
index 0000000..dc93640
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/placeholder.py
@@ -0,0 +1,66 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Placeholder model for Gstudio"""
+from cms.models.fields import PlaceholderField
+
+from gstudio.models import Nodetype
+
+
+class NodetypePlaceholder(Nodetype):
+ """Nodetype with a Placeholder to edit content"""
+
+ content_placeholder = PlaceholderField('content')
+
+ class Meta:
+ """NodetypePlaceholder's Meta"""
+ abstract = True
diff --git a/build/lib.linux-i686-2.6/gstudio/plugins/settings.py b/build/lib.linux-i686-2.6/gstudio/plugins/settings.py
new file mode 100644
index 0000000..4202c5d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/plugins/settings.py
@@ -0,0 +1,93 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Settings of Gstudio.plugins"""
+import warnings
+
+from django.conf import settings
+from django.utils.importlib import import_module
+
+
+HIDE_NODETYPE_MENU = getattr(settings, 'GSTUDIO_HIDE_NODETYPE_MENU', True)
+
+PLUGINS_TEMPLATES = getattr(settings, 'GSTUDIO_PLUGINS_TEMPLATES', [])
+
+
+APP_MENUS = []
+DEFAULT_APP_MENUS = ['gstudio.plugins.menu.NodetypeMenu',
+ 'gstudio.plugins.menu.MetatypeMenu',
+ 'gstudio.plugins.menu.TagMenu',
+ 'gstudio.plugins.menu.AuthorMenu']
+
+for menu_string in getattr(settings, 'GSTUDIO_APP_MENUS', DEFAULT_APP_MENUS):
+ try:
+ dot = menu_string.rindex('.')
+ menu_module = menu_string[:dot]
+ menu_name = menu_string[dot + 1:]
+ APP_MENUS.append(getattr(import_module(menu_module), menu_name))
+ except (ImportError, AttributeError):
+ warnings.warn('%s menu cannot be imported' % menu_string,
+ RuntimeWarning)
diff --git a/build/lib.linux-i686-2.6/gstudio/rdf.py b/build/lib.linux-i686-2.6/gstudio/rdf.py
new file mode 100644
index 0000000..771490b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/rdf.py
@@ -0,0 +1,120 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+import rdflib
+from rdflib.graph import ConjunctiveGraph as Graph
+from rdflib import plugin
+from rdflib.store import Store, NO_STORE, VALID_STORE
+from rdflib.namespace import Namespace
+from rdflib.term import Literal
+from rdflib.term import URIRef
+from tempfile import mkdtemp
+from gstudio.models import *
+
+def rdf_description(name, notation='xml' ):
+ """
+ Funtion takes title of node, and rdf notation.
+ """
+ valid_formats = ["xml", "n3", "ntriples", "trix"]
+ default_graph_uri = "http://gstudio.gnowledge.org/rdfstore"
+ configString = "/var/tmp/rdfstore"
+
+ # Get the Sleepycat plugin.
+ store = plugin.get('Sleepycat', Store)('rdfstore')
+
+ # Open previously created store, or create it if it doesn't exist yet
+ graph = Graph(store="Sleepycat",
+ identifier = URIRef(default_graph_uri))
+ path = mkdtemp()
+ rt = graph.open(path, create=False)
+ if rt == NO_STORE:
+ #There is no underlying Sleepycat infrastructure, create it
+ graph.open(path, create=True)
+ else:
+ assert rt == VALID_STORE, "The underlying store is corrupt"
+
+
+ # Now we'll add some triples to the graph & commit the changes
+ rdflib = Namespace('http://sbox.gnowledge.org/gstudio/')
+ graph.bind("gstudio", "http://gnowledge.org/")
+ exclusion_fields = ["id", "rght", "node_ptr_id", "image", "lft", "_state", "_altnames_cache", "_tags_cache", "nid_ptr_id", "_mptt_cached_fields"]
+ node=Objecttype.objects.get(title=name)
+ node_dict=node.__dict__
+
+ subject=str(node_dict['id'])
+ for key in node_dict:
+ if key not in exclusion_fields:
+ predicate=str(key)
+ pobject=str(node_dict[predicate])
+ graph.add((rdflib[subject], rdflib[predicate], Literal(pobject)))
+
+
+ graph.commit()
+
+ print graph.serialize(format=notation)
+
+ graph.close()
+
diff --git a/build/lib.linux-i686-2.6/gstudio/search.py b/build/lib.linux-i686-2.6/gstudio/search.py
new file mode 100644
index 0000000..adbb037
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/search.py
@@ -0,0 +1,181 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Search module with complex query parsing for Gstudio"""
+from pyparsing import Word
+from pyparsing import alphas
+from pyparsing import WordEnd
+from pyparsing import Combine
+from pyparsing import opAssoc
+from pyparsing import Optional
+from pyparsing import OneOrMore
+from pyparsing import StringEnd
+from pyparsing import printables
+from pyparsing import quotedString
+from pyparsing import removeQuotes
+from pyparsing import ParseResults
+from pyparsing import CaselessLiteral
+from pyparsing import operatorPrecedence
+
+from django.db.models import Q
+
+from gstudio.models import Nodetype
+from gstudio.settings import STOP_WORDS
+
+
+def createQ(token):
+ """Creates the Q() object"""
+ meta = getattr(token, 'meta', None)
+ query = getattr(token, 'query', '')
+ wildcards = None
+
+ if isinstance(query, basestring): # Unicode -> Quoted string
+ search = query
+ else: # List -> No quoted string (possible wildcards)
+ if len(query) == 1:
+ search = query[0]
+ elif len(query) == 3:
+ wildcards = 'BOTH'
+ search = query[1]
+ elif len(query) == 2:
+ if query[0] == '*':
+ wildcards = 'START'
+ search = query[1]
+ else:
+ wildcards = 'END'
+ search = query[0]
+
+ # Ignore connective words (of, a, an...) and STOP_WORDS
+ if (len(search) < 3 and not search.isdigit()) or \
+ search in STOP_WORDS:
+ return Q()
+
+ if not meta:
+ return Q(content__icontains=search) | \
+ Q(excerpt__icontains=search) | \
+ Q(title__icontains=search)
+
+ if meta == 'metatype':
+ if wildcards == 'BOTH':
+ return Q(metatypes__title__icontains=search) | \
+ Q(metatypes__slug__icontains=search)
+ elif wildcards == 'START':
+ return Q(metatypes__title__iendswith=search) | \
+ Q(metatypes__slug__iendswith=search)
+ elif wildcards == 'END':
+ return Q(metatypes__title__istartswith=search) | \
+ Q(metatypes__slug__istartswith=search)
+ else:
+ return Q(metatypes__title__iexact=search) | \
+ Q(metatypes__slug__iexact=search)
+ elif meta == 'author':
+ if wildcards == 'BOTH':
+ return Q(authors__username__icontains=search)
+ elif wildcards == 'START':
+ return Q(authors__username__iendswith=search)
+ elif wildcards == 'END':
+ return Q(authors__username__istartswith=search)
+ else:
+ return Q(authors__username__iexact=search)
+ elif meta == 'tag': # TODO: tags ignore wildcards
+ return Q(tags__icontains=search)
+
+
+def unionQ(token):
+ """Appends all the Q() objects"""
+ query = Q()
+ operation = 'and'
+ negation = False
+
+ for t in token:
+ if type(t) is ParseResults: # See tokens recursively
+ query &= unionQ(t)
+ else:
+ if t in ('or', 'and'): # Set the new op and go to next token
+ operation = t
+ elif t == '-': # Next tokens needs to be negated
+ negation = True
+ else: # Append to query the token
+ if negation:
+ t = ~t
+ if operation == 'or':
+ query |= t
+ else:
+ query &= t
+ return query
+
+
+NO_BRTS = printables.replace('(', '').replace(')', '')
+SINGLE = Word(NO_BRTS.replace('*', ''))
+WILDCARDS = Optional('*') + SINGLE + Optional('*') + WordEnd(wordChars=NO_BRTS)
+QUOTED = quotedString.setParseAction(removeQuotes)
+
+OPER_AND = CaselessLiteral('and')
+OPER_OR = CaselessLiteral('or')
+OPER_NOT = '-'
+
+TERM = Combine(Optional(Word(alphas).setResultsName('meta') + ':') +
+ (QUOTED.setResultsName('query') |
+ WILDCARDS.setResultsName('query')))
+TERM.setParseAction(createQ)
+
+EXPRESSION = operatorPrecedence(TERM, [
+ (OPER_NOT, 1, opAssoc.RIGHT),
+ (OPER_OR, 2, opAssoc.LEFT),
+ (Optional(OPER_AND, default='and'), 2, opAssoc.LEFT)])
+EXPRESSION.setParseAction(unionQ)
+
+QUERY = OneOrMore(EXPRESSION) + StringEnd()
+QUERY.setParseAction(unionQ)
+
+
+def advanced_search(pattern):
+ """Parse the grammar of a pattern
+ and build a queryset with it"""
+ query_parsed = QUERY.parseString(pattern)
+ return Nodetype.published.filter(query_parsed[0]).distinct()
diff --git a/build/lib.linux-i686-2.6/gstudio/settings.py b/build/lib.linux-i686-2.6/gstudio/settings.py
new file mode 100644
index 0000000..dceb80f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/settings.py
@@ -0,0 +1,154 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
+"""Settings of Gstudio"""
+from django.conf import settings
+
+PING_DIRECTORIES = getattr(settings, 'GSTUDIO_PING_DIRECTORIES',
+ ('http://django-gstudio.com/xmlrpc/',))
+SAVE_PING_DIRECTORIES = getattr(settings, 'GSTUDIO_SAVE_PING_DIRECTORIES',
+ bool(PING_DIRECTORIES))
+SAVE_PING_EXTERNAL_URLS = getattr(settings, 'GSTUDIO_PING_EXTERNAL_URLS', True)
+
+COPYRIGHT = getattr(settings, 'GSTUDIO_COPYRIGHT', 'Gstudio')
+
+PAGINATION = getattr(settings, 'GSTUDIO_PAGINATION', 10)
+ALLOW_EMPTY = getattr(settings, 'GSTUDIO_ALLOW_EMPTY', True)
+ALLOW_FUTURE = getattr(settings, 'GSTUDIO_ALLOW_FUTURE', True)
+
+NODETYPE_TEMPLATES = getattr(settings, 'GSTUDIO_NODETYPE_TEMPLATES', [])
+NODETYPE_BASE_MODEL = getattr(settings, 'GSTUDIO_NODETYPE_BASE_MODEL', '')
+
+MARKUP_LANGUAGE = getattr(settings, 'GSTUDIO_MARKUP_LANGUAGE', 'html')
+
+MARKDOWN_EXTENSIONS = getattr(settings, 'GSTUDIO_MARKDOWN_EXTENSIONS', '')
+
+WYSIWYG_MARKUP_MAPPING = {
+ 'textile': 'markitup',
+ 'markdown': 'markitup',
+ 'restructuredtext': 'markitup',
+ 'html': 'tinymce' in settings.INSTALLED_APPS and 'tinymce' or 'wymeditor'}
+
+WYSIWYG = getattr(settings, 'GSTUDIO_WYSIWYG',
+ WYSIWYG_MARKUP_MAPPING.get(MARKUP_LANGUAGE))
+
+AUTO_CLOSE_COMMENTS_AFTER = getattr(
+ settings, 'GSTUDIO_AUTO_CLOSE_COMMENTS_AFTER', None)
+
+AUTO_MODERATE_COMMENTS = getattr(settings, 'GSTUDIO_AUTO_MODERATE_COMMENTS',
+ False)
+
+MAIL_COMMENT_REPLY = getattr(settings, 'GSTUDIO_MAIL_COMMENT_REPLY', False)
+
+MAIL_COMMENT_AUTHORS = getattr(settings, 'GSTUDIO_MAIL_COMMENT_AUTHORS', True)
+
+MAIL_COMMENT_NOTIFICATION_RECIPIENTS = getattr(
+ settings, 'GSTUDIO_MAIL_COMMENT_NOTIFICATION_RECIPIENTS',
+ [manager_tuple[1] for manager_tuple in settings.MANAGERS])
+
+UPLOAD_TO = getattr(settings, 'GSTUDIO_UPLOAD_TO', 'uploads')
+
+PROTOCOL = getattr(settings, 'GSTUDIO_PROTOCOL', 'http')
+
+FEEDS_FORMAT = getattr(settings, 'GSTUDIO_FEEDS_FORMAT', 'rss')
+FEEDS_MAX_ITEMS = getattr(settings, 'GSTUDIO_FEEDS_MAX_ITEMS', 15)
+
+PINGBACK_CONTENT_LENGTH = getattr(settings,
+ 'GSTUDIO_PINGBACK_CONTENT_LENGTH', 300)
+
+F_MIN = getattr(settings, 'GSTUDIO_F_MIN', 0.1)
+F_MAX = getattr(settings, 'GSTUDIO_F_MAX', 1.0)
+
+SPAM_CHECKER_BACKENDS = getattr(settings, 'GSTUDIO_SPAM_CHECKER_BACKENDS',
+ ())
+
+URL_SHORTENER_BACKEND = getattr(settings, 'GSTUDIO_URL_SHORTENER_BACKEND',
+ 'gstudio.url_shortener.backends.default')
+
+STOP_WORDS = getattr(settings, 'GSTUDIO_STOP_WORDS',
+ ('able', 'about', 'across', 'after', 'all', 'almost',
+ 'also', 'among', 'and', 'any', 'are', 'because', 'been',
+ 'but', 'can', 'cannot', 'could', 'dear', 'did', 'does',
+ 'either', 'else', 'ever', 'every', 'for', 'from', 'get',
+ 'got', 'had', 'has', 'have', 'her', 'hers', 'him', 'his',
+ 'how', 'however', 'into', 'its', 'just', 'least', 'let',
+ 'like', 'likely', 'may', 'might', 'most', 'must',
+ 'neither', 'nor', 'not', 'off', 'often', 'only', 'other',
+ 'our', 'own', 'rather', 'said', 'say', 'says', 'she',
+ 'should', 'since', 'some', 'than', 'that', 'the',
+ 'their', 'them', 'then', 'there', 'these', 'they',
+ 'this', 'tis', 'too', 'twas', 'wants', 'was', 'were',
+ 'what', 'when', 'where', 'which', 'while', 'who', 'whom',
+ 'why', 'will', 'with', 'would', 'yet', 'you', 'your'))
+
+TWITTER_CONSUMER_KEY = getattr(settings, 'TWITTER_CONSUMER_KEY', '')
+TWITTER_CONSUMER_SECRET = getattr(settings, 'TWITTER_CONSUMER_SECRET', '')
+TWITTER_ACCESS_KEY = getattr(settings, 'TWITTER_ACCESS_KEY', '')
+TWITTER_ACCESS_SECRET = getattr(settings, 'TWITTER_ACCESS_SECRET', '')
+
+USE_TWITTER = getattr(settings, 'GSTUDIO_USE_TWITTER',
+ bool(TWITTER_ACCESS_KEY and TWITTER_ACCESS_SECRET and \
+ TWITTER_CONSUMER_KEY and TWITTER_CONSUMER_SECRET))
diff --git a/build/lib.linux-i686-2.6/gstudio/signals.py b/build/lib.linux-i686-2.6/gstudio/signals.py
new file mode 100644
index 0000000..66c9abf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/signals.py
@@ -0,0 +1,121 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Signal handlers of Gstudio"""
+import inspect
+from functools import wraps
+
+from django.db.models.signals import post_save
+
+from gstudio import settings
+
+
+def disable_for_loaddata(signal_handler):
+ """Decorator for disabling signals sent
+ by 'post_save' on loaddata command.
+ http://code.djangoproject.com/ticket/8399"""
+
+ @wraps(signal_handler)
+ def wrapper(*args, **kwargs):
+ for fr in inspect.stack():
+ if inspect.getmodulename(fr[1]) == 'loaddata':
+ return
+ signal_handler(*args, **kwargs)
+
+ return wrapper
+
+
+@disable_for_loaddata
+def ping_directories_handler(sender, **kwargs):
+ """Ping Directories when a nodetype is saved"""
+ nodetype = kwargs['instance']
+
+ if nodetype.is_visible and settings.SAVE_PING_DIRECTORIES:
+ from gstudio.ping import DirectoryPinger
+
+ for directory in settings.PING_DIRECTORIES:
+ DirectoryPinger(directory, [nodetype])
+
+
+@disable_for_loaddata
+def ping_external_urls_handler(sender, **kwargs):
+ """Ping Externals URLS when a nodetype is saved"""
+ nodetype = kwargs['instance']
+
+ if nodetype.is_visible and settings.SAVE_PING_EXTERNAL_URLS:
+ from gstudio.ping import ExternalUrlsPinger
+
+ ExternalUrlsPinger(nodetype)
+
+
+def disconnect_gstudio_signals():
+ """Disconnect all the signals provided by Gstudio"""
+ from gstudio.models import Nodetype
+
+ post_save.disconnect(
+ sender=Nodetype, dispatch_uid='gstudio.nodetype.post_save.ping_directories')
+ post_save.disconnect(
+ sender=Nodetype, dispatch_uid='gstudio.nodetype.post_save.ping_external_urls')
diff --git a/build/lib.linux-i686-2.6/gstudio/sitemaps.py b/build/lib.linux-i686-2.6/gstudio/sitemaps.py
new file mode 100644
index 0000000..5ed1720
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/sitemaps.py
@@ -0,0 +1,183 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Sitemaps for Gstudio"""
+from django.contrib.sitemaps import Sitemap
+from django.core.urlresolvers import reverse
+
+from tagging.models import TaggedItem
+
+from gstudio.models import Nodetype
+from gstudio.models import Author
+from gstudio.models import Metatype
+from gstudio.managers import tags_published
+
+
+class NodetypeSitemap(Sitemap):
+ """Sitemap for nodetypes"""
+ priority = 0.5
+ changefreq = 'weekly'
+
+ def items(self):
+ """Return published nodetypes"""
+ return Nodetype.published.all()
+
+ def lastmod(self, obj):
+ """Return last modification of a nodetype"""
+ return obj.last_update
+
+
+class MetatypeSitemap(Sitemap):
+ """Sitemap for metatypes"""
+ changefreq = 'monthly'
+
+ def cache(self, metatypes):
+ """Cache categorie's nodetypes percent on total nodetypes"""
+ len_nodetypes = float(Nodetype.published.count())
+ self.cache_metatypes = {}
+ for cat in metatypes:
+ if len_nodetypes:
+ self.cache_metatypes[cat.pk] = cat.nodetypes_published(
+ ).count() / len_nodetypes
+ else:
+ self.cache_metatypes[cat.pk] = 0.0
+
+ def items(self):
+ """Return all metatypes with coeff"""
+ metatypes = Metatype.objects.all()
+ self.cache(metatypes)
+ return metatypes
+
+ def lastmod(self, obj):
+ """Return last modification of a metatype"""
+ nodetypes = obj.nodetypes_published()
+ if not nodetypes:
+ return None
+ return nodetypes[0].creation_date
+
+ def priority(self, obj):
+ """Compute priority with cached coeffs"""
+ priority = 0.5 + self.cache_metatypes[obj.pk]
+ if priority > 1.0:
+ priority = 1.0
+ return '%.1f' % priority
+
+
+class AuthorSitemap(Sitemap):
+ """Sitemap for authors"""
+ priority = 0.5
+ changefreq = 'monthly'
+
+ def items(self):
+ """Return published authors"""
+ return Author.published.all()
+
+ def lastmod(self, obj):
+ """Return last modification of an author"""
+ nodetypes = obj.nodetypes_published()
+ if not nodetypes:
+ return None
+ return nodetypes[0].creation_date
+
+ def location(self, obj):
+ """Return url of an author"""
+ return reverse('gstudio_author_detail', args=[obj.username])
+
+
+class TagSitemap(Sitemap):
+ """Sitemap for tags"""
+ changefreq = 'monthly'
+
+ def cache(self, tags):
+ """Cache tag's nodetypes percent on total nodetypes"""
+ len_nodetypes = float(Nodetype.published.count())
+ self.cache_tags = {}
+ for tag in tags:
+ nodetypes = TaggedItem.objects.get_by_model(
+ Nodetype.published.all(), tag)
+ self.cache_tags[tag.pk] = (nodetypes, nodetypes.count() / len_nodetypes)
+
+ def items(self):
+ """Return all tags with coeff"""
+ tags = tags_published()
+ self.cache(tags)
+ return tags
+
+ def lastmod(self, obj):
+ """Return last modification of a tag"""
+ nodetypes = self.cache_tags[obj.pk][0]
+ return nodetypes[0].creation_date
+
+ def priority(self, obj):
+ """Compute priority with cached coeffs"""
+ priority = 0.5 + self.cache_tags[obj.pk][1]
+ if priority > 1.0:
+ priority = 1.0
+ return '%.1f' % priority
+
+ def location(self, obj):
+ """Return url of a tag"""
+ return reverse('gstudio_tag_detail', args=[obj.name])
diff --git a/build/lib.linux-i686-2.6/gstudio/spam_checker/__init__.py b/build/lib.linux-i686-2.6/gstudio/spam_checker/__init__.py
new file mode 100644
index 0000000..b07b175
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/spam_checker/__init__.py
@@ -0,0 +1,100 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Spam checker for Gstudio"""
+import warnings
+
+from django.utils.importlib import import_module
+from django.core.exceptions import ImproperlyConfigured
+
+from gstudio.settings import SPAM_CHECKER_BACKENDS
+
+
+def get_spam_checker(backend_path):
+ """Return the selected spam checker backend"""
+ try:
+ backend_module = import_module(backend_path)
+ backend = getattr(backend_module, 'backend')
+ except (ImportError, AttributeError):
+ warnings.warn('%s backend cannot be imported' % backend_path,
+ RuntimeWarning)
+ backend = None
+ except ImproperlyConfigured, e:
+ warnings.warn(str(e), RuntimeWarning)
+ backend = None
+
+ return backend
+
+
+def check_is_spam(content, content_object, request,
+ backends=SPAM_CHECKER_BACKENDS):
+ """Return True if the content is a spam, else False"""
+ for backend_path in backends:
+ spam_checker = get_spam_checker(backend_path)
+ is_spam = spam_checker(content, content_object, request)
+ if is_spam:
+ return True
+
+ return False
diff --git a/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/__init__.py b/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/__init__.py
new file mode 100644
index 0000000..da6cf49
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/__init__.py
@@ -0,0 +1 @@
+"""Shortlink backends for Gstudio"""
diff --git a/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/all_is_spam.py b/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/all_is_spam.py
new file mode 100644
index 0000000..8964aa3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/all_is_spam.py
@@ -0,0 +1,72 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""All is spam, spam checker backend for Gstudio"""
+
+
+def backend(comment, content_object, request):
+ """Backend for setting all comments to spam"""
+ return True
diff --git a/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/automattic.py b/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/automattic.py
new file mode 100644
index 0000000..0adf0e8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/automattic.py
@@ -0,0 +1,108 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Akismet spam checker backend for Gstudio"""
+from django.conf import settings
+from django.utils.encoding import smart_str
+from django.contrib.sites.models import Site
+from django.core.exceptions import ImproperlyConfigured
+
+from gstudio.settings import PROTOCOL
+
+try:
+ from akismet import Akismet
+ from akismet import APIKeyError
+except ImportError:
+ raise ImproperlyConfigured('akismet module is not available')
+
+if not getattr(settings, 'AKISMET_SECRET_API_KEY', ''):
+ raise ImproperlyConfigured('You have to set AKISMET_SECRET_API_KEY')
+
+AKISMET_API_KEY = settings.AKISMET_SECRET_API_KEY
+
+
+def backend(comment, content_object, request):
+ """Akismet spam checker backend for Gstudio"""
+ blog_url = '%s://%s/' % (PROTOCOL, Site.objects.get_current().domain)
+
+ akismet = Akismet(key=AKISMET_API_KEY, blog_url=blog_url)
+
+ if not akismet.verify_key():
+ raise APIKeyError('Your Akismet API key is invalid.')
+
+ akismet_data = {
+ 'user_ip': request.META.get('REMOTE_ADDR', ''),
+ 'user_agent': request.META.get('HTTP_USER_AGENT', ''),
+ 'referrer': request.META.get('HTTP_REFERER', 'unknown'),
+ 'permalink': content_object.get_absolute_url(),
+ 'comment_type': 'comment',
+ 'comment_author': smart_str(comment.userinfo.get('name', '')),
+ 'comment_author_email': smart_str(comment.userinfo.get('email', '')),
+ 'comment_author_url': smart_str(comment.userinfo.get('url', '')),
+ }
+ is_spam = akismet.comment_check(smart_str(comment.comment),
+ data=akismet_data, build_data=True)
+ return is_spam
diff --git a/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/mollom.py b/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/mollom.py
new file mode 100644
index 0000000..49df00a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/mollom.py
@@ -0,0 +1,106 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Mollom spam checker backend for Gstudio"""
+from django.conf import settings
+from django.utils.encoding import smart_str
+from django.core.exceptions import ImproperlyConfigured
+
+try:
+ from pymollom import MollomAPI
+ from pymollom import MollomFault
+except ImportError:
+ raise ImproperlyConfigured('pymollom module is not available')
+
+if not getattr(settings, 'MOLLOM_PUBLIC_KEY', ''):
+ raise ImproperlyConfigured('You have to set a MOLLOM_PUBLIC_KEY setting')
+
+if not getattr(settings, 'MOLLOM_PRIVATE_KEY', ''):
+ raise ImproperlyConfigured('You have to set a MOLLOM_PRIVATE_KEY setting')
+
+MOLLOM_PUBLIC_KEY = settings.MOLLOM_PUBLIC_KEY
+MOLLOM_PRIVATE_KEY = settings.MOLLOM_PRIVATE_KEY
+
+
+def backend(comment, content_object, request):
+ """Mollom spam checker backend for Gstudio"""
+ mollom_api = MollomAPI(
+ publicKey=MOLLOM_PUBLIC_KEY,
+ privateKey=MOLLOM_PRIVATE_KEY)
+ if not mollom_api.verifyKey():
+ raise MollomFault('Your MOLLOM credentials are invalid.')
+
+ mollom_data = {'authorIP': request.META.get('REMOTE_ADDR', ''),
+ 'authorName': smart_str(comment.userinfo.get('name', '')),
+ 'authorMail': smart_str(comment.userinfo.get('email', '')),
+ 'authorURL': smart_str(comment.userinfo.get('url', ''))}
+
+ cc = mollom_api.checkContent(
+ postTitle=smart_str(content_object.title),
+ postBody=smart_str(comment.comment), **mollom_data)
+ # cc['spam']: 1 for ham, 2 for spam, 3 for unsure;
+ # http://mollom.com/blog/spam-vs-ham
+ if cc['spam'] == 2:
+ return True
+ return False
diff --git a/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/typepad.py b/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/typepad.py
new file mode 100644
index 0000000..6205528
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/spam_checker/backends/typepad.py
@@ -0,0 +1,115 @@
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
+"""TypePad spam checker backend for Gstudio"""
+from django.conf import settings
+from django.utils.encoding import smart_str
+from django.contrib.sites.models import Site
+from django.core.exceptions import ImproperlyConfigured
+
+from gstudio.settings import PROTOCOL
+
+try:
+ from akismet import Akismet
+ from akismet import APIKeyError
+except ImportError:
+ raise ImproperlyConfigured('akismet module is not available')
+
+if not getattr(settings, 'TYPEPAD_SECRET_API_KEY', ''):
+ raise ImproperlyConfigured('You have to set TYPEPAD_SECRET_API_KEY')
+
+TYPEPAD_API_KEY = settings.TYPEPAD_SECRET_API_KEY
+
+
+class TypePad(Akismet):
+ """TypePad version of the Akismet module"""
+ baseurl = 'api.antispam.typepad.com/1.1/'
+
+
+def backend(comment, content_object, request):
+ """TypePad spam checker backend for Gstudio"""
+ blog_url = '%s://%s/' % (PROTOCOL, Site.objects.get_current().domain)
+
+ typepad = TypePad(key=TYPEPAD_API_KEY, blog_url=blog_url)
+
+ if not typepad.verify_key():
+ raise APIKeyError('Your Typepad API key is invalid.')
+
+ typepad_data = {
+ 'user_ip': request.META.get('REMOTE_ADDR', ''),
+ 'user_agent': request.META.get('HTTP_USER_AGENT', ''),
+ 'referrer': request.META.get('HTTP_REFERER', 'unknown'),
+ 'permalink': content_object.get_absolute_url(),
+ 'comment_type': 'comment',
+ 'comment_author': smart_str(comment.userinfo.get('name', '')),
+ 'comment_author_email': smart_str(comment.userinfo.get('email', '')),
+ 'comment_author_url': smart_str(comment.userinfo.get('url', '')),
+ }
+ is_spam = typepad.comment_check(smart_str(comment.comment),
+ data=typepad_data, build_data=True)
+ return is_spam
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/config.rb b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/config.rb
new file mode 100644
index 0000000..accf354
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/config.rb
@@ -0,0 +1,9 @@
+# Require any additional compass plugins here.
+project_type = :stand_alone
+# Set this to the root of your project when deployed:
+http_path = "/"
+css_dir = "."
+sass_dir = "src"
+images_dir = "../img"
+output_style = :compact
+line_comments = false
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/dashboard_gstudio.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/dashboard_gstudio.css
new file mode 100644
index 0000000..d1f4a24
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/dashboard_gstudio.css
@@ -0,0 +1,32 @@
+body.dashboard #content { width: 75%; }
+
+.module { width: 400px; margin-right: 5px; }
+.module table { width: 100%; }
+.module table th, .module table td { font-size: 12px; }
+
+.managelink { background: url("../img/manage.png") no-repeat scroll 0 0.2em transparent; padding-left: 12px; }
+
+.previewlink { background: url("../img/preview.png") no-repeat scroll 0 0.2em transparent; padding-left: 12px; }
+
+input, textarea, select { border: 1px solid #cccccc; }
+
+.vTextField, .vLargeTextField { width: 25em; }
+
+.required label, label.required { color: #333333 !important; font-weight: bold !important; }
+
+.button { float: left; margin-right: 5px; }
+
+#contents th { width: 50%; }
+#contents td { padding-left: 10px; }
+#contents td a { font-weight: bold; }
+
+#quickpost th { width: 20%; vertical-align: middle; }
+#quickpost td { width: 100%; }
+
+#comments th { width: 10%; }
+#comments td { width: 100%; white-space: normal; }
+#comments td a { display: inline; }
+
+#drafts th, #linkbacks th, #comments th { font-weight: normal; }
+#drafts th a, #linkbacks th a, #comments th a { font-weight: bold; }
+#drafts th abbr, #linkbacks th abbr, #comments th abbr { color: #666666; }
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/dashboard_objectapp.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/dashboard_objectapp.css
new file mode 100644
index 0000000..d1f4a24
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/dashboard_objectapp.css
@@ -0,0 +1,32 @@
+body.dashboard #content { width: 75%; }
+
+.module { width: 400px; margin-right: 5px; }
+.module table { width: 100%; }
+.module table th, .module table td { font-size: 12px; }
+
+.managelink { background: url("../img/manage.png") no-repeat scroll 0 0.2em transparent; padding-left: 12px; }
+
+.previewlink { background: url("../img/preview.png") no-repeat scroll 0 0.2em transparent; padding-left: 12px; }
+
+input, textarea, select { border: 1px solid #cccccc; }
+
+.vTextField, .vLargeTextField { width: 25em; }
+
+.required label, label.required { color: #333333 !important; font-weight: bold !important; }
+
+.button { float: left; margin-right: 5px; }
+
+#contents th { width: 50%; }
+#contents td { padding-left: 10px; }
+#contents td a { font-weight: bold; }
+
+#quickpost th { width: 20%; vertical-align: middle; }
+#quickpost td { width: 100%; }
+
+#comments th { width: 10%; }
+#comments td { width: 100%; white-space: normal; }
+#comments td a { display: inline; }
+
+#drafts th, #linkbacks th, #comments th { font-weight: normal; }
+#drafts th a, #linkbacks th a, #comments th a { font-weight: bold; }
+#drafts th abbr, #linkbacks th abbr, #comments th abbr { color: #666666; }
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/grappelli-skin-default.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/grappelli-skin-default.css
new file mode 100644
index 0000000..3cfc545
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/grappelli-skin-default.css
@@ -0,0 +1,1884 @@
+
+
+
+/* TYPOGRAPHY
+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
+
+
+
+/* Paragraphs
+------------------------------------------------------------------------------------------------------ */
+
+.module p.help,
+p.help {
+ color: #999;
+}
+
+p.preview a {
+ display: inline-block;
+ padding: 3px;
+ line-height: 1px;
+ border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px;
+}
+p.preview a:link, p.preview a:visited {
+ border: 1px solid #309bbf;
+}
+p.preview a:hover, p.preview a:active {
+ border: 1px solid #444;
+}
+
+
+
+/* Links
+------------------------------------------------------------------------------------------------------ */
+
+a:link, a:visited {
+ color: #309bbf;
+}
+a:hover, a:active, a.selected {
+ color: #444;
+}
+
+.dashboard h2 a:link, .dashboard h2 a:visited,
+.dashboard h3 a:link, .dashboard h3 a:visited {
+ color: #444;
+}
+.dashboard h2 a:hover, .dashboard h2 a:active,
+.dashboard h3 a:hover, .dashboard h3 a:active {
+ color: #309bbf;
+}
+
+.dashboard h4 a:link, .dashboard h4 a:visited {
+ color: #666;
+}
+.dashboard h4 a:hover, .dashboard h4 a:active {
+ color: #309bbf;
+}
+
+#header a:link, #header a:visited {
+ color: #59AFCC;
+}
+#header a:hover, #header a:active {
+ color: #444;
+}
+
+
+
+/* Blockquote, Pre, Code
+------------------------------------------------------------------------------------------------------ */
+
+blockquote {
+ color: #777;
+ border-left: 5px solid #ddd;
+}
+
+code, pre {
+ color: #666;
+ background: inherit;
+}
+
+pre.literal-block {
+ background: #eee;
+}
+
+code strong {
+ color: #930;
+}
+
+hr {
+ color: #eee;
+ border: 0;
+ background-color: #eee;
+}
+
+
+
+/* RTE (Rich Text Edited)
+------------------------------------------------------------------------------------------------------ */
+
+.rte h3 {
+ border-top: 1px solid #d4d4d4;
+ border-bottom: 1px solid #d4d4d4;
+}
+.rte .group h3 {
+ border-top: 0;
+}
+.rte h3:last-child,
+.rte h4:last-child {
+ border-bottom: 0;
+ border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px;
+}
+.rte td {
+ border-left: 1px solid #f4f4f4;
+}
+.rte td:first-of-type {
+ border-left: 0;
+}
+.delete-confirmation ul.rte>li {
+ border-top: 1px solid #fff;
+ border-bottom: 1px solid #e0e0e0;
+}
+.delete-confirmation ul.rte>li:first-child {
+ border-top: 0;
+}
+.delete-confirmation ul.rte>li:last-child {
+ border-bottom: 0;
+}
+.delete-confirmation ul.rte>li>ul>li {
+ border-top: 1px dashed #e0e0e0;
+}
+.rte blockquote table {
+ border: 1px solid #d4d4d4;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+}
+
+
+
+/* Other Styles
+------------------------------------------------------------------------------------------------------ */
+
+.warning {
+ color: #bf3030;
+}
+.quiet {
+ color: #999;
+}
+
+
+
+/* STRUCTURES
+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
+
+body {
+ color: #444;
+ background: #fff;
+}
+
+
+
+/* Header
+------------------------------------------------------------------------------------------------------ */
+
+#header {
+ color: blue;
+ background: white;
+ background: -moz-linear-gradient(top, white, white);
+ background: -webkit-gradient(linear, left top, left bottom, from(white), to(white));
+ background: -o-linear-gradient(top, white, white);
+}
+#header a:hover, #header a:active {
+ color: #ddd;
+}
+
+
+
+/* Branding, Bookmarks & User-Tools
+------------------------------------------------------------------------------------------------------ */
+
+.branding {
+ border-left: 1px solid #343434;
+ background-color: #262626;
+}
+.admin-title {
+ border-left: 1px solid #404040;
+ border-right: 1px solid #303030;
+}
+
+
+/* User Tools ................................................... */
+
+#user-tools {
+ border-left: 1px solid #303030;
+}
+#user-tools>li {
+ border-left: 1px solid #404040;
+ border-right: 1px solid #303030;
+}
+li.user-options-container.open a.user-options-handler {
+ color: #eee !important;
+}
+li.user-options-container.open ul.user-options {
+ border-top: 1px solid #262626;
+ border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px;
+ background: #333;
+}
+ul.user-options li {
+ border-top: 1px solid #404040;
+ border-bottom: 1px solid #292929;
+}
+ul.user-options li:last-child {
+ border-bottom: 0;
+}
+
+
+/* Navigation Menu (UL Navigation-Menu of Admin-Tools) ................................................... */
+
+ul.navigation-menu>li>a {
+ border-left: 1px solid #404040;
+ border-right: 1px solid #303030;
+}
+ul.navigation-menu>li.bookmark>a {
+ border-right: 0;
+}
+ul.navigation-menu li ul {
+ border-top: 1px solid #2a2a2a;
+ border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px;
+ background: #333;
+}
+ul.navigation-menu li li {
+ border-top: 1px solid #404040;
+ border-bottom: 1px solid #2a2a2a;
+}
+
+ul.navigation-menu li li li {
+ border-top: 1px solid #303030;
+ border-bottom: 1px solid #303030;
+ border-bottom: 0;
+}
+ul.navigation-menu li li li li {
+ border-top: 1px solid #383838;
+ border-bottom: 1px solid #383838;
+ border-bottom: 0;
+}
+ul.navigation-menu li li li li li {
+ border-top: 1px solid #404040;
+ border-bottom: 1px solid #383838;
+ border-bottom: 0;
+}
+ul.navigation-menu>li>ul>li.parent {
+ border-top: 1px solid #404040;
+ border-bottom: 1px solid #2a2a2a;
+}
+ul.navigation-menu li ul ul {
+ border-top: 0;
+ border-bottom: 0;
+ background: transparent;
+}
+ul.navigation-menu li.menu-item.last {
+ border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px;
+}
+
+ul.navigation-menu li ul ul>li:first-child a {
+ border-bottom: 0;
+}
+ul.navigation-menu li ul ul ul>li:first-child a {
+ border-bottom: 0;
+}
+ul.navigation-menu li ul ul ul ul>li:first-child a {
+ border-bottom: 0;
+}
+ul.navigation-menu li ul ul ul ul>li:first-child a {
+ border-bottom: 0;
+}
+ul.navigation-menu li.collapse.open>a.collapse-handler,
+ul.navigation-menu li.bookmark.disabled>a,
+ul.navigation-menu li.collapse.open + li.actions {
+ color: #eee !important;
+}
+ul.navigation-menu li.bookmark.disabled>a {
+ cursor: default !important;
+}
+
+form#bookmark-form {
+ border-right: 1px solid #303030;
+}
+form#bookmark-form button {
+/* border: 1px solid #2e2e2e;*/
+/* border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px;*/
+ background-position: 50% 3px;
+ background-repeat: no-repeat;
+ background-color: transparent !important;
+}
+form#bookmark-form button {
+ background-image: url('../img/icons/icon-bookmark_add.png');
+}
+form#bookmark-form button:hover {
+/* border: 1px solid #ccc;*/
+ background-image: url('../img/icons/icon-bookmark_add-hover.png');
+/* background-color: #e6e6e6 !important;*/
+}
+form#bookmark-form button.bookmarked {
+ background-image: url('../img/icons/icon-bookmark_remove.png');
+}
+form#bookmark-form button.bookmarked:hover {
+ background-image: url('../img/icons/icon-bookmark_remove-hover.png');
+}
+
+
+
+/* Breadcrumbs
+------------------------------------------------------------------------------------------------------ */
+
+div#breadcrumbs {
+ color: #666;
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ background: #e6e6e6;
+}
+
+
+
+/* Messages
+------------------------------------------------------------------------------------------------------ */
+
+ul.messagelist li {
+ color: #fff;
+ border-top: 1px solid #949494;
+ border-bottom: 1px solid #949494;
+ background-color: #a6a6a6;
+}
+ul.messagelist li.success {
+ border-top-color: #72a629;
+ border-bottom-color: #72a629;
+ background-color: #83bf30;
+}
+ul.messagelist li.error,
+ul.messagelist li.warning {
+ border-top-color: #a62929;
+ border-bottom-color: #a62929;
+ background-color: #bf3030;
+}
+ul.messagelist li + li {
+ border-top: 0;
+}
+
+
+
+/* Login Form
+------------------------------------------------------------------------------------------------------ */
+
+.login .module {
+ border: 0;
+ border-top-left-radius: 0; -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0;
+ border-top-right-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0;
+ background: #333;
+}
+.login .module .row {
+ border-top: 1px solid #444;
+ border-bottom: 1px solid #222;
+}
+.login .module label {
+ color: #eee;
+}
+
+
+
+/* COMPONENTS
+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
+
+
+
+/* Modules
+------------------------------------------------------------------------------------------------------ */
+
+.module {
+ border: 1px solid #bdbdbd;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+ background: #eee;
+}
+.rte .module {
+ background: transparent;
+}
+
+
+/* Nested Modules Basics ......................................... */
+
+.module .module,
+.module fielset.module {
+ border: 0;
+ border-radius: 0; -moz-border-radius: 0; -webkit-border-radius: 0;
+}
+.module .module:first-child {
+ border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px;
+ border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;
+}
+
+
+
+/* Groups
+------------------------------------------------------------------------------------------------------ */
+
+.group {
+ border-radius: 7px; -moz-border-radius: 7px; -webkit-border-radius: 7px;
+}
+
+.group.collapse.closed {
+ border: 2px solid #e0e0e0;
+}
+.group,
+.group.collapse.closed:hover {
+ border: 2px solid #c7c7c7;
+}
+
+
+
+/* Elements in Modules & Groups
+------------------------------------------------------------------------------------------------------ */
+
+
+/* 1st Level Borders Top (Dark/Bright) ......................................... */
+
+.group h2,
+.module h2 {
+ border-bottom: 1px solid #bdbdbd;
+ border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px;
+ border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;
+ background: #d6d6d6;
+ background: -moz-linear-gradient(top, #e3e3e3, #d6d6d6);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#d6d6d6));
+ background: -o-linear-gradient(top, #e3e3e3, #d6d6d6);
+}
+.group h2 {
+ border: 1px solid #bdbdbd;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+}
+.module h2+*,
+.module h2+.tools+* {
+ border-top: 1px solid #fff;
+}
+.module h2+.module,
+.module h2+.tools,
+.module h2+.tools+.module {
+ border-top: 0 !important;
+}
+
+
+/* 2nd Level Borders Top (Dark/Bright) ......................................... */
+
+.module .module {
+ border-top: 1px solid #c7c7c7;
+}
+.module .module>*:first-child {
+ border-top: 1px solid #eee;
+}
+#changelist .span-flexible .module .module:first-child {
+ border-top: 0;
+}
+
+.group h3,
+.module h3 {
+ border-bottom: 1px solid #c7c7c7;
+ background: #e0e0e0;
+ background: -moz-linear-gradient(top, #e9e9e9, #e0e0e0);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e9e9e9), to(#e0e0e0));
+ background: -o-linear-gradient(top, #e9e9e9, #e0e0e0);
+}
+.group h3 {
+ border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px;
+ border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;
+}
+.module h3+*,
+.module h3+.tools+* {
+ border-top: 1px solid #fff;
+}
+.module h3+.module,
+.module h3+.tools,
+.module h3+.tools+.module {
+ border-top: 0 !important;
+}
+
+
+/* 3rd Level Borders Top (Dark/Bright) ......................................... */
+
+.group .module .module,
+.module .module .module {
+ border-top: 1px solid #d4d4d4;
+}
+.group .module .module>*:first-child,
+.module .module .module>*:first-child {
+ border-top: 1px solid #f4f4f4;
+}
+
+.group h4,
+.module h4 {
+ border-bottom: 1px solid #d4d4d4;
+ background: #e8e8e8;
+ background: -moz-linear-gradient(top, #ededed, #e8e8e8);
+ background: -webkit-gradient(linear, left top, left bottom, from(#ededed), to(#e8e8e8));
+ background: -o-linear-gradient(top, #ededed, #e8e8e8);
+}
+.module h4+*,
+.module h4+.tools+* {
+ border-top: 1px solid #fff;
+}
+.module h4+.tools {
+ border-top: 0 !important;
+}
+.module .description {
+ border-bottom: 1px solid #d4d4d4;
+}
+.module .row.description,
+.module.table .description {
+ border-bottom: 0;
+}
+
+
+
+/* Modules & Groups Overrides
+------------------------------------------------------------------------------------------------------ */
+
+.module .module:last-of-type {
+ border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px;
+}
+
+
+
+/* Collapsible Structures
+------------------------------------------------------------------------------------------------------ */
+
+.group .module.collapse.closed h3.collapse-handler,
+.group .module.collapse.closed h4.collapse-handler,
+.collapse.closed h2.collapse-handler,
+.module .module.collapse.closed.last .collapse-handler,
+.module .module.collapse.closed:last-child .collapse-handler {
+ border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px;
+}
+.module.collapse.closed h2.collapse-handler,
+.module.collapse.closed h3.collapse-handler,
+.module.collapse.closed h4.collapse-handler {
+ border-bottom: 0;
+}
+
+
+/* 1st Level Collapsible-Handler ......................................... */
+
+.collapse h2.collapse-handler {
+ background: #a1d4e5;
+ background: -moz-linear-gradient(top, #bcdfeb, #a1d4e5);
+ background: -webkit-gradient(linear, left top, left bottom, from(#bcdfeb), to(#a1d4e5));
+ background: -o-linear-gradient(top, #bcdfeb, #a1d4e5);
+}
+.collapse h2.collapse-handler:hover,
+.collapse.open h2.collapse-handler {
+ background: #bcdfeb;
+ background: -moz-linear-gradient(top, #a1d4e5, #bcdfeb);
+ background: -webkit-gradient(linear, left top, left bottom, from(#a1d4e5), to(#bcdfeb));
+ background: -o-linear-gradient(top, #a1d4e5, #bcdfeb);
+}
+
+
+/* 2nd Level Collapsible-Handler ......................................... */
+
+.group .collapse h3.collapse-handler,
+.module .collapse h3.collapse-handler {
+ background: #cee9f2;
+ background: -moz-linear-gradient(top, #e1f0f5, #cee9f2);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e1f0f5), to(#cee9f2));
+ background: -o-linear-gradient(top, #e1f0f5, #cee9f2);
+}
+.group .collapse h3.collapse-handler:hover,
+.module .collapse h3.collapse-handler:hover,
+.group .collapse.open h3.collapse-handler,
+.module .collapse.open h3.collapse-handler {
+ background: #e1f0f5;
+ background: -moz-linear-gradient(top, #cee9f2, #e1f0f5);
+ background: -webkit-gradient(linear, left top, left bottom, from(#cee9f2), to(#e1f0f5));
+ background: -o-linear-gradient(top, #cee9f2, #e1f0f5);
+}
+.module .collapse h3.collapse-handler {
+ border-top: 1px solid #e1f0f5;
+}
+
+
+/* 3rd Level Collapsible-Handler ......................................... */
+
+.group .module .collapse > h4.collapse-handler,
+.module .module .collapse > h4.collapse-handler {
+ border-top: 1px solid #f0f7fa;
+ background: #e1f0f5;
+ background: -moz-linear-gradient(top, #ebf2f5, #e1f0f5);
+ background: -webkit-gradient(linear, left top, left bottom, from(#ebf2f5), to(#e1f0f5));
+ background: -o-linear-gradient(top, #ebf2f5, #e1f0f5);
+}
+.group .collapse > h4.collapse-handler:hover,
+.module .collapse > h4.collapse-handler:hover,
+.group .collapse.open > h4.collapse-handler,
+.module .collapse.open > h4.collapse-handler {
+ background: #ebf2f5;
+ background: -moz-linear-gradient(top, #e1f0f5, #ebf2f5);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e1f0f5), to(#ebf2f5));
+ background: -o-linear-gradient(top, #e1f0f5, #ebf2f5);
+}
+
+
+
+/* Row
+------------------------------------------------------------------------------------------------------ */
+
+.row {
+ margin: 0;
+ border-top: 1px solid #fff;
+ border-bottom: 1px solid #e0e0e0;
+ border-left: 0;
+ border-right: 0;
+}
+.row.first,
+.row:first-child,
+.module input[type=hidden] + .row {
+ border-top: 0 !important;
+ border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px;
+ border-top-right-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px;
+}
+.row.last,
+.row:last-child,
+.row:last-of-type,
+fieldset.module > .row.last,
+fieldset.module > .row:last-child {
+ border-bottom: 0 !important;
+ border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px;
+}
+
+
+
+/* Cell
+------------------------------------------------------------------------------------------------------ */
+
+.cell {
+ border-right: 1px solid #e0e0e0;
+ border-left: 1px solid #fff;
+}
+
+
+
+/* Fieldset Cell
+------------------------------------------------------------------------------------------------------ */
+
+fieldset.module .cell:first-child {
+ border-left: 0 !important;
+}
+fieldset.module .cell:last-child,
+fieldset.module .cell.last {
+ border-right: 0 !important;
+}
+fieldset.module .cell.last + fieldset.module .cell {
+ border-left: 0 !important;
+}
+
+
+
+/* Tabular Modules
+------------------------------------------------------------------------------------------------------ */
+
+.module.table {
+ border: 0;
+ border-collapse: separate;
+ border-spacing: 0 2px;
+ background: transparent;
+}
+.module.thead,
+.module.tfoot {
+ color: #aaa;
+ background: transparent;
+}
+.module.table .tr,
+.module.tbody {
+ background: transparent;
+}
+.module.table .th,
+.module.table .td {
+ border-left: 1px solid #fff;
+ border-right: 1px solid #e0e0e0;
+}
+.module.thead .th:last-of-type,
+.module.thead .td:last-of-type,
+.module.tfoot .td:last-of-type {
+ border-right: 0;
+}
+.module.table .module.thead .th,
+.module.table .module.thead .td {
+ border-top: 0;
+ border-bottom: 0;
+ background: none;
+}
+.module.tbody .th,
+.module.tbody .td {
+ border-top: 1px solid #d4d4d4;
+ border-bottom: 1px solid #d4d4d4;
+ background: #eee;
+}
+.module.tbody .th:first-of-type,
+.module.tbody .td:first-of-type {
+ border-left: 1px solid #ccc;
+ border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px;
+ border-top-right-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0;
+ border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;
+}
+.module.tbody .th:last-of-type,
+.module.tbody .td:last-of-type {
+ border-top-right-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px;
+ border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0;
+ border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px;
+}
+
+
+
+/* Add Items
+------------------------------------------------------------------------------------------------------ */
+
+.module.add-item {
+ border: 1px solid transparent;
+ background: #fff;
+}
+
+
+
+/* Predelete
+------------------------------------------------------------------------------------------------------ */
+
+.predelete h2, .collapse.predelete > h2.collapse-handler,
+.predelete h3, .collapse.predelete > h3.collapse-handler,
+.predelete h4, .collapse.predelete .collapse > h4.collapse-handler {
+ background: #f2e6e6;
+ background: -moz-linear-gradient(top, #fff2f2, #f2e6e6);
+ background: -webkit-gradient(linear, left top, left bottom, from(#fff2f2), to(#f2e6e6));
+ background: -o-linear-gradient(top, #fff2f2, #f2e6e6);
+}
+.collapse.predelete > h2.collapse-handler:hover,
+.collapse.predelete > h3.collapse-handler:hover,
+.predelete .collapse > h4.collapse-handler:hover,
+.collapse.open.predelete > h2.collapse-handler,
+.collapse.open.predelete > h3.collapse-handler,
+.predelete .collapse.open > h4.collapse-handler {
+ background: #f2e6e6 !important;
+ background: -moz-linear-gradient(top, #f2e6e6, #fff2f2) !important;
+ background: -webkit-gradient(linear, left top, left bottom, from(#f2e6e6), to(#fff2f2)) !important;
+ background: -o-linear-gradient(top, #f2e6e6, #fff2f2) !important;
+}
+.predelete,
+.predelete .module,
+.predelete .th,
+.predelete .td {
+ background: #f2e6e6 !important;
+}
+
+
+
+/* Selectors
+------------------------------------------------------------------------------------------------------ */
+
+.selector-available, .selector-chosen {
+ border: 1px solid #ccc;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+ background: #ddd;
+}
+.selector h2, .inline-group .selector h2,
+.inline-related fieldset .selector-available h2, .inline-related fieldset .selector-chosen h2 {
+ border: 0;
+ border-bottom: 1px solid #d0d0d0;
+ background: transparent;
+}
+.selector .selector-filter {
+ color: #666;
+ border-top: 1px solid #e4e4e4;
+ border-bottom: 1px solid #e4e4e4;
+ border-top-left-radius: 5px;-moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px;
+ border-top-right-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px;
+}
+.selector h2 + .selector-filter {
+ border-radius-topleft: 0; -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0;
+ border-radius-topright: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0;
+}
+.selector select[multiple=multiple] {
+ border-left: 0;
+ border-top: 1px solid #d0d0d0;
+ border-bottom: 1px solid #d0d0d0;
+ border-radius: 0; -moz-border-radius: 0; -webkit-border-radius: 0;
+}
+
+a.selector-chooseall, a.selector-clearall {
+ border-top: 1px solid #e4e4e4;
+}
+
+.selector h2 + select {
+ border-top: 0;
+}
+
+a.selector-chooseall, a.selector-clearall {
+ border-top: 1px solid #e4e4e4;
+}
+
+
+
+/* Link-List, Actions, Feed, Table of Contents
+------------------------------------------------------------------------------------------------------ */
+
+.module.link-list,
+.module.link-list .module,
+.module.actions,
+.module.actions .module,
+.module.feed,
+.module.feed .module {
+ background: #fff;
+}
+.link-list ul li,
+.feed ul li,
+.actions ul li,
+.table-of-contents ul li {
+ border-top: 1px solid #fff;
+ border-bottom: 1px solid #e0e0e0;
+}
+.actions ul li {
+ color: #999;
+}
+.actions ul li:first-child,
+.link-list ul li:first-child,
+.feed ul li:first-child,
+.table-of-contents ul li:first-child {
+ border-top: 0;
+}
+.actions ul li:last-child,
+.link-list ul li:last-child,
+.feed ul li:last-child,
+.table-of-contents ul li:last-child {
+ border-bottom: 0;
+}
+.link-list ul li.selected a,
+.table-of-contents ul li.selected a {
+ color: #444;
+}
+a.internal:link, a.internal:visited {}
+a.internal:hover, a.internal:active,
+.actions li.delete-link {
+ color: #666;
+}
+a.external:link, a.external:visited {
+ color: #83c3d9;
+}
+a.external:hover, a.external:active {
+ color: #666;
+}
+
+
+
+/* Module Changelist Filters
+------------------------------------------------------------------------------------------------------ */
+
+.module.changelist-filters {
+ color: #666;
+ border: 1px solid #d4d4d4;
+ border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0;
+}
+.module.changelist-filters:last-of-type,
+body.filebrowser .module.changelist-filters {
+ border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px;
+}
+
+
+
+/* Module Search & Module Filter
+------------------------------------------------------------------------------------------------------ */
+
+.module.search,
+.module.filter {
+ border: 0;
+ border-top-right-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px;
+}
+.module.filter .pulldown-container {
+ border: 1px solid #fff;
+ border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px;
+}
+.module.filter.open .pulldown-container {
+ border-color: #ccc;
+ box-shadow: 0 0 10px #444; -moz-box-shadow: 0 0 10px #444; -webkit-box-shadow: 0 0 10px #444;
+}
+
+.open a.button.toggle-filters,
+.open.selected a.button.toggle-filters {
+ border-color: transparent !important;
+ border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0 !important; -webkit-border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0; -moz-border-radius-bottomright: 0 !important; -webkit-border-bottom-right-radius: 0;
+}
+a.button.toggle-filters:link, a.button.toggle-filters:visited {
+ color: #309bbf;
+ border-color: #ddd;
+}
+.selected a.button.toggle-filters:link, .selected a.button.toggle-filters:visited {
+ color: #444;
+ background-color: #e1f0f5;
+ background: #e1f0f5 url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat;
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -moz-linear-gradient(top, #eee, #e0e0e0);
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -webkit-gradient(linear, left top, left bottom, from(#eee), to(#e0e0e0));
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -o-linear-gradient(top, #eee, #e0e0e0);
+}
+.open a.button.toggle-filters, .selected a.button.toggle-filters,
+.selected a.button.toggle-filters:hover, .selected a.button.toggle-filters:active,
+a.button.toggle-filters:hover, a.button.toggle-filters:active {
+ color: #666;
+ border-color: #ccc;
+ background-color: #e1f0f5;
+ background: #e1f0f5 url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat;
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -moz-linear-gradient(top, #f0f7fa, #e1f0f5);
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -webkit-gradient(linear, left top, left bottom, from(#f0f7fa), to(#e1f0f5));
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -o-linear-gradient(top, #f0f7fa, #e1f0f5);
+}
+.selected a.button.toggle-filters:link, .selected a.button.toggle-filters:visited {
+ color: #666;
+ border-color: #ddd;
+ background-color: #e1f0f5;
+ background: #e1f0f5 url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat;
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -moz-linear-gradient(top, #f0f7fa, #e1f0f5);
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -webkit-gradient(linear, left top, left bottom, from(#f0f7fa), to(#e1f0f5));
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -o-linear-gradient(top, #f0f7fa, #e1f0f5);
+}
+.open a.button.toggle-filters,
+.open.selected a.button.toggle-filters,
+.selected a.button.toggle-filters:hover, .selected a.button.toggle-filters:active,
+a.button.toggle-filters:hover, a.button.toggle-filters:active {
+ color: #666;
+ border-color: #ccc;
+ background-color: #e1f0f5;
+ background: #e1f0f5 url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat;
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -moz-linear-gradient(top, #f0f7fa, #e1f0f5);
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -webkit-gradient(linear, left top, left bottom, from(#f0f7fa), to(#e1f0f5));
+ background: url('../img/icons/icon-dropdown-hover.png') 100% 3px no-repeat, -o-linear-gradient(top, #f0f7fa, #e1f0f5);
+}
+
+.filter-pulldown {
+ border: 1px solid transparent;
+ border-top: 0;
+ border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px;
+ background: #e1f0f5;
+}
+.filter-pulldown label {
+ color: #999;
+}
+
+
+
+/* Module Date Hierarchy
+------------------------------------------------------------------------------------------------------ */
+
+.module.date-hierarchy {
+ border: 1px solid #d9d9d9;
+ border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px;
+ background: #eee;
+ background: -moz-linear-gradient(top, #eee, #e7e7e7);
+ background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#e7e7e7));
+ background: -o-linear-gradient(top, #eee, #e7e7e7);
+}
+.module + .module.date-hierarchy {
+ border-top-left-radius: 0; -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0;
+ border-top-right-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0;
+}
+.module + .module.date-hierarchy .row {
+ border-top: 1px solid #fff !important;
+ border-top-left-radius: 0; -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0;
+ border-top-right-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0;
+}
+.date-hierarchy a:link, .date-hierarchy a:visited {
+ color: #59afcc;
+}
+.date-hierarchy a:hover, .date-hierarchy a:active {
+ color: #444;
+}
+.date-hierarchy a.date-hierarchy-back:hover, .date-hierarchy a.date-hierarchy-back:active {
+ color: #666;
+}
+
+
+
+/* Pagination
+------------------------------------------------------------------------------------------------------ */
+
+.module.pagination {
+ border: 1px solid #d9d9d9;
+ border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;
+}
+.module .module.pagination {
+ border: 0;
+}
+ul.pagination {
+ border-top: 0 !important;
+}
+ul.pagination li {
+ border: 1px solid #fff;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+}
+
+ul.pagination span,
+ul.pagination a {
+ border: 1px solid;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+ box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;
+}
+ul.pagination a:link, .pagination a:visited {
+ color: #59afcc;
+ border-color: #d9d9d9;
+}
+ul.pagination a:hover, .pagination a:active {
+ color: #444;
+ border-color: #bdbdbd;
+ background: #e0e0e0;
+ background: -moz-linear-gradient(top, #eee, #e0e0e0);
+ background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#e0e0e0));
+ background: -o-linear-gradient(top, #eee, #e0e0e0);
+}
+ul.pagination span {
+ color: #444;
+ border-color: #bdbdbd;
+ background: #e0e0e0;
+ background: -moz-linear-gradient(top, #eee, #e0e0e0);
+ background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#e0e0e0));
+ background: -o-linear-gradient(top, #eee, #e0e0e0);
+}
+ul.pagination li.separator span {
+ border-color: transparent;
+ background: transparent;
+}
+
+
+
+/* Module Changelist-Results
+------------------------------------------------------------------------------------------------------ */
+
+.module.changelist-results {
+ border-bottom-right-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0;
+ background-color: #eee !important;
+}
+
+
+
+/* Module Changelist Actions
+------------------------------------------------------------------------------------------------------ */
+
+.changelist-actions {
+ color: #ccc;
+}
+.changelist-actions.all-selected,
+.changelist-actions.all-selected + .changelist-results {
+ background: #ffffe6 !important;
+}
+.changelist-actions ul li {
+ border: 1px solid #444;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+}
+.changelist-actions ul a,
+.changelist-actions ul span {
+ border: 1px solid;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+}
+.changelist-actions ul a:link, .changelist-actions ul a:visited {
+ color: #59afcc;
+ border-color: #333;
+ background: #333;
+ background: -moz-linear-gradient(top, #444, #333);
+ background: -webkit-gradient(linear, left top, left bottom, from(#444), to(#333));
+ background: -o-linear-gradient(top, #444, #333);
+}
+.changelist-actions ul a:hover, .changelist-actions ul a:active {
+ color: #ccc;
+ border-color: #333;
+ background: #555;
+ background: -moz-linear-gradient(top, #666, #555);
+ background: -webkit-gradient(linear, left top, left bottom, from(#666), to(#555));
+ background: -o-linear-gradient(top, #666, #555);
+}
+.changelist-actions ul span {
+ color: #ccc;
+ border-color: #333;
+}
+.changelist-actions ul span span {
+ border: 0;
+}
+
+
+
+/* Module Footer
+------------------------------------------------------------------------------------------------------ */
+
+.module.footer {
+ border: 0;
+ border-top: 1px solid #bdbdbd;
+ border-radius: 0; -moz-border-radius: 0; -webkit-border-radius: 0;
+ background: #333;
+ background: -moz-linear-gradient(top, #444, #333);
+ background: -webkit-gradient(linear, left top, left bottom, from(#444), to(#333));
+ background: -o-linear-gradient(top, #444, #333);
+}
+
+
+
+/* Submit Row
+------------------------------------------------------------------------------------------------------ */
+
+.module.submit-row {
+ border: 0;
+ background: transparent;
+}
+
+
+
+/* Tooltips
+------------------------------------------------------------------------------------------------------ */
+
+.module.search .tooltip .tooltip-content {
+ border: 1px solid #ccc;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+ background: #fff;
+ box-shadow: 0 10px 50px #333; -moz-box-shadow: 0 10px 50px #333; -webkit-box-shadow: 0 10px 50px #333;
+}
+
+
+
+/* TOOLS
+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
+
+ul.tools > li {
+ border-top: 0 !important;
+ border-bottom: 0 !important;
+}
+
+
+
+/* H1 + Tools
+------------------------------------------------------------------------------------------------------ */
+
+h1 + .tools a {
+ color: #fff;
+ border-radius: 15px; -moz-border-radius: 15px; -webkit-border-radius: 15px;
+}
+h1 + .tools a:link, h1 + .tools a:visited {
+ background: #444;
+ background: -moz-linear-gradient(top, #666, #444);
+ background: -webkit-gradient(linear, left top, left bottom, from(#666), to(#444));
+ background: -o-linear-gradient(top, #666, #444);
+}
+h1 + .tools a:hover, h1 + .tools a:active {
+ border-color: transparent;
+ background: #309bbf;
+ background: -moz-linear-gradient(top, #39bae5, #309bbf);
+ background: -webkit-gradient(linear, left top, left bottom, from(#39bae5), to(#309bbf));
+ background: -o-linear-gradient(top, #39bae5, #309bbf);
+}
+
+.tools-active {
+ border-color: transparent !important;
+ background: #309bbf !important;
+ background: -moz-linear-gradient(top, #39bae5, #309bbf) !important;
+ background: -webkit-gradient(linear, left top, left bottom, from(#39bae5), to(#309bbf)) !important;
+ background: -o-linear-gradient(top, #39bae5, #309bbf) !important;
+}
+
+h1 + .tools a.add-handler:link, h1 + .tools a.add-handler:visited {
+ background-color: #444;
+ background: #444 0 50% no-repeat scroll;
+ background-image: url('../img/icons/icon-object-tools-add-handler.png'), -moz-linear-gradient(top, #666, #444);
+ background-image: url('../img/icons/icon-object-tools-add-handler.png'), -webkit-gradient(linear, left top, left bottom, from(#666), to(#444));
+ background-image: url('../img/icons/icon-object-tools-add-handler.png'), -o-linear-gradient(top, #666, #444);
+}
+h1 + .tools a.add-handler:hover, h1 + .tools a.add-handler:active {
+ background-color: #309bbf;
+ background: #309bbf 0 50% no-repeat scroll;
+ background-image: url('../img/icons/icon-object-tools-add-handler.png'), -moz-linear-gradient(top, #39bae5, #309bbf);
+ background-image: url('../img/icons/icon-object-tools-add-handler.png'), -webkit-gradient(linear, left top, left bottom, from(#39bae5), to(#309bbf));
+ background-image: url('../img/icons/icon-object-tools-add-handler.png'), -o-linear-gradient(top, #39bae5, #309bbf);
+}
+
+
+/* 1st Level H2 + Tools ......................................... */
+
+.group h2+.tools,
+.module h2+.tools {
+ border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;
+}
+
+.module h2+.tools li {
+ border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;
+}
+.group h2+.tools,
+.module.collapse.closed h2+.tools {
+ border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px;
+}
+
+
+/* 2nd Level H3 + Tools ......................................... */
+
+.group .module.collapse.closed h3+.tools,
+.group .module.collapse.closed h3+.tools li,
+.module.collapse.closed:last-child h3+.tools,
+.module.collapse.closed:last-child h3+.tools li {
+ border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px;
+}
+.group h3+.tools,
+.group h3+.tools li {
+ border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;
+}
+
+
+/* 3rd Level H4 + Tools ......................................... */
+
+.module.collapse.closed:last-child h4+.tools,
+.module.collapse.closed:last-child h4+.tools li {
+ border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px;
+}
+
+
+
+/* FORMS
+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
+
+
+
+/* Errors
+------------------------------------------------------------------------------------------------------ */
+
+.errornote {
+ color: #f7f7f7;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+ background: #bf3030;
+}
+/* little fix to accomodate the top aligned login form .. */
+.login .errornote,
+.errornote.login-errors {
+ margin-bottom: 0 !important;
+ padding: 8px 10px 6px !important;
+ border-radius: 0px; -moz-border-radius: 0px; -webkit-border-radius: 0px;
+}
+ul.errorlist {
+ color: #bf3030;
+}
+.error input, .error select, .errors input, .errors select {
+ border: 1px solid #bf3030 !important;
+}
+.login ul.errorlist {
+ color: #d93636;
+}
+
+
+
+/* Labels & Other Typographic Elements in Forms
+------------------------------------------------------------------------------------------------------ */
+
+label {
+ color: #444;
+}
+
+
+
+/* Form Elements
+------------------------------------------------------------------------------------------------------ */
+
+input, textarea, select, button {
+ color: #666;
+ border: 1px solid #ccc;
+/* border-color: #ccc #ddd #ddd #ccc;*/
+ border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px;
+ outline: 0;
+}
+input, textarea, select {
+ box-shadow: 0 1px 3px #eaeaea inset; -moz-box-shadow: 0 1px 3px #eaeaea inset; -webkit-box-shadow: 0 1px 3px #eaeaea inset;
+ background-color: #fff;
+}
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+ input[type=file] {
+ background-color: transparent;
+ }
+}
+
+*:focus, input:focus, textarea:focus, select:focus {
+ border-color: #999;
+}
+select:focus * {
+ border: 0 !important;
+ outline: 0 !important;
+}
+
+
+/* Searchbar ................................................... */
+
+form#changelist-search {
+ border: 1px solid #fff;
+ border-radius: 15px; -moz-border-radius: 15px; -webkit-border-radius: 15px;
+}
+input#searchbar {
+ border-radius: 14px; -moz-border-radius: 14px; -webkit-border-radius: 14px;
+}
+
+
+/* Select ................................................... */
+
+option,
+select[multiple=multiple] option {
+ border-bottom: 1px dotted #ddd !important;
+}
+option:last-child {
+ border-bottom: 0;
+}
+
+
+/* Autocomplete Fields ................................................... */
+
+.vAutocompleteSearchField,
+.vM2MAutocompleteSearchField {
+ background: #eaf5f8;
+}
+
+
+/* Read Only ................................................... */
+
+input[readonly],
+textarea[readonly],
+select[readonly] {
+ background: #f4f4f4;
+}
+
+
+
+/* BUTTONS
+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
+
+input[type=submit], input[type=reset], input[type=button], button {
+ color: #fff;
+ border: 0;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+ background: #acd7e5;
+}
+
+
+/* Button Containers ................................................... */
+
+.submit-row>*[class*="-container"] {
+ border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px;
+ box-shadow: 0 0 5px #666; -moz-box-shadow: 0 0 5px #666; -webkit-box-shadow: 0 0 5px #666;
+ background: #d6d6d6;
+}
+.submit-row>*[class*="-container"]:hover {
+ box-shadow: 0 0 5px #777; -moz-box-shadow: 0 0 5px #777; -webkit-box-shadow: 0 0 5px #777;
+ background: #d6d6d6;
+}
+.submit-row>*[class*="cancel-button-container"] {
+ box-shadow: 0 0 5px #aaa; -moz-box-shadow: 0 0 5px #aaa; -webkit-box-shadow: 0 0 5px #aaa;
+}
+.footer .submit-row>*[class*="-container"],
+.footer .submit-row>*[class*="cancel-button-container"] {
+ border: 1px solid #666;
+ box-shadow: 0 0 5px #666; -moz-box-shadow: 0 0 5px #666; -webkit-box-shadow: 0 0 5px #666;
+ background: #666;
+}
+.submit-row>*[class*="cancel-button-container"] {
+ box-shadow: 0 0 5px #aaa; -moz-box-shadow: 0 0 5px #aaa; -webkit-box-shadow: 0 0 5px #aaa;
+}
+.footer .submit-row>*[class*="-container"]:hover,
+.footer .submit-row>*[class*="cancel-button-container"]:hover {
+ border: 1px solid #777;
+ box-shadow: 0 0 5px #777; -moz-box-shadow: 0 0 5px #777; -webkit-box-shadow: 0 0 5px #777;
+ background: #777;
+}
+
+
+/* Buttons & Buttonlike Links
+------------------------------------------------------------------------------------------------------ */
+
+.submit-row a.submit-link,
+.submit-row a.delete-link,
+.submit-row a.cancel-link {
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+}
+.submit-row a.submit-link,
+.submit-row input[type=submit] {
+ border: 1px solid #267c99;
+}
+
+input[type=submit],
+#bookmark-add-cancel,
+.submit-row a.delete-link:link, .submit-row a.delete-link:visited,
+.submit-row a.cancel-link:link, .submit-row a.cancel-link:visited,
+.submit-row input[type=button] {
+ box-shadow: none !important; -moz-box-shadow: none !important; -webkit-box-shadow: none !important;
+}
+
+.submit-row a.delete-link:link, .submit-row a.delete-link:visited {
+ color: #fff;
+ border: 1px solid #992626;
+ background: #bf3030;
+ background: -moz-linear-gradient(top, #d93636, #bf3030);
+ background: -webkit-gradient(linear, left top, left bottom, from(#d93636), to(#bf3030));
+ background: -o-linear-gradient(top, #d93636, #bf3030);
+}
+#bookmark-add-cancel,
+.submit-row a.cancel-link:link, .submit-row a.cancel-link:visited,
+.submit-row input.cancel:hover {
+ color: #fff;
+ border: 1px solid #444;
+ background: #666;
+ background: -moz-linear-gradient(top, #666, #444);
+ background: -webkit-gradient(linear, left top, left bottom, from(#666), to(#444));
+ background: -o-linear-gradient(top, #666, #444);
+}
+
+input[type=submit],
+.submit-row a.submit-link:link, .submit-row a.submit-link:visited {
+ color: #fff;
+ background: #309bbf;
+ background: -moz-linear-gradient(top, #39bae5, #309bbf);
+ background: -webkit-gradient(linear, left top, left bottom, from(#39bae5), to(#309bbf));
+ background: -o-linear-gradient(top, #39bae5, #309bbf);
+}
+input[type=submit]:hover,
+#bookmark-add-cancel:hover,
+.submit-row a.submit-link:hover, .submit-row a.submit-link:active,
+.submit-row a.delete-link:hover, .submit-row a.delete-link:active,
+.submit-row a.cancel-link:hover, .submit-row a.cancel-link:active,
+.submit-row input.cancel {
+ color: #444;
+ border: 1px solid #aaa;
+ background: #d6d6d6;
+ background: -moz-linear-gradient(top, #e3e3e3, #d6d6d6);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#d6d6d6));
+ background: -o-linear-gradient(top, #e3e3e3, #d6d6d6);
+}
+.footer input[type=submit]:hover,
+.footer #bookmark-add-cancel:hover,
+.footer .submit-row a.delete-link:hover, .footer .submit-row a.delete-link:active,
+.footer .submit-row a.cancel-link:hover, .footer .submit-row a.cancel-link:active {
+ border: 1px solid #666;
+}
+
+button.fb_show,
+button.ui-datepicker-trigger,
+button.ui-timepicker-trigger,
+button.ui-gAutocomplete-browse,
+button.ui-gAutoSlugField-toggle,
+button.ui-gFacelist-browse,
+a.button,
+.vDateField + span a,
+.vTimeField + span a,
+a.fb_show,
+a.related-lookup,
+a.add-another,
+.tinyMCE .browse span {
+ border-top-left-radius: 0; -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0;
+ border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0;
+ border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px;
+}
+
+button {
+ background: #309bbf;
+ background-image: -moz-linear-gradient(top, #33a6cc, #309bbf);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#33a6cc), to(#309bbf));
+ background-image: -o-linear-gradient(top, #33a6cc, #309bbf);
+}
+button:hover {
+ background: #666;
+ background-image: -moz-linear-gradient(top, #555, #444);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#555), to(#444));
+ background-image: -o-linear-gradient(top, #555, #444);
+}
+
+button.fb_show,
+button.ui-gAutocomplete-browse,
+button.ui-gFacelist-browse,
+button.ui-gAutoSlugField-toggle,
+button.ui-datepicker-trigger,
+button.ui-timepicker-trigger,
+.tinyMCE .browse span {
+ border: 1px solid #ccc;
+ background-color: #e1f0f5;
+}
+button.fb_show:hover,
+button.ui-gAutocomplete-browse:hover,
+button.ui-gFacelist-browse:hover,
+button.ui-gAutoSlugField-toggle:hover,
+button.ui-datepicker-trigger:hover,
+button.ui-timepicker-trigger:hover,
+.tinyMCE .browse span:hover {
+ background-color: #e1e1e1;
+}
+button.fb_show[disabled],
+button.ui-gAutocomplete-browse[disabled],
+button.ui-gFacelist-browse[disabled],
+button.ui-gAutoSlugField-toggle[disabled],
+button.ui-datepicker-trigger[disabled],
+button.ui-timepicker-trigger[disabled],
+input[disabled] + a {
+ background-color: transparent !important;
+ opacity: 0.3;
+ cursor: auto !important;
+}
+
+
+/* Autocomplete Button ......................................... */
+
+button.ui-gAutocomplete-browse,
+button.ui-gFacelist-browse {
+ background-image: url('../img/icons/icon-related-lookup.png'), -moz-linear-gradient(top, #ebf2f5, #e1f0f5);
+ background-image: url('../img/icons/icon-related-lookup.png'), -webkit-gradient(linear, left top, left bottom, from(#ebf2f5), to(#e1f0f5));
+ background-image: url('../img/icons/icon-related-lookup.png'), -o-linear-gradient(top, #ebf2f5, #e1f0f5);
+}
+button.ui-gAutocomplete-browse:hover,
+button.ui-gFacelist-browse:hover {
+ background-image: url('../img/icons/icon-related-lookup-hover.png'), -moz-linear-gradient(top, #e1e1e1, #eee);
+ background-image: url('../img/icons/icon-related-lookup-hover.png'), -webkit-gradient(linear, left top, left bottom, from(#e1e1e1), to(#eee));
+ background-image: url('../img/icons/icon-related-lookup-hover.png'), -o-linear-gradient(top, #e1e1e1, #eee);
+}
+
+.errors button.ui-gAutocomplete-browse,
+.errors button.ui-gFacelist-browse {
+ border-color: #bf3030 #bf3030 #bf3030 #ccc;
+}
+
+
+/* AutoSlugField Button ......................................... */
+
+/* TODO: lock/unlock icons .. */
+
+button.ui-gAutoSlugField-toggle {
+ background-image: url('../img/icons/icon-related-lookup.png'), -moz-linear-gradient(top, #ebf2f5, #e1f0f5);
+ background-image: url('../img/icons/icon-related-lookup.png'), -webkit-gradient(linear, left top, left bottom, from(#ebf2f5), to(#e1f0f5));
+ background-image: url('../img/icons/icon-related-lookup.png'), -o-linear-gradient(top, #ebf2f5, #e1f0f5);
+}
+button.ui-gAutoSlugField-toggle:hover {
+ background-image: url('../img/icons/icon-related-lookup-hover.png'), -moz-linear-gradient(top, #e1e1e1, #eee);
+ background-image: url('../img/icons/icon-related-lookup-hover.png'), -webkit-gradient(linear, left top, left bottom, from(#e1e1e1), to(#eee));
+ background-image: url('../img/icons/icon-related-lookup-hover.png'), -o-linear-gradient(top, #e1e1e1, #eee);
+}
+.errors button.ui-gAutoSlugField-toggle {
+ border-color: #bf3030 #bf3030 #bf3030 #ccc;
+}
+
+
+/* Datepicker Button ......................................... */
+
+button.ui-datepicker-trigger {
+ background-image: url('../img/icons/icon-datepicker.png'), -moz-linear-gradient(top, #ebf2f5, #e1f0f5);
+ background-image: url('../img/icons/icon-datepicker.png'), -webkit-gradient(linear, left top, left bottom, from(#ebf2f5), to(#e1f0f5));
+ background-image: url('../img/icons/icon-datepicker.png'), -o-linear-gradient(top, #ebf2f5, #e1f0f5);
+}
+button.ui-datepicker-trigger:hover {
+ background-image: url('../img/icons/icon-datepicker-hover.png'), -moz-linear-gradient(top, #e1e1e1, #eee);
+ background-image: url('../img/icons/icon-datepicker-hover.png'), -webkit-gradient(linear, left top, left bottom, from(#e1e1e1), to(#eee));
+ background-image: url('../img/icons/icon-datepicker-hover.png'), -o-linear-gradient(top, #e1e1e1, #eee);
+}
+
+
+/* Timepicker Button ......................................... */
+
+button.ui-timepicker-trigger {
+ background-image: url('../img/icons/icon-timepicker.png'), -moz-linear-gradient(top, #ebf2f5, #e1f0f5);
+ background-image: url('../img/icons/icon-timepicker.png'), -webkit-gradient(linear, left top, left bottom, from(#ebf2f5), to(#e1f0f5));
+ background-image: url('../img/icons/icon-timepicker.png'), -o-linear-gradient(top, #ebf2f5, #e1f0f5);
+}
+button.ui-timepicker-trigger:hover {
+ background-image: url('../img/icons/icon-timepicker-hover.png'), -moz-linear-gradient(top, #e1e1e1, #eee);
+ background-image: url('../img/icons/icon-timepicker-hover.png'), -webkit-gradient(linear, left top, left bottom, from(#e1e1e1), to(#eee));
+ background-image: url('../img/icons/icon-timepicker-hover.png'), -o-linear-gradient(top, #e1e1e1, #eee);
+}
+
+
+/* Search Button ......................................... */
+
+button.search {
+ border-color: transparent !important;
+ background-color: transparent;
+}
+
+
+
+/* Links as Buttons
+------------------------------------------------------------------------------------------------------ */
+
+a.button,
+.datecrumbs a,
+.datecrumbs span {
+ border: 1px solid #e0e0e0;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+}
+
+
+/* Drop-Down Button ......................................... */
+
+a.button.drop-down[class*="selected"] {
+ color: #444 !important;
+ border-color: #b0b0b0;
+ border-bottom-width: 0 !important;
+ border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0 !important; -webkit-border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0; -moz-border-radius-bottomright: 0 !important; -webkit-border-bottom-right-radius: 0;
+ box-shadow: 0 -2px 3px #bbb, -2px -2px 3px #bbb, 2px -2px 3px #bbb;
+ -moz-box-shadow: 0 -2px 3px #bbb, -2px -2px 3px #bbb, 2px -2px 3px #bbb;
+ -webkit-box-shadow: 0 -2px 3px #bbb, -2px -2px 3px #bbb, 2px -2px 3px #bbb;
+}
+a.button.drop-down:link, a.button.drop-down:visited {
+ color: #309bbf;
+ background-color: #fff;
+}
+a.button.drop-down[class*="selected"],
+a.button.drop-down:hover, a.button.drop-down:active {
+ color: #666;
+ background-color: #e1f0f5;
+ background: #e1f0f5 url('../img/icons/icon-dropdown-hover.png') 3px 3px no-repeat;
+ background: url('../img/icons/icon-dropdown-hover.png') 3px 3px no-repeat, -moz-linear-gradient(top, #f0f7fa, #e1f0f5) !important;
+ background: url('../img/icons/icon-dropdown-hover.png') 3px 3px no-repeat, -webkit-gradient(linear, left top, left bottom, from(#f0f7fa), to(#e1f0f5));
+ background: url('../img/icons/icon-dropdown-hover.png') 3px 3px no-repeat, -o-linear-gradient(top, #f0f7fa, #e1f0f5) !important;
+}
+
+
+/* Filebrowser & Related Lookup ......................................... */
+
+a.fb_show,
+a.related-lookup {
+ border: 1px solid #ccc;
+}
+a.fb_show:link, a.fb_show:visited,
+a.related-lookup:link, a.related-lookup:visited {
+ background-color: #e1f0f5;
+}
+a.fb_show:hover, a.fb_show:active,
+a.related-lookup:hover, a.related-lookup:active {
+ background-color: #e1e1e1;
+}
+
+a.fb_show:link, a.fb_show:visited,
+.tinyMCE .browse span {
+ background-image: url('../img/icons/icon-fb-show.png'), -moz-linear-gradient(top, #ebf2f5, #e1f0f5);
+ background-image: url('../img/icons/icon-fb-show.png'), -webkit-gradient(linear, left top, left bottom, from(#ebf2f5), to(#e1f0f5));
+ background-image: url('../img/icons/icon-fb-show.png'), -o-linear-gradient(top, #ebf2f5, #e1f0f5);
+}
+a.fb_show:hover, a.fb_show:active,
+.tinyMCE .browse span:hover {
+ background-image: url('../img/icons/icon-fb-show-hover.png'), -moz-linear-gradient(top, #e1e1e1, #eee);
+ background-image: url('../img/icons/icon-fb-show-hover.png'), -webkit-gradient(linear, left top, left bottom, from(#e1e1e1), to(#eee));
+ background-image: url('../img/icons/icon-fb-show-hover.png'), -o-linear-gradient(top, #e1e1e1, #eee);
+}
+a.related-lookup:link, a.related-lookup:visited {
+ background-image: url('../img/icons/icon-related-lookup.png'), -moz-linear-gradient(top, #ebf2f5, #e1f0f5);
+ background-image: url('../img/icons/icon-related-lookup.png'), -webkit-gradient(linear, left top, left bottom, from(#ebf2f5), to(#e1f0f5));
+ background-image: url('../img/icons/icon-related-lookup.png'), -o-linear-gradient(top, #ebf2f5, #e1f0f5);
+}
+a.related-lookup:hover, a.related-lookup:active {
+ background-image: url('../img/icons/icon-related-lookup-hover.png'), -moz-linear-gradient(top, #e1e1e1, #eee);
+ background-image: url('../img/icons/icon-related-lookup-hover.png'), -webkit-gradient(linear, left top, left bottom, from(#e1e1e1), to(#eee));
+ background-image: url('../img/icons/icon-related-lookup-hover.png'), -o-linear-gradient(top, #e1e1e1, #eee);
+}
+
+
+/* Related Lookup M2M ......................................... */
+
+a.related-lookup.m2m:link, a.related-lookup.m2m:visited,
+div.autocomplete-wrapper-m2m a.related-lookup:link, div.autocomplete-wrapper-m2m a.related-lookup:visited {
+ background-image: url('../img/icons/icon-related-lookup-m2m.png'), -moz-linear-gradient(top, #ebf2f5, #e1f0f5);
+ background-image: url('../img/icons/icon-related-lookup-m2m.png'), -webkit-gradient(linear, left top, left bottom, from(#ebf2f5), to(#e1f0f5));
+ background-image: url('../img/icons/icon-related-lookup-m2m.png'), -o-linear-gradient(top, #ebf2f5, #e1f0f5);
+}
+a.related-lookup.m2m:hover, a.related-lookup.m2m:active,
+div.autocomplete-wrapper-m2m a.related-lookup:hover, div.autocomplete-wrapper-m2m a.related-lookup:active {
+ background-image: url('../img/icons/icon-related-lookup-m2m-hover.png'), -moz-linear-gradient(top, #e1e1e1, #eee);
+ background-image: url('../img/icons/icon-related-lookup-m2m-hover.png'), -webkit-gradient(linear, left top, left bottom, from(#e1e1e1), to(#eee));
+ background-image: url('../img/icons/icon-related-lookup-m2m-hover.png'), -o-linear-gradient(top, #e1e1e1, #eee);
+}
+
+a.related-lookup + strong {
+ color: #555;
+}
+
+
+/* Add Another ......................................... */
+
+a.add-another {
+ border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px;
+}
+
+
+/* Buttons & Button Links in Errors ......................................... */
+
+.error input + button,
+.error .vDateField + button,
+.error .vTimeField + button,
+.error input + a.fb_show,
+.error input + a.related-lookup,
+.error input + a.add-another,
+.errors input + button,
+.errors .vDateField + button,
+.errors .vTimeField + button,
+.errors input + a.fb_show,
+.errors input + a.related-lookup,
+.errors input + a.add-another,
+.errors .autocomplete-wrapper-m2m {
+ border-color: #bf3030;
+}
+
+
+/* Focused Buttons & Button Links ......................................... */
+
+input:focus + button,
+.vDateField:focus + span a,
+.vTimeField:focus + span a,
+input:focus + a.fb_show,
+input:focus + a.related-lookup,
+input:focus + a.add-another {
+ border-color: #999;
+ /*border-left-color: #ccc;*/
+}
+/* Reset the style for focused links in autocompletes as there is an automatically
+ focused (invisible) input which causes the a.related-lookup to be "focused" though it's not */
+div.autocomplete-wrapper-fk input:focus + a.related-lookup,
+div.autocomplete-wrapper-m2m input:focus + a.related-lookup {
+ border-color: #ccc !important;
+}
+
+
+/* TABLES
+–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
+
+tr.alt th, tr.alt td {
+ background: #f4f4f4;
+}
+.row1 th, .row1 td {
+ background: #f4f4f4;
+}
+.row2 th, .row2 td {
+ background: #fff;
+}
+.selected th, .selected td {
+ background: #ffd;
+}
+
+
+/* Thead ................................................... */
+
+thead th,
+tfoot td {
+ color: #aaa;
+ border-left: 1px solid #d4d4d4;
+ border-bottom: 1px solid #d4d4d4;
+ background: #eee;
+ background: -moz-linear-gradient(top, #eee, #e0e0e0);
+ background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#e0e0e0));
+ background: -o-linear-gradient(top, #eee, #e0e0e0);
+}
+thead th:first-of-type {
+ border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px;
+}
+thead th:last-of-type {
+ border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;
+}
+thead th.sorted {
+ border-bottom: 1px solid #ccc;
+ background: #e0e0e0;
+ background: -moz-linear-gradient(top, #e0e0e0, #eee);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e0e0e0), to(#eee));
+ background: -o-linear-gradient(top, #e0e0e0, #eee);
+}
+
+thead th a:link, thead th a:visited {
+ color: #59afcc;
+ border-top: 1px solid #fff;
+}
+thead th a:hover, thead th a:active,
+thead th.sorted a {
+ color: #444;
+}
+thead th.sorted a {
+ border-top: 1px solid #ececec;
+}
+
+
+/* Tbody ................................................... */
+
+tbody th, tbody td {
+ border-top: 1px solid #fff;
+ border-bottom: 1px solid #e0e0e0;
+}
+
+tfoot td {
+ border-bottom: 0;
+ border-top: 1px solid #d4d4d4;
+}
+
+thead th:first-child,
+tfoot td:first-child {
+ border-left: 0;
+}
+
+fieldset table {
+ border-right: 1px solid #eee;
+}
+
+tr.row-label td {
+ border-bottom: 0;
+ color: #666;
+}
+
+
+
+/* Changelist Table
+------------------------------------------------------------------------------------------------------ */
+
+#changelist table {
+ border: 1px solid #bdbdbd;
+}
+#changelist tbody th, #changelist tbody td {
+ border: 0;
+ border-top: 1px solid #e8e8e8;
+ border-left: 1px solid #e0e0e0;
+}
+#changelist tbody tr:first-child th, #changelist tbody tr:first-child td {
+ border-top: 1px solid #fff;
+}
+#changelist tbody tr th:first-child, #changelist tbody tr td:first-child {
+ border-left: 0;
+}
+
+#changelist .changelist-results,
+#changelist table {
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+}
+
+#changelist thead th:first-of-type,
+#changelist thead th:first-of-type a,
+#changelist thead *:first-child[style^="display: none"] + *,
+#changelist thead *:first-child[style^="display: none"] + * a {
+ border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px;
+}
+#changelist thead th:last-of-type,
+#changelist thead th:last-of-type a {
+ border-top-right-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px;
+}
+#changelist tbody tr:last-of-type>*:first-child,
+#changelist tbody tr:last-of-type>*:first-child[style^="display: none"] + * {
+ border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;
+}
+#changelist tbody tr:last-of-type>*:last-child,
+#changelist.editable tbody tr:last-of-type td:nth-last-child(-n+2) {
+ border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px;
+}
+
+#changelist thead *[style^="display: none"] + *,
+#changelist tbody tr *[style^="display: none"] + * {
+ border-left: 0;
+}
+
+
+
+/* Change History
+------------------------------------------------------------------------------------------------------ */
+
+table#change-history thead th:first-child {
+ border-top-left-radius: 5px; -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px;
+}
+table#change-history thead th:last-child {
+ border-top-right-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px;
+}
+
+
+
+/* Overrides
+------------------------------------------------------------------------------------------------------ */
+
+tbody th:first-child, tbody td:first-child {
+ border-left: 0;
+}
+tbody tr:last-child td, tbody tr:last-child th {
+ border-bottom: 0;
+}
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/ie.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/ie.css
new file mode 100644
index 0000000..1840905
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/ie.css
@@ -0,0 +1,39 @@
+body { text-align: center; }
+* html body legend { margin: 0px -8px 16px 0; padding: 0; }
+html > body p code { *white-space: normal; }
+
+.container { text-align: left; }
+
+sup { vertical-align: text-top; }
+
+sub { vertical-align: text-bottom; }
+
+hr { margin: -8px auto 11px; }
+
+img { -ms-interpolation-mode: bicubic; }
+
+fieldset { padding-top: 0; }
+
+legend { margin-top: -0.2em; margin-bottom: 1em; margin-left: -0.5em; }
+
+fieldset, #IE8#HACK { padding-top: 1.4em; }
+
+legend, #IE8#HACK { margin-top: 0; margin-bottom: 0; }
+
+textarea { overflow: auto; }
+
+label { position: relative; top: -0.25em; }
+
+input.text { margin: 0.5em 0; background-color: white; border: 1px solid #bbbbbb; }
+input.text:focus { border: 1px solid #666666; }
+input.title { margin: 0.5em 0; background-color: white; border: 1px solid #bbbbbb; }
+input.title:focus { border: 1px solid #666666; }
+input.checkbox { position: relative; top: 0.25em; }
+input.radio { position: relative; top: 0.25em; }
+input.button { position: relative; top: 0.25em; }
+
+textarea { margin: 0.5em 0; }
+
+select { margin: 0.5em 0; }
+
+button { position: relative; top: 0.25em; }
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/jquery-ui.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/jquery-ui.css
new file mode 100644
index 0000000..759a187
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/jquery-ui.css
@@ -0,0 +1,566 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.16
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+ list-style:none;
+ padding: 2px;
+ margin: 0;
+ display:block;
+ float: left;
+}
+.ui-menu .ui-menu {
+ margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+ margin:0;
+ padding: 0;
+ zoom: 1;
+ float: left;
+ clear: left;
+ width: 100%;
+}
+.ui-menu .ui-menu-item a {
+ text-decoration:none;
+ display:block;
+ padding:.2em .4em;
+ line-height:1.5;
+ zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+ font-weight: normal;
+ margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; }
+button.ui-button-icons-only { width: 3.7em; }
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4; }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+ display: none; /*sorry for IE5*/
+ display/**/: block; /*sorry for IE5*/
+ position: absolute; /*must have*/
+ z-index: -1; /*must have*/
+ filter: mask(); /*must have*/
+ top: -4px; /*must have*/
+ left: -4px; /*must have*/
+ width: 200px; /*must have*/
+ height: 200px; /*must have*/
+}/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
+.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}*/; }
+.ui-widget-content a { color: #222222/*{fcContent}*/; }
+.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; }
+.ui-widget-header a { color: #222222/*{fcHeader}*/; }
+
+/* Interaction states
+----------------------------------*/
+.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}*/; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
+.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}*/; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; }
+.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}*/; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.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}*/; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
+.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}*/; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-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}*/; }
+.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}*/; }
+.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}*/; }
+.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}*/; }
+
+/* Overlays */
+.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}*/; }
+.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}*/; } \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/jquery.autocomplete.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/jquery.autocomplete.css
new file mode 100644
index 0000000..44747e2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/jquery.autocomplete.css
@@ -0,0 +1,48 @@
+.ac_results {
+ padding: 0px;
+ border: 1px solid #cccccc;
+ background-color: white;
+ overflow: hidden;
+ z-index: 99999;
+}
+
+.ac_results ul {
+ width: 100%;
+ list-style-position: outside;
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.ac_results li {
+ margin: 0px;
+ padding: 2px 5px;
+ cursor: default;
+ display: block;
+ /*
+ if width will be 100% horizontal scrollbar will apear
+ when scroll mode will be used
+ */
+ /*width: 100%;*/
+ font: menu;
+ font-size: 12px;
+ /*
+ it is very important, if line-height not setted or setted
+ in relative units scroll will be broken in firefox
+ */
+ line-height: 16px;
+ overflow: hidden;
+}
+
+.ac_loading {
+ background: white url('indicator.gif') right center no-repeat;
+}
+
+.ac_odd {
+ background-color: #eee;
+}
+
+.ac_over {
+ background-color: #7CA0C7;
+ color: white;
+}
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/print.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/print.css
new file mode 100644
index 0000000..f89d498
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/print.css
@@ -0,0 +1,33 @@
+body { line-height: 1.5; font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; color: black; background: none; font-size: 10pt; }
+
+.container { background: none; }
+
+hr { background: #cccccc; color: #cccccc; width: 100%; height: 2px; margin: 2em 0; padding: 0; border: none; }
+hr.space { background: white; color: white; }
+
+h1, h2, h3, h4, h5, h6 { font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; }
+
+code { font-size: 0.9em; font-family: "andale mono", "lucida console", monospace; }
+
+a img { border: none; }
+a:link, a:visited { background: transparent; font-weight: 700; text-decoration: underline; }
+
+p img.top { margin-top: 0; }
+
+blockquote { margin: 1.5em; padding: 1em; font-style: italic; font-size: 0.9em; }
+
+.small { font-size: 0.9em; }
+
+.large { font-size: 1.1em; }
+
+.quiet { color: #999999; }
+
+.hide { display: none; }
+
+body { font-size: 2em; }
+body a, body a:link, body a:visited, body a:focus, body a:active, body a:hover { text-decoration: none; color: #006699; }
+
+#sidebar, .top-navigation, .commentForm { display: none; }
+
+#header h1 { margin-bottom: 0; }
+#header h1 a { font-size: 2em; font-weight: bold; }
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/screen.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/screen.css
new file mode 100644
index 0000000..4ef6458
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/screen.css
@@ -0,0 +1,569 @@
+body { line-height: 1.5; font-family: Arial, Helvetica, sans-serif; color: #333333; font-size: 75%; height:1500px;width:1500px}
+
+h1, h2, h3, h4, h5, h6 { font-weight: normal; color: #176691; border-radius:15px; }
+h1 img, h2 img, h3 img, h4 img, h5 img, h6 img { margin: 0; }
+
+h1 { font-size: 3em; line-height: 1; margin-bottom: 0.50em; }
+
+h2 { font-size: 2em; margin-bottom: 0.05em; }
+
+h3 { font-size: 1em; line-height: 1; margin-bottom: 1.00em; }
+
+h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; }
+
+h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.50em; }
+
+h6 { font-size: 1em; font-weight: bold; }
+
+p { margin: 0 0 1.5em; }
+p .left { display: inline; float: left; margin: 1.5em 1.5em 1.5em 0; padding: 0; }
+p .right { display: inline; float: right; margin: 1.5em 0 1.5em 1.5em; padding: 0; }
+
+a { text-decoration:underline; color: #0888CC; }
+a:visited { color: #006699; }
+a:focus { color: #003366; }
+a:hover { color: #E83E65; }
+a:active { color: #006699; }
+
+blockquote { margin-bottom: 1em; margin-left: 1em; margin-right: 1em; margin-top: 0.5em; color: #666666; font-style: oblique; }
+
+
+strong, dfn { font-weight: bold; }
+
+em, dfn { font-style: italic; }
+
+sup, sub { line-height: 0; }
+
+abbr, acronym { border-bottom: 1px dotted #666666; }
+
+address { margin: 0 0 1.5em; font-style: italic; }
+
+del { color: #666666; }
+
+pre { margin: 1.5em 0; white-space: pre; }
+
+pre, code, tt { font: 1em "andale mono", "lucida console", monospace; line-height: 1.5; }
+
+li ul, li ol { margin: 0; }
+
+ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 1.5em; }
+
+ul { list-style-type: disc; }
+
+ol { list-style-type: decimal; }
+
+dl { margin: 0 0 1.5em 0; }
+dl dt { font-weight: bold; }
+
+dd { margin-left: 1.5em; }
+
+table { margin-bottom: 1.4em; width: 100%; }
+
+th { font-weight: bold; }
+
+thead th { background: #c3d9ff; }
+
+th, td, caption { padding: 4px 10px 4px 5px; }
+
+table.striped tr:nth-child(even) td, table tr.even td { background: #e5ecf9; }
+
+tfoot { font-style: italic; }
+
+caption { background: #eeeeee; }
+
+.quiet { color: #666666; }
+
+.loud { color: #111111; }
+
+.clear { clear: both; }
+
+.nowrap { white-space: nowrap; }
+
+.clearfix { overflow: hidden; *zoom: 1; }
+
+.small { font-size: 0.8em; margin-bottom: 1.875em; line-height: 1.875em; }
+
+.large { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; }
+
+.first { margin-left: 0; padding-left: 0; }
+
+.last { margin-right: 0; padding-right: 0; }
+
+.top { margin-top: 0; padding-top: 0; }
+
+.bottom { margin-bottom: 0; padding-bottom: 0; }
+
+.container { width: 950px; margin: 0 auto; overflow: hidden; *zoom: 1; }
+
+.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 { display: inline; float: left; margin-right: 10px; }
+* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 { overflow-x: hidden; }
+
+.last { margin-right: 0; }
+
+.span-1 { width: 30px; }
+
+.span-2 { width: 70px; }
+
+.span-3 { width: 110px; }
+
+.span-4 { width: 150px; }
+
+.span-5 { width: 190px; }
+
+.span-6 { width: 230px; }
+
+.span-7 { width: 270px; }
+
+.span-8 { width: 310px; }
+
+.span-9 { width: 350px; }
+
+.span-10 { width: 390px; }
+
+.span-11 { width: 430px; }
+
+.span-12 { width: 470px; }
+
+.span-13 { width: 510px; }
+
+.span-14 { width: 550px; }
+
+.span-15 { width: 590px; }
+
+.span-16 { width: 500px; }
+
+.span-17 { width: 670px; }
+
+.span-18 { width: 710px; }
+
+.span-19 { width: 750px; }
+
+.span-20 { width: 790px; }
+
+.span-21 { width: 830px; }
+
+.span-22 { width: 870px; }
+
+.span-23 { width: 910px; }
+
+.span-24 { width: 950px; margin: 0; }
+
+input.span-1, textarea.span-1, select.span-1 { width: 30px; }
+input.span-2, textarea.span-2, select.span-2 { width: 70px; }
+input.span-3, textarea.span-3, select.span-3 { width: 110px; }
+input.span-4, textarea.span-4, select.span-4 { width: 150px; }
+input.span-5, textarea.span-5, select.span-5 { width: 190px; }
+input.span-6, textarea.span-6, select.span-6 { width: 230px; }
+input.span-7, textarea.span-7, select.span-7 { width: 270px; }
+input.span-8, textarea.span-8, select.span-8 { width: 310px; }
+input.span-9, textarea.span-9, select.span-9 { width: 350px; }
+input.span-10, textarea.span-10, select.span-10 { width: 390px; }
+input.span-11, textarea.span-11, select.span-11 { width: 430px; }
+input.span-12, textarea.span-12, select.span-12 { width: 470px; }
+input.span-13, textarea.span-13, select.span-13 { width: 510px; }
+input.span-14, textarea.span-14, select.span-14 { width: 550px; }
+input.span-15, textarea.span-15, select.span-15 { width: 590px; }
+input.span-16, textarea.span-16, select.span-16 { width: 630px; }
+input.span-17, textarea.span-17, select.span-17 { width: 670px; }
+input.span-18, textarea.span-18, select.span-18 { width: 710px; }
+input.span-19, textarea.span-19, select.span-19 { width: 750px; }
+input.span-20, textarea.span-20, select.span-20 { width: 790px; }
+input.span-21, textarea.span-21, select.span-21 { width: 830px; }
+input.span-22, textarea.span-22, select.span-22 { width: 870px; }
+input.span-23, textarea.span-23, select.span-23 { width: 910px; }
+input.span-24, textarea.span-24, select.span-24 { width: 950px; }
+
+.append-1 { padding-right: 40px; }
+
+.append-2 { padding-right: 80px; }
+
+.append-3 { padding-right: 120px; }
+
+.append-4 { padding-right: 160px; }
+
+.append-5 { padding-right: 200px; }
+
+.append-6 { padding-right: 240px; }
+
+.append-7 { padding-right: 280px; }
+
+.append-8 { padding-right: 320px; }
+
+.append-9 { padding-right: 360px; }
+
+.append-10 { padding-right: 400px; }
+
+.append-11 { padding-right: 440px; }
+
+.append-12 { padding-right: 480px; }
+
+.append-13 { padding-right: 520px; }
+
+.append-14 { padding-right: 560px; }
+
+.append-15 { padding-right: 600px; }
+
+.append-16 { padding-right: 640px; }
+
+.append-17 { padding-right: 680px; }
+
+.append-18 { padding-right: 720px; }
+
+.append-19 { padding-right: 760px; }
+
+.append-20 { padding-right: 800px; }
+
+.append-21 { padding-right: 840px; }
+
+.append-22 { padding-right: 880px; }
+
+.append-23 { padding-right: 920px; }
+
+.prepend-1 { padding-left: 40px; }
+
+.prepend-2 { padding-left: 80px; }
+
+.prepend-3 { padding-left: 120px; }
+
+.prepend-4 { padding-left: 160px; }
+
+.prepend-5 { padding-left: 200px; }
+
+.prepend-6 { padding-left: 240px; }
+
+.prepend-7 { padding-left: 280px; }
+
+.prepend-8 { padding-left: 320px; }
+
+.prepend-9 { padding-left: 360px; }
+
+.prepend-10 { padding-left: 400px; }
+
+.prepend-11 { padding-left: 440px; }
+
+.prepend-12 { padding-left: 480px; }
+
+.prepend-13 { padding-left: 520px; }
+
+.prepend-14 { padding-left: 560px; }
+
+.prepend-15 { padding-left: 600px; }
+
+.prepend-16 { padding-left: 640px; }
+
+.prepend-17 { padding-left: 680px; }
+
+.prepend-18 { padding-left: 720px; }
+
+.prepend-19 { padding-left: 760px; }
+
+.prepend-20 { padding-left: 800px; }
+
+.prepend-21 { padding-left: 840px; }
+
+.prepend-22 { padding-left: 880px; }
+
+.prepend-23 { padding-left: 920px; }
+
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 { display: inline; float: left; position: relative; }
+
+.pull-1 { margin-left: -40px; }
+
+.pull-2 { margin-left: -80px; }
+
+.pull-3 { margin-left: -120px; }
+
+.pull-4 { margin-left: -160px; }
+
+.pull-5 { margin-left: -200px; }
+
+.pull-6 { margin-left: -240px; }
+
+.pull-7 { margin-left: -280px; }
+
+.pull-8 { margin-left: -320px; }
+
+.pull-9 { margin-left: -360px; }
+
+.pull-10 { margin-left: -400px; }
+
+.pull-11 { margin-left: -440px; }
+
+.pull-12 { margin-left: -480px; }
+
+.pull-13 { margin-left: -520px; }
+
+.pull-14 { margin-left: -560px; }
+
+.pull-15 { margin-left: -600px; }
+
+.pull-16 { margin-left: -640px; }
+
+.pull-17 { margin-left: -680px; }
+
+.pull-18 { margin-left: -720px; }
+
+.pull-19 { margin-left: -760px; }
+
+.pull-20 { margin-left: -800px; }
+
+.pull-21 { margin-left: -840px; }
+
+.pull-22 { margin-left: -880px; }
+
+.pull-23 { margin-left: -920px; }
+
+.pull-24 { margin-left: -960px; }
+
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 { display: inline; float: left; position: relative; }
+
+.push-1 { margin: 0 -40px 1.5em 40px; }
+
+.push-2 { margin: 0 -80px 1.5em 80px; }
+
+.push-3 { margin: 0 -120px 1.5em 120px; }
+
+.push-4 { margin: 0 -160px 1.5em 160px; }
+
+.push-5 { margin: 0 -200px 1.5em 200px; }
+
+.push-6 { margin: 0 -240px 1.5em 240px; }
+
+.push-7 { margin: 0 -280px 1.5em 280px; }
+
+.push-8 { margin: 0 -320px 1.5em 320px; }
+
+.push-9 { margin: 0 -360px 1.5em 360px; }
+
+.push-10 { margin: 0 -400px 1.5em 400px; }
+
+.push-11 { margin: 0 -440px 1.5em 440px; }
+
+.push-12 { margin: 0 -480px 1.5em 480px; }
+
+.push-13 { margin: 0 -520px 1.5em 520px; }
+
+.push-14 { margin: 0 -560px 1.5em 560px; }
+
+.push-15 { margin: 0 -600px 1.5em 600px; }
+
+.push-16 { margin: 0 -640px 1.5em 640px; }
+
+.push-17 { margin: 0 -680px 1.5em 680px; }
+
+.push-18 { margin: 0 -720px 1.5em 720px; }
+
+.push-19 { margin: 0 -760px 1.5em 760px; }
+
+.push-20 { margin: 0 -800px 1.5em 800px; }
+
+.push-21 { margin: 0 -840px 1.5em 840px; }
+
+.push-22 { margin: 0 -880px 1.5em 880px; }
+
+.push-23 { margin: 0 -920px 1.5em 920px; }
+
+.push-24 { margin: 0 -960px 1.5em 960px; }
+
+.prepend-top { margin-top: 1.5em; }
+
+.append-bottom { margin-bottom: 1.5em; }
+
+.showgrid { background: url('/../img/grid.png?1317027277'); }
+
+.feedback, .error, .alert, .notice, .success, .info { padding: 0.8em; margin-bottom: 1em; border: 2px solid #dddddd; }
+
+.error, .alert { background: #fbe3e4; color: #8a1f11; border-color: #fbc2c4; }
+.error a, .alert a { color: #8a1f11; }
+
+.notice { background: #fff6bf; color: #514721; border-color: #ffd324; }
+.notice a { color: #514721; }
+
+.success { background: #e6efc2; color: #264409; border-color: #c6d880; }
+.success a { color: #264409; }
+
+.info { background: #d5edf8; color: #205791; border-color: #92cae4; }
+.info a { color: #205791; }
+
+.hide { display: none; }
+
+.highlight { background: yellow; }
+
+.added { background: #006600; color: white; }
+
+.removed { background: #990000; color: white; }
+
+label { font-weight: bold; }
+
+fieldset { padding: 1.4em; margin: 0 0 1.5em 0; }
+
+legend { font-weight: bold; font-size: 1.2em; }
+
+input.text, input.title, input[type=email], input[type=text], input[type=password] { margin: 0.5em 0; background-color: white; padding: 5px; }
+input.title { font-size: 1.5em; }
+
+textarea { margin: 0.5em 0; padding: 5px; }
+
+select { margin: 0.5em 0; }
+
+fieldset { border: 1px solid #cccccc; }
+
+input.text, input.title, input[type=email], input[type=text], input[type=password], textarea { background-color: #fff; border: 1px solid #bbbbbb; }
+input.text:focus, input.title:focus, input[type=email]:focus, input[type=text]:focus, input[type=password]:focus, textarea:focus { border: 1px solid #666666; }
+
+select { background-color: #fff; border-width: 1px; border-style: solid; }
+
+input.text, input.title, input[type=email], input[type=text], input[type=password] { width: 300px; }
+
+textarea { width: 390px; height: 250px; }
+
+body { background: transparent url(../img/background.gif) repeat-x scroll left top; }
+
+ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 3.333em; }
+
+a { text-decoration: none; }
+a:hover { text-decoration: underline; }
+
+#header { margin-bottom: 1em; border-bottom: 1px solid #e9e9f3; }
+#header h1 { font-size: 2em; font-weight: bold; margin-bottom: 0; }
+#header .top-navigation { float: right; }
+#header .top-navigation img { border: 0; }
+#header .top-navigation .link { padding-left: 1.5em; }
+#header .top-navigation .sitemap { background: transparent url(../img/sitemap.png) no-repeat scroll left center; }
+#header .top-navigation .feeds { background: transparent url(../img/rss.png) no-repeat scroll left center; }
+
+#breadcrumbs { background-color:#0888CC; font-size: 1.2em; color:white; }
+#b1 {position:relative; center:5%; background-color:#43AEE7; color: white; border: 1px solid #000000; font-size:1em;}
+#b2 {position:relative; center:6%; background-color:#43AEE7; color: white; border: 1px solid #000000; font-size:1em;}
+
+#body { margin-bottom: 1em; border-bottom: 1px solid #e9e9f3; }
+
+#content h1, #content h2, #content h3 { margin-top: 10px; }
+
+/* copied from structure.css */
+#content {
+ position: relative;
+ float: left;
+ clear: both;
+ margin-bottom: 10px;
+ margin-left: 0;
+ margin-right: 60px;
+ margin-top: 10px;
+ padding-right: 30px;
+ width:250px;
+}
+
+#graph {
+ position: absolute;
+ float: left;
+ clear: both;
+ margin-bottom: 10px;
+ margin-left: 0;
+ margin-right: 60px;
+ margin-top: 10px;
+ padding-right: 30px;
+ width: 250px;
+}
+
+/* copied from tools.css */
+.tools {
+ position: relative;
+ float: left;
+ clear: both;
+ padding: 6px 10px;
+ font-size: 11px;
+ font-weight: bold;
+}
+#sidebar{position:absolute; margin-left:1000px; margin-right:150px; margin-top:10px; width:300px;}
+#sidebar div:first-child h3 { margin-top:0px; }
+#sidebar h3 { background-color: #C4EBF4; padding: 0.5em; }
+#sidebar p { padding-left: 1em; }
+#sidebar ul, #sidebar ol { padding-left: 2.5em; list-style-image: url(../img/bullet.png); }
+#sidebar li ul, #sidebar li ol { margin: 0 0.0em 0 0; }
+#sidebar input { width: auto; }
+#button {background-color:#43AEE7; color: white;}
+#sidebar .calendar h3 { margin-bottom: 0; }
+#sidebar .calendar .month-navigation { padding-bottom: 1.5em; }
+#sidebar .calendar .month-navigation .month-previous { float: left; }
+#sidebar .calendar .month-navigation .month-next { float: right; }
+#sidebar .tags div { padding: 0 5px 0 18px; }
+#sidebar .tags div ul { list-style-type: none; list-style: none; font-size: 1.5em; line-height: 1.8em; }
+#sidebar .tags div ul, #sidebar .tags div ul li { margin: 0px; padding: 0px; display: inline; }
+#sidebar .tags div ul li { list-style-image: none; list-style-type: none; margin-left: 0px; }
+#sidebar .tags div ul .tag_1 { font-size: 0.75em; color: #001e2d; }
+#sidebar .tags div ul .tag_2 { font-size: 1em; color: #00334c; }
+#sidebar .tags div ul .tag_3 { font-size: 1.125em; color: #005b89; }
+#sidebar .tags div ul .tag_4 { font-size: 2em; color: #0070a8; }
+#sidebar .tags div ul .tag_5 { font-size: 2.25em; color: #0099e5; }
+#sidebar .tags div ul .tag_6 { font-size: 3em; color: #00adff; }
+
+th.month{padding:0cm 2.5cm;}
+table.month { margin-bottom: 0; }
+table.month th.month { text-transform: uppercase; color: #006699; background: none; }
+table.month th { text-transform: capitalize; color: #917E7E; background-color: #C4EBF4; border-radius:15px;}
+table.month td { text-align: center; font-weight: bold; }
+table.month td.objecttype { background-color: #C4EBF4; }
+
+div.paginator { margin-bottom: 1em; }
+div.paginator span { font-size: 1.2em; margin-left: 0.3em; padding: 0 0.5em 0 0.5em; float: left; border: 1px solid #e9e9f3; }
+div.paginator span.index { margin-left: 0; }
+div.paginator span.page:hover, div.paginator span.next:hover, div.paginator span.previous:hover { background-color: #006699; }
+div.paginator span.page:hover a, div.paginator span.next:hover a, div.paginator span.previous:hover a { color: white; }
+div.paginator span.current { border-color: #006699; background-color: #006699; color: white; }
+
+.hobjecttype { margin-bottom: 1em; }
+.hobjecttype .objecttype-header { margin-bottom: 1em; border-radius:15px;}
+.hobjecttype .objecttype-header .objecttype-title { margin: 0; padding-left: 0.25em; padding-right: 0.25em; background-color:#C4EBF4}
+.hobjecttype .objecttype-header .objecttype-info { margin: 0; padding-left: 2em; background: #C4EBF4 url(../img/metatype.png) no-repeat scroll 0.5em; border-radius:15px;}
+.hobjecttype .objecttype-body .objecttype-content { padding-left: 1em; padding-right: 1em; }
+.hobjecttype .objecttype-body .objecttype-image { margin-top: -1.5em; }
+.hobjecttype .objecttype-body .objecttype-image p img { border: 0; margin: 0 1.5em 1.5em 0; }
+.hobjecttype .objecttype-footer p { margin-bottom: 0; }
+.hobjecttype .objecttype-footer p strong { padding-left: 1.5em; }
+.hobjecttype .objecttype-footer .objecttype-tags strong { background: transparent url(../img/tags.png) no-repeat scroll; }
+.hobjecttype .objecttype-footer .objecttype-shorturl strong { background: transparent url(../img/shorturl.png) no-repeat scroll; }
+.hobjecttype .objecttype-footer .objecttype-comments strong { background: transparent url(../img/comments.png) no-repeat scroll; }
+.hobjecttype .objecttype-header { background-color: #C4EBF4; }
+.hobjecttype .objecttype-content p { font-size: 1.2em; }
+.hobjecttype .objecttype-content pre, .hobjecttype .objecttype-content blockquote { overflow: auto; padding: 1em; clear: none; float: none; margin: 0 0 1.5em 0; width: auto; }
+.hobjecttype .objecttype-content blockquote { margin: 0 2em 1.5em 2em; border: 1px dashed #94949e; background-color: #fafaff; }
+.hobjecttype .objecttype-content blockquote p { font-size: 1.5em; margin: 0; }
+.hobjecttype .objecttype-content pre { line-height: 110%; background-color: #e9e9ff; border-top: 1px solid #94949e; border-bottom: 1px solid #94949e; }
+.hobjecttype .objecttype-footer p strong { color: #94949e; }
+
+.objecttype-widgets ul, .objecttype-widgets ol { padding-left: 2.5em; list-style-image: url(../img/bullet.png); }
+
+.featured .objecttype-header { background-color: #c4d9c4; }
+
+.hnodetype { margin-bottom: 1em; }
+.hnodetype .nodetype-header { margin-bottom: 1em; }
+.hnodetype .nodetype-header .nodetype-title { margin: 0; padding-left: 0.25em; padding-right: 0.25em; }
+.hnodetype .nodetype-header .nodetype-info { margin: 0; padding-left: 2em; background: transparent url(../img/Objecttype.png) no-repeat scroll 0.5em; }
+.hnodetype .nodetype-body .nodetype-content { padding-left: 1em; padding-right: 1em; }
+.hnodetype .nodetype-body .nodetype-image { margin-top: -1.5em; }
+.hnodetype .nodetype-body .nodetype-image p img { border: 0; margin: 0 1.5em 1.5em 0; }
+.hnodetype .nodetype-footer p { margin-bottom: 0; }
+.hnodetype .nodetype-footer p strong { padding-left: 1.5em; }
+.hnodetype .nodetype-footer .nodetype-tags strong { background: transparent url(../img/tags.png) no-repeat scroll; }
+.hnodetype .nodetype-footer .nodetype-shorturl strong { background: transparent url(../img/shorturl.png) no-repeat scroll; }
+.hnodetype .nodetype-footer .nodetype-comments strong { background: transparent url(../img/comments.png) no-repeat scroll; }
+.hnodetype .nodetype-header { background-color: #ffffff; }
+.hnodetype .nodetype-content p { font-size: 1.2em; }
+.hnodetype .nodetype-content pre, .hnodetype .nodetype-content blockquote { overflow: auto; padding: 1em; clear: none; float: none; margin: 0 0 1.5em 0; width: auto; }
+.hnodetype .nodetype-content blockquote { margin: 0 2em 1.5em 2em; border: 1px dashed #94949e; background-color: #fafaff; }
+.hnodetype .nodetype-content blockquote p { font-size: 1.5em; margin: 0; }
+.hnodetype .nodetype-content pre { line-height: 110%; background-color: #e9e9ff; border-top: 1px solid #94949e; border-bottom: 1px solid #94949e; }
+.hnodetype .nodetype-footer p strong { color: #94949e; }
+
+.nodetype-widgets ul, .nodetype-widgets ol { padding-left: 2.5em; list-style-image: url(../img/bullet.png); }
+
+.featured .nodetype-header { background-color: #c4d9c4; }
+
+ol#comment-list, ol#pingback-list, ol#trackback-list { width: 100%; margin-bottom: 0; padding-left: 1em; }
+ol#comment-list li, ol#pingback-list li, ol#trackback-list li { margin-bottom: 1em; border: 1px solid #e9e9f3; }
+ol#comment-list li.box2, ol#pingback-list li.box2, ol#trackback-list li.box2 { border-color: #94949e; background-color: #e9e9f3; }
+ol#comment-list li.post-author, ol#pingback-list li.post-author, ol#trackback-list li.post-author { color: #94949e; }
+ol#comment-list li p, ol#pingback-list li p, ol#trackback-list li p { margin-bottom: 0.5em; }
+ol#comment-list li img, ol#pingback-list li img, ol#trackback-list li img { padding: 5px; }
+ol#comment-list li .pingback-body, ol#comment-list li .trackback-body, ol#pingback-list li .pingback-body, ol#pingback-list li .trackback-body, ol#trackback-list li .pingback-body, ol#trackback-list li .trackback-body { padding: 5px; }
+ol#comment-list li .comment-author, ol#comment-list li .pingback-author, ol#comment-list li .trackback-author, ol#pingback-list li .comment-author, ol#pingback-list li .pingback-author, ol#pingback-list li .trackback-author, ol#trackback-list li .comment-author, ol#trackback-list li .pingback-author, ol#trackback-list li .trackback-author { font-size: 1.2em; font-weight: bold; color: #666666; }
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/slider.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/slider.css
new file mode 100644
index 0000000..d3bae53
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/slider.css
@@ -0,0 +1,12 @@
+#slider { width: 400px; padding-right: 230px; position: relative; height: 250px; overflow: hidden; margin-bottom: 5px; }
+#slider ul.ui-tabs-nav { list-style: none; padding: 0; margin: 0; top: 0; left: 400px; width: 230px; position: absolute; overflow: hidden; }
+#slider ul.ui-tabs-nav li a { display: block; height: 49px; border-bottom: 1px solid #e9e9f3; }
+#slider ul.ui-tabs-nav li a img { float: left; border: 0; padding: 3px; width: 78.4px; height: 43px; }
+#slider ul.ui-tabs-nav li a:hover { text-decoration: none; background: #e9e9f3; }
+#slider ul.ui-tabs-nav li.ui-tabs-selected a { background: #44aadd; color: white; }
+#slider div.ui-tabs-panel { position: relative; width: 400px; height: 250px; }
+#slider div.ui-tabs-panel .panel_info { left: 0; bottom: 0; position: absolute; height: 70px; padding: 5px; color: white; background: url(../img/trans.png); width: 390px; }
+#slider div.ui-tabs-panel a { color: #44aadd; }
+#slider div.ui-tabs-panel h2 { margin: 0; overflow: hidden; }
+#slider div.ui-tabs-panel img { width: 400px; height: 250px; }
+#slider .ui-tabs-hide { display: none; }
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_base.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_base.sass
new file mode 100644
index 0000000..9b9f570
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_base.sass
@@ -0,0 +1,32 @@
+// Here is where you can define your constants for your application
+// and to configure the blueprint framework.
+
+$blueprint_grid_columns: 24
+$blueprint_container_size: 950px
+$blueprint_grid_margin: 10px
+
+// Use this to calculate the width based on the total width.
+// Or you can set !blueprint_grid_width to a fixed value
+// and unset !blueprint_container_size -- it will be calculated for you.
+
+$blueprint_font_size: 12px
+$blueprint_font_family: unquote("Arial, Helvetica, sans-serif")
+$blueprint_grid_width: ($blueprint_container_size + $blueprint_grid_margin) / $blueprint_grid_columns - $blueprint_grid_margin
+
+// Colors
+$font_color: #333333
+$link_color: #006699
+$box_color: #e9e9f3
+
+// Derived colors
+$box_font_color: $box_color - #555555
+$link_hover_color: $link_color - #333333
+$link_active_color: $link_color
+$link_visited_color: $link_color
+$header_color: $link_color + #333333
+
+// Mixins
+@import gbobject
+@import calendar
+@import paginator
+@import tag-cloud
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_calendar.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_calendar.sass
new file mode 100644
index 0000000..d3c18d5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_calendar.sass
@@ -0,0 +1,15 @@
+=calendar($head_color, $box_color, $box_font_color)
+ margin-bottom: 0
+ th.month
+ text-transform: uppercase
+ color: $head_color
+ background: none
+ th
+ text-transform: capitalize
+ color: $box_font_color
+ background-color: $box_color
+ td
+ text-align: center
+ font-weight: bold
+ &.gbobject
+ background-color: $box_color
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_gbobject.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_gbobject.sass
new file mode 100644
index 0000000..5805303
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_gbobject.sass
@@ -0,0 +1,35 @@
+=gbobject
+ margin-bottom: 1em
+ .gbobject-header
+ margin-bottom: 1em
+ .gbobject-title
+ margin: 0
+ padding-left: 0.25em
+ padding-right: 0.25em
+ .gbobject-info
+ margin: 0
+ padding-left: 2em
+ background: transparent url(../img/Objecttype.png) no-repeat scroll 0.5em
+ .gbobject-body
+ .gbobject-content
+ padding-left: 1em
+ padding-right: 1em
+ .gbobject-image
+ margin-top: -1.5em
+ p img
+ border: 0
+ margin: 0 1.5em 1.5em 0
+ .gbobject-footer
+ p
+ margin-bottom: 0
+ strong
+ padding-left: 1.5em
+ .gbobject-tags
+ strong
+ background: transparent url(../img/tags.png) no-repeat scroll
+ .gbobject-shorturl
+ strong
+ background: transparent url(../img/shorturl.png) no-repeat scroll
+ .gbobject-comments
+ strong
+ background: transparent url(../img/comments.png) no-repeat scroll
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_gstudio.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_gstudio.sass
new file mode 100644
index 0000000..5805303
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_gstudio.sass
@@ -0,0 +1,35 @@
+=gbobject
+ margin-bottom: 1em
+ .gbobject-header
+ margin-bottom: 1em
+ .gbobject-title
+ margin: 0
+ padding-left: 0.25em
+ padding-right: 0.25em
+ .gbobject-info
+ margin: 0
+ padding-left: 2em
+ background: transparent url(../img/Objecttype.png) no-repeat scroll 0.5em
+ .gbobject-body
+ .gbobject-content
+ padding-left: 1em
+ padding-right: 1em
+ .gbobject-image
+ margin-top: -1.5em
+ p img
+ border: 0
+ margin: 0 1.5em 1.5em 0
+ .gbobject-footer
+ p
+ margin-bottom: 0
+ strong
+ padding-left: 1.5em
+ .gbobject-tags
+ strong
+ background: transparent url(../img/tags.png) no-repeat scroll
+ .gbobject-shorturl
+ strong
+ background: transparent url(../img/shorturl.png) no-repeat scroll
+ .gbobject-comments
+ strong
+ background: transparent url(../img/comments.png) no-repeat scroll
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_paginator.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_paginator.sass
new file mode 100644
index 0000000..b1258fc
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_paginator.sass
@@ -0,0 +1,19 @@
+=paginator($link_color, $box_color)
+ margin-bottom: 1em
+ span
+ font-size: 1.2em
+ margin-left: 0.3em
+ padding: 0 0.5em 0 0.5em
+ float: left
+ border: 1px solid $box_color
+ &.index
+ margin-left: 0
+ &.page, &.next, &.previous
+ &:hover
+ background-color: $link_color
+ a
+ color: white
+ &.current
+ border-color: $link_color
+ background-color: $link_color
+ color: white
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_tag-cloud.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_tag-cloud.sass
new file mode 100644
index 0000000..6d859b6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/_tag-cloud.sass
@@ -0,0 +1,21 @@
+=tag-cloud($link_color, $base_size: 1em)
+ font-size: $base_size
+ line-height: 1.2 * $base_size
+ .tag_1
+ font-size: $base_size / 2
+ color: $link_color * 0.3
+ .tag_2
+ font-size: 2 * $base_size / 3
+ color: $link_color * 0.5
+ .tag_3
+ font-size: 3 * $base_size / 4
+ color: $link_color * 0.9
+ .tag_4
+ font-size: 4 * $base_size / 3
+ color: $link_color * 1.1
+ .tag_5
+ font-size: 3 * $base_size / 2
+ color: $link_color * 1.5
+ .tag_6
+ font-size: 2 * $base_size
+ color: $link_color * 1.7 \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/dashboard_gstudio.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/dashboard_gstudio.sass
new file mode 100644
index 0000000..1aa979d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/dashboard_gstudio.sass
@@ -0,0 +1,66 @@
+body
+ &.dashboard
+ #content
+ width: 75%
+
+.module
+ width: 400px
+ margin-right: 5px
+ table
+ width: 100%
+ th, td
+ font-size: 12px
+
+.managelink
+ background: url("../img/manage.png") no-repeat scroll 0 0.2em transparent
+ padding-left: 12px
+
+.previewlink
+ background: url("../img/preview.png") no-repeat scroll 0 0.2em transparent
+ padding-left: 12px
+
+input, textarea, select
+ border: 1px solid #cccccc
+
+.vTextField, .vLargeTextField
+ width: 25em
+
+.required label, label.required
+ color: #333333 !important
+ font-weight: bold !important
+
+.button
+ float: left
+ margin-right: 5px
+
+#contents
+ th
+ width: 50%
+ td
+ padding-left: 10px
+ a
+ font-weight: bold
+
+#quickpost
+ th
+ width: 20%
+ vertical-align: middle
+ td
+ width: 100%
+
+#comments
+ th
+ width: 10%
+ td
+ width: 100%
+ white-space: normal
+ a
+ display: inline
+
+#drafts, #linkbacks, #comments
+ th
+ font-weight: normal
+ a
+ font-weight: bold
+ abbr
+ color: #666666
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/dashboard_objectapp.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/dashboard_objectapp.sass
new file mode 100644
index 0000000..1aa979d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/dashboard_objectapp.sass
@@ -0,0 +1,66 @@
+body
+ &.dashboard
+ #content
+ width: 75%
+
+.module
+ width: 400px
+ margin-right: 5px
+ table
+ width: 100%
+ th, td
+ font-size: 12px
+
+.managelink
+ background: url("../img/manage.png") no-repeat scroll 0 0.2em transparent
+ padding-left: 12px
+
+.previewlink
+ background: url("../img/preview.png") no-repeat scroll 0 0.2em transparent
+ padding-left: 12px
+
+input, textarea, select
+ border: 1px solid #cccccc
+
+.vTextField, .vLargeTextField
+ width: 25em
+
+.required label, label.required
+ color: #333333 !important
+ font-weight: bold !important
+
+.button
+ float: left
+ margin-right: 5px
+
+#contents
+ th
+ width: 50%
+ td
+ padding-left: 10px
+ a
+ font-weight: bold
+
+#quickpost
+ th
+ width: 20%
+ vertical-align: middle
+ td
+ width: 100%
+
+#comments
+ th
+ width: 10%
+ td
+ width: 100%
+ white-space: normal
+ a
+ display: inline
+
+#drafts, #linkbacks, #comments
+ th
+ font-weight: normal
+ a
+ font-weight: bold
+ abbr
+ color: #666666
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/ie.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/ie.sass
new file mode 100644
index 0000000..5bad66b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/ie.sass
@@ -0,0 +1,3 @@
+@import blueprint
+
++blueprint-ie
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/print.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/print.sass
new file mode 100644
index 0000000..6453761
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/print.sass
@@ -0,0 +1,22 @@
+@import blueprint
+@import compass/utilities/links/link-colors
+
+$link_color: #006699
+
++blueprint-print
+
+body
+ font-size: 2em
+ a, a:link, a:visited, a:focus, a:active, a:hover
+ text-decoration: none
+ color: $link_color
+
+#sidebar, .top-navigation, .commentForm
+ display: none
+
+#header
+ h1
+ margin-bottom: 0
+ a
+ font-size: 2em
+ font-weight: bold \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/screen.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/screen.sass
new file mode 100644
index 0000000..9feb174
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/screen.sass
@@ -0,0 +1,198 @@
+@import base
+@import blueprint
+@import compass/utilities/lists/bullets
+@import compass/utilities/lists/inline-list
+@import compass/utilities/links/hover-link
+
++blueprint
+
+// Global
+body
+ background: transparent url(../img/background.gif) repeat-x scroll left top
+
+ul, ol
+ margin: 0 1.5em 1.5em 0
+ padding-left: 3.333em
+a
+ +hover-link
+
+// Header
+#header
+ margin-bottom: 1em
+ border-bottom: 1px solid $box_color
+ h1
+ font-size: 4em
+ font-weight: bold
+ margin-bottom: 0
+ .top-navigation
+ float: right
+ img
+ border: 0
+ .link
+ padding-left: 1.5em
+ .sitemap
+ background: transparent url(../img/sitemap.png) no-repeat scroll left center
+ .feeds
+ background: transparent url(../img/rss.png) no-repeat scroll left center
+
+// Breadcrumbs
+#breadcrumbs
+ font-size: 1.2em
+
+// Body
+#body
+ margin-bottom: 1em
+ border-bottom: 1px solid $box_color
+
+// Content
+#content
+ h1, h2, h3
+ margin-top: 0
+
+// Sidebar
+#sidebar
+ div:first-child
+ h3
+ margin-top: 0
+ h3
+ background-color: $box_color
+ padding: 0.5em
+ p
+ padding-left: 1em
+ ul, ol
+ padding-left: 2.5em
+ list-style-image: url(../img/bullet.png)
+ li ul, li ol
+ margin: 0 1.5em 0 0
+ input
+ width: auto
+ .calendar
+ h3
+ margin-bottom: 0
+ .month-navigation
+ padding-bottom: 1.5em
+ .month-previous
+ float: left
+ .month-next
+ float: right
+ .tags
+ div
+ padding: 0 5px 0 18px
+ ul
+ +inline-list
+ +no-bullets
+ +tag-cloud($link_color, 1.5em)
+
+// Calendar
+table.month
+ +calendar($link_color, $box_color, $box_font_color)
+
+// Pagination
+div.paginator
+ +paginator($link_color, $box_color)
+
+// Gbobject
+// .hgbobject
+// +gbobject
+// .gbobject-header
+// background-color: $box_color
+// .gbobject-content
+// p
+// font-size: 1.2em
+ // pre, blockquote
+ // overflow: auto
+ // padding: 1em
+ // clear: none
+ // float: none
+ // margin: 0 0 1.5em 0
+ // width: auto
+ // blockquote
+ // margin: 0 2em 1.5em 2em
+ // border: 1px dashed $box_font_color
+ // background-color: $box_color + #111
+ // p
+ // font-size: 1.5em
+ // margin: 0
+ // pre
+ // line-height: 110%
+ // background-color: $box_color + #002
+ // border-top: 1px solid $box_font_color
+ // border-bottom: 1px solid $box_font_color
+
+ // .gbobject-footer
+ // p
+ // strong
+ // color: $box_font_color
+
+ // .gbobject-widgets
+ // ul, ol
+ // padding-left: 2.5em
+ // list-style-image: url(../img/bullet.png)
+
+ // .featured
+ // .gbobject-header
+ // background-color: #C4D9C4
+
+//Nodetype
+.hnodetype
+ +ndoetype
+ .nodetype-header
+ background-color: $box_color
+ .nodetype-content
+ p
+ font-size: 1.2em
+ pre, blockquote
+ overflow: auto
+ padding: 1em
+ clear: none
+ float: none
+ margin: 0 0 1.5em 0
+ width: auto
+ blockquote
+ margin: 0 2em 1.5em 2em
+ border: 1px dashed $box_font_color
+ background-color: $box_color + #111
+ p
+ font-size: 1.5em
+ margin: 0
+ pre
+ line-height: 110%
+ background-color: $box_color + #002
+ border-top: 1px solid $box_font_color
+ border-bottom: 1px solid $box_font_color
+ .gbobject-footer
+ p
+ strong
+ color: $box_font_color
+.gbobject-widgets
+ ul, ol
+ padding-left: 2.5em
+ list-style-image: url(../img/bullet.png)
+.featured
+ .gbobject-header
+ background-color: #C4D9C4
+
+// Discussions
+ol#comment-list, ol#pingback-list, ol#trackback-list
+ width: 100%
+ margin-bottom: 0
+ padding-left: 1em
+ li
+ margin-bottom: 1em
+ border: 1px solid $box_color
+ &.box2
+ border-color: $box_font_color
+ background-color: $box_color
+ &.post-author
+ color: $box_font_color
+ p
+ margin-bottom: 0.5em
+ img
+ padding: 5px
+ .pingback-body, .trackback-body
+ padding: 5px
+ .comment-author, .pingback-author, .trackback-author,
+ font-size: 1.2em
+ font-weight: bold
+ color: #666
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/slider.sass b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/slider.sass
new file mode 100644
index 0000000..7172745
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/src/slider.sass
@@ -0,0 +1,74 @@
+@import base
+
+$max_width: 630px
+$number_of_items: 5
+
+$slider_width: 400px
+$slider_height: 250px
+$slider_color: $link_color + #444444
+
+$nav_padding: 3px
+$info_padding: 5px
+
+$tab_nav_width: $max_width - $slider_width
+$tab_nav_height: $slider_height / $number_of_items - 1
+$tab_nav_img_height: $tab_nav_height - $nav_padding * 2
+$tab_nav_img_width: $tab_nav_height * $slider_width / $slider_height
+
+#slider
+ width: $slider_width
+ padding-right: $tab_nav_width
+ position: relative
+ height: $slider_height
+ overflow: hidden
+ margin-bottom: 5px
+ ul.ui-tabs-nav
+ list-style: none
+ padding: 0
+ margin: 0
+ top: 0
+ left: $slider_width
+ width: $tab_nav_width
+ position: absolute
+ overflow: hidden
+ li
+ a
+ display: block
+ height: $tab_nav_height
+ border-bottom: 1px solid $box_color
+ img
+ float: left
+ border: 0
+ padding: $nav_padding
+ width: $tab_nav_img_width
+ height: $tab_nav_img_height
+ a:hover
+ text-decoration: none
+ background: $box_color
+ &.ui-tabs-selected
+ a
+ background: $slider_color
+ color: white
+ div.ui-tabs-panel
+ position: relative
+ width: $slider_width
+ height: $slider_height
+ .panel_info
+ left: 0
+ bottom: 0
+ position: absolute
+ height: 70px
+ padding: $info_padding
+ color: white
+ background: url(../img/trans.png)
+ width: $slider_width - $info_padding * 2
+ a
+ color: $slider_color
+ h2
+ margin: 0
+ overflow: hidden
+ img
+ width: $slider_width
+ height: $slider_height
+ .ui-tabs-hide
+ display: none
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/structures.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/structures.css
new file mode 100644
index 0000000..fd44c5a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/structures.css
@@ -0,0 +1,662 @@
+
+
+
+/* Body
+------------------------------------------------------------------------------------------------------ */
+
+body {
+ padding: 58px 20px 0;
+ font-family: Arial, sans-serif;
+ font-size: 12px;
+ line-height: 16px;
+}
+body.popup {
+ padding-top: 0;
+}
+
+
+
+/* Container
+------------------------------------------------------------------------------------------------------ */
+
+#container {
+ z-index: 0;
+ position: relative;
+ float: left;
+ clear: both;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+
+
+/* Header
+------------------------------------------------------------------------------------------------------ */
+
+#header {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1100;
+ padding: 0 20px;
+ width: 100%;
+ height: 30px;
+ font-size: 11px;
+ line-height: 14px;
+ font-weight: bold;
+}
+body.filebrowser.popup #header {
+ display: none;
+}
+
+
+
+/* Branding, Bookmarks & User-Tools
+------------------------------------------------------------------------------------------------------ */
+
+.branding, .admin-title,
+#bookmarks li, #user-tools li {
+ margin: 0;
+ padding: 8px 10px;
+}
+.branding {
+ display: none;
+ position: relative;
+ float: right;
+ width: 10px;
+ background: url('../img/grappelli-icon.png') 50% 50% no-repeat;
+}
+.admin-title {
+ position: relative;
+ float: left;
+ margin: 0 0 0 -20px;
+ padding-left: 20px;
+ padding-right: 20px;
+}
+#header ul li {
+ position: relative;
+ float: left;
+}
+
+
+/* Navigation Menu (UL Navigation-Menu of Admin-Tools) ................................................... */
+
+ul.navigation-menu {
+ position: relative;
+ float: left;
+}
+ul.navigation-menu li {
+ float: none !important;
+}
+ul.navigation-menu>li {
+ position: relative;
+ float: none !important;
+ display: block;
+ margin: 0;
+}
+ul.navigation-menu>li>a {
+ display: block;
+ padding: 8px 10px;
+ font-size: 11px !important;
+}
+ul.navigation-menu li.bookmark,
+ul.navigation-menu li.actions {
+ float: left !important;
+}
+ul.navigation-menu li ul {
+ position: absolute;
+ z-index: 1 !important;
+ float: none !important;
+ margin-top: -1px;
+ padding: 0;
+ min-width: 220px;
+ white-space: nowrap;
+
+/* box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;*/
+}
+ul.navigation-menu>li>a+ul {
+ overflow-x: hidden !important;
+/* padding-right: 20px;*/
+/* width: 500px;*/
+ box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;
+ box-shadow: 0 0 20px #333; -moz-box-shadow: 0 0 20px #333; -webkit-box-shadow: 0 0 20px #333;
+}
+ul.navigation-menu>li>ul>li.parent {
+ overflow-x: hidden !important;
+}
+
+ul.navigation-menu li ul ul {
+ position: relative;
+ float: none;
+ margin-top: 0;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ overflow: inherit;
+}
+
+ul.navigation-menu li li.item-collapse.item-open {
+ background: #3a3a3a;
+}
+ul.navigation-menu li li li.item-collapse.item-open {
+/* border: 1px solid #383838;*/
+ -moz-border-radius: 4px;
+ background: #424242;
+}
+ul.navigation-menu li li li.item-collapse.item-open + li {
+/* border: 0 !important;*/
+}
+ul.navigation-menu li li li li.item-collapse.item-open {
+/* border: 1px solid #404040;*/
+ background: #4a4a4a;
+}
+ul.navigation-menu li li li li.item-collapse.oitem-pen + li {
+/* border: 0 !important;*/
+}
+ul.navigation-menu li li li li li.item-collapse.item-open {
+/* border: 1px solid #484848;*/
+ background: #525252;
+}
+
+
+ul.navigation-menu li li {
+/* padding: 0 10px;*/
+}
+ul.navigation-menu li li li {
+/* margin: 0 -20px 0 -10px;*/
+/* padding: 0 10px 0 20px;*/
+ box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;
+}
+ul.navigation-menu li li li li {
+/* margin: 0 -10px 0 -20px;*/
+/* padding: 0 10px 0 30px;*/
+/* box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;*/
+}
+ul.navigation-menu li li li li li {
+/* margin: 0 -10px 0 -30px;*/
+/* padding: 0 10px 0 40px;*/
+ overflow: hidden;
+/* box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;*/
+}
+ul.navigation-menu li li li li li li {
+/* margin: 0 0 0 -40px;*/
+/* padding: 0 10px 0 50px;*/
+ overflow: hidden;
+/* box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;*/
+}
+
+
+ul.navigation-menu li li.last {
+ border-bottom: 0 !important;
+}
+
+ul.navigation-menu li ul ul>li:first-child a {
+/* margin-left: -10px;*/
+/* padding-left: 10px;*/
+}
+ul.navigation-menu li li a {
+ display: block;
+ padding: 8px 10px;
+ font-size: 11px;
+}
+ul.navigation-menu li li li a {
+ padding: 4px 10px 4px 20px;
+ font-size: 11px;
+ white-space: normal;
+}
+ul.navigation-menu li li li li a {
+ padding-left: 30px;
+}
+ul.navigation-menu li li li li li a {
+ padding-left: 40px;
+}
+ul.navigation-menu li li li li li li a {
+ padding-left: 50px;
+}
+ul.navigation-menu li.parent>a {
+ font-size: 11px;
+}
+ul.navigation-menu li li.parent>a {
+ font-size: 11px;
+}
+
+ul.navigation-menu li.item-collapse.item-closed>* {
+ display: none !important;
+}
+ul.navigation-menu li.item-collapse.item-open>* {
+ display: block !important;
+}
+
+ul.navigation-menu li.item-collapse a.item-collapse-handler-container {
+ display: block !important;
+/* padding: 10px 0 !important;*/
+}
+
+form#bookmark-form {
+ position: relative;
+ float: left;
+ padding: 3px 10px 1px 0;
+ height: 26px;
+}
+form#bookmark-form button {
+ position: relative; display: block;
+ margin: 3px 0 0;
+ width: 20px;
+ height: 20px;
+}
+
+ul.navigation-menu li.item-collapse a.item-collapse-handler {
+ position: relative;
+ float: right;
+ display: inline-block !important;
+ right: 0;
+ margin: -30px 0 -30px 0;
+ padding: 0;
+ width: 28px;
+ height: 30px;
+ cursor: pointer;
+}
+ul.navigation-menu li li li.item-collapse a.item-collapse-handler {
+ margin: -22px 0;
+ width: 28px;
+ height: 22px;
+}
+a.item-collapse-handler-container {
+ padding-right: 38px !important;
+}
+ul.navigation-menu li li.item-collapse.item-closed>a+a.item-collapse-handler:link,
+ul.navigation-menu li li.item-collapse.item-closed>a+a.item-collapse-handler:visited {
+ background: transparent url("../img/icons/icon-admin_tools-dropdown.png") no-repeat scroll 50% 50%;
+}
+ul.navigation-menu li li.item-collapse.item-closed>a+a.item-collapse-handler:hover,
+ul.navigation-menu li li.item-collapse.item-closed>a+a.item-collapse-handler:active {
+ background: transparent url("../img/icons/icon-admin_tools-dropdown-hover.png") no-repeat scroll 50% 50%;
+}
+ul.navigation-menu li li.item-collapse.item-open>a+a.item-collapse-handler:link,
+ul.navigation-menu li li.item-collapse.item-open>a+a.item-collapse-handler:visited {
+ background: transparent url("../img/icons/icon-admin_tools-dropdown-active.png") no-repeat scroll 50% 50%;
+}
+ul.navigation-menu li li.item-collapse.item-open>a+a.item-collapse-handler:hover,
+ul.navigation-menu li li.item-collapse.item-open>a+a.item-collapse-handler:active {
+ background: transparent url("../img/icons/icon-admin_tools-dropdown-active-hover.png") no-repeat scroll 50% 50%;
+}
+
+
+/* User Tools ................................................... */
+
+#user-tools {
+ position: absolute;
+ right: 40px;
+}
+#user-tools>li:last-child {
+ padding-right: 20px;
+}
+
+#user-tools li.user-options-container {
+ position: relative;
+ width: 200px;
+}
+
+li.user-options-container.open a.user-options-handler {
+ display: block;
+}
+ul.user-options {
+ display: none;
+}
+li.user-options-container.open ul.user-options {
+ display: block;
+ position: absolute;
+ float: none;
+ clear: both;
+ z-index: 1000;
+ margin: 7px -10px 0;
+ width: 221px;
+}
+ul.user-options li {
+ float: none !important;
+ clear: both;
+}
+ul.user-options li a {
+ display: block;
+}
+
+
+
+/* Breadcrumbs
+------------------------------------------------------------------------------------------------------ */
+
+div#breadcrumbs {
+ position: fixed;
+ top: 30px;
+ left: 0;
+ z-index: 1000;
+ padding: 5px 10px 5px 20px;
+ width: 100%;
+ font-size: 11px;
+/* font-weight: bold;*/
+ text-align: left;
+}
+div#breadcrumbs > a {
+ padding: 10px 2px;
+}
+body.popup div#breadcrumbs {
+ top: 0;
+}
+
+
+
+/* Messages
+------------------------------------------------------------------------------------------------------ */
+
+ul.messagelist {
+ position: relative;
+ top: 0;
+ z-index: 990;
+ margin: 0 -20px;
+}
+ul.messagelist li {
+ display: block;
+ padding: 5px 10px 5px 20px;
+ font-size: 11px;
+ font-weight: bold;
+}
+body.popup .breadcrumbs + ul.messagelist {
+ top: 24px;
+}
+body.filebrowser.popup ul.messagelist {
+ top: 28px;
+}
+body.login ul.messagelist {
+ top: -28px;
+}
+
+
+/* Masthead
+------------------------------------------------------------------------------------------------------ */
+
+#masthead {
+ position: relative;
+ float: left;
+ clear: both;
+ z-index: 900;
+ padding: 60px 0 10px;
+ width: 100%;
+}
+
+
+
+/* Login Form
+------------------------------------------------------------------------------------------------------ */
+
+div.login {
+ top: -30px;
+}
+#login-form {
+ margin: 0 auto;
+}
+
+
+
+/* Content
+------------------------------------------------------------------------------------------------------ */
+
+#content {
+ position: relative;
+ float: left;
+ clear: both;
+ margin:0 0 80px;
+
+ padding-right: 10px;
+ width: 50%;
+}
+#content.content-flexible {
+ width: 100%;
+}
+body.filebrowser.popup #content {
+ top: 28px;
+}
+
+
+
+/* Container
+------------------------------------------------------------------------------------------------------ */
+
+.container,
+.container-grid {
+ position: relative;
+ float: left;
+ clear: both;
+ width: 940px;
+}
+.container-flexible {
+ position: relative;
+ float: none;
+ clear: both;
+ width: auto;
+ height: 100%;
+}
+
+
+
+/* Blueprint Grid Columns & Spans
+------------------------------------------------------------------------------------------------------ */
+
+.column {
+ position: relative;
+ float: left;
+}
+.column.centered {
+ position: relative;
+ float: none !important;
+ margin: 0 auto !important;
+}
+.span-flexible {
+ position: relative;
+ width: 100%;
+}
+.container-flexible.layout-flexible-grid .span-flexible {
+ float: left;
+ margin-right: 20px;
+ width: 100%;
+}
+.container-flexible.layout-flexible-grid .span-flexible + .column {
+ float: left !important;
+}
+.container-flexible.layout-grid-flexible .column {
+ float: left;
+}
+.container-flexible.layout-grid-flexible .span-flexible {
+ float: left;
+ width: 100%;
+}
+fieldset.module .row .column:first-child {
+ margin-left: 0 !important;
+}
+fieldset.module .row .column:last-child {
+ margin-right: -20px !important;
+}
+fieldset.module .row .column.span-flexible:last-child {
+ margin-right: 0 !important;
+}
+.row .span-flexible,
+.row .span-flexible:last-child {
+ float: none;
+ width: auto;
+ margin-right: 0 !important;
+}
+
+
+/* Basic Float & Margin ......................................... */
+
+.span-1, .span-2, .span-3, .span-4, .span-5, .span-6,
+.span-7, .span-8, .span-9, .span-10, .span-11, .span-12,
+.span-13, .span-14, .span-15, .span-16, .span-17, .span-18,
+.span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {
+/* float: left;*/
+ margin-right: 20px;
+}
+.column.last { margin-right: 0; }
+
+
+/* Column Widths ......................................... */
+
+.span-1 { width: 20px; }
+.span-2 { width: 60px; }
+.span-3 { width: 100px; }
+.span-4 { width: 140px; }
+.span-5 { width: 180px; }
+.span-6 { width: 220px; }
+.span-7 { width: 260px; }
+.span-8 { width: 300px; }
+.span-9 { width: 340px; }
+.span-10 { width: 380px; }
+.span-11 { width: 420px; }
+.span-12 { width: 460px; }
+.span-13 { width: 500px; }
+.span-14 { width: 540px; }
+.span-15 { width: 580px; }
+.span-16 { width: 620px; }
+.span-17 { width: 660px; }
+.span-18 { width: 700px; }
+.span-19 { width: 740px; }
+.span-20 { width: 780px; }
+.span-21 { width: 820px; }
+.span-22 { width: 860px; }
+.span-23 { width: 900px; }
+.span-24 { width: 940px; margin: 0; }
+
+
+/* Append empty columns ......................................... */
+
+.append-1 { padding-right: 40px; }
+.append-2 { padding-right: 80px; }
+.append-3 { padding-right: 120px; }
+.append-4 { padding-right: 160px; }
+.append-5 { padding-right: 200px; }
+.append-6 { padding-right: 240px; }
+.append-7 { padding-right: 280px; }
+.append-8 { padding-right: 320px; }
+.append-9 { padding-right: 360px; }
+.append-10 { padding-right: 400px; }
+.append-11 { padding-right: 440px; }
+.append-12 { padding-right: 480px; }
+.append-13 { padding-right: 520px; }
+.append-14 { padding-right: 560px; }
+.append-15 { padding-right: 600px; }
+.append-16 { padding-right: 640px; }
+.append-17 { padding-right: 680px; }
+.append-18 { padding-right: 720px; }
+.append-19 { padding-right: 760px; }
+.append-20 { padding-right: 800px; }
+.append-21 { padding-right: 840px; }
+.append-22 { padding-right: 880px; }
+.append-23 { padding-right: 920px; }
+
+
+/* Prepend empty columns ......................................... */
+
+.prepend-1 { padding-left: 40px; }
+.prepend-2 { padding-left: 80px; }
+.prepend-3 { padding-left: 120px; }
+.prepend-4 { padding-left: 160px; }
+.prepend-5 { padding-left: 200px; }
+.prepend-6 { padding-left: 240px; }
+.prepend-7 { padding-left: 280px; }
+.prepend-8 { padding-left: 320px; }
+.prepend-9 { padding-left: 360px; }
+.prepend-10 { padding-left: 400px; }
+.prepend-11 { padding-left: 440px; }
+.prepend-12 { padding-left: 480px; }
+.prepend-13 { padding-left: 520px; }
+.prepend-14 { padding-left: 560px; }
+.prepend-15 { padding-left: 600px; }
+.prepend-16 { padding-left: 640px; }
+.prepend-17 { padding-left: 680px; }
+.prepend-18 { padding-left: 720px; }
+.prepend-19 { padding-left: 760px; }
+.prepend-20 { padding-left: 800px; }
+.prepend-21 { padding-left: 840px; }
+.prepend-22 { padding-left: 880px; }
+.prepend-23 { padding-left: 920px; }
+
+
+/* Span-X + Span-Flexible ......................................... */
+
+.span-1 + .span-flexible { margin-left: 40px; }
+.span-2 + .span-flexible { margin-left: 80px; }
+.span-3 + .span-flexible { margin-left: 120px; }
+.span-4 + .span-flexible { margin-left: 160px; Xmin-width: 758px; }
+.span-5 + .span-flexible { margin-left: 200px; }
+.span-6 + .span-flexible { margin-left: 240px; }
+.span-7 + .span-flexible { margin-left: 280px; }
+.span-8 + .span-flexible { margin-left: 320px; }
+.span-9 + .span-flexible { margin-left: 360px; }
+.span-10 + .span-flexible { margin-left: 400px; }
+.span-11 + .span-flexible { margin-left: 440px; }
+.span-12 + .span-flexible { margin-left: 480px; }
+.span-13 + .span-flexible { margin-left: 520px; }
+.span-14 + .span-flexible { margin-left: 560px; }
+.span-15 + .span-flexible { margin-left: 600px; }
+.span-16 + .span-flexible { margin-left: 640px; }
+.span-17 + .span-flexible { margin-left: 680px; }
+.span-18 + .span-flexible { margin-left: 720px; }
+.span-19 + .span-flexible { margin-left: 760px; }
+.span-20 + .span-flexible { margin-left: 800px; }
+.span-21 + .span-flexible { margin-left: 840px; }
+.span-22 + .span-flexible { margin-left: 880px; }
+.span-23 + .span-flexible { margin-left: 920px; }
+.span-24 + .span-flexible { margin-left: 960px; }
+
+
+/* Columns in Cells ......................................... */
+
+.cell.span-1 { width: 0px; }
+.cell.span-2 { width: 40px; }
+.cell.span-3 { width: 80px; }
+.cell.span-4 { width: 120px; }
+.cell.span-5 { width: 160px; }
+.cell.span-6 { width: 200px; }
+.cell.span-7 { width: 240px; }
+.cell.span-8 { width: 280px; }
+.cell.span-9 { width: 330px; }
+.cell.span-10 { width: 360px; }
+.cell.span-11 { width: 400px; }
+.cell.span-12 { width: 440px; }
+.cell.span-13 { width: 480px; }
+.cell.span-14 { width: 520px; }
+.cell.span-15 { width: 560px; }
+.cell.span-16 { width: 600px; }
+.cell.span-17 { width: 640px; }
+.cell.span-18 { width: 680px; }
+.cell.span-19 { width: 720px; }
+.cell.span-20 { width: 760px; }
+.cell.span-21 { width: 800px; }
+.cell.span-22 { width: 840px; }
+.cell.span-23 { width: 880px; }
+.cell.span-24 { width: 920px; margin: 0; }
+
+
+/* Clearing floats without extra markup
+ Based on How To Clear Floats Without Structural Markup by PiE
+ [http://www.positioniseverything.net/easyclearing.html] */
+
+.clearfix:after, .container:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+}
+.clearfix, .container { display: inline-block; }
+* html .clearfix,
+* html .container { height: 1%; }
+.clearfix, .container { display: block; }
+
+/* Regular clearing
+ apply to column that should drop below previous ones. */
+
+.clear { clear: both; }
+
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/wymeditor_styles.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/wymeditor_styles.css
new file mode 100644
index 0000000..fb2f569
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/css/wymeditor_styles.css
@@ -0,0 +1,45 @@
+/* EDITOR RELATED STYLES - CUSTOMIZE FOR YOUR NEEDS */
+/*
+ The classes panel, the visual feedback and the preview
+ will be affected by these values.
+
+ - Commented styles inside style definitions are used for visual
+ feedback when using the editor.
+ - Comments before opening the style are used as caption.
+ - Comments after the class name and before the style declaration ({)
+ define the jQuery expression that decides whether this
+ style should be applied or not.
+
+ Note: the WYMeditor and /WYMeditor comments below are required
+ for the CSS parser to work properly.
+*/
+
+/* WYMeditor */
+
+/* PARA: Highlight */
+p.highlight {
+ background: yellow;
+ /* background: yellow; border: 2px solid orange; */
+}
+
+/* PARA: Hidden note */
+p.hide {
+ display: none;
+ /* color: #999; border: 2px solid #ccc; */
+}
+
+/* IMG: floating left */
+img.left /* img[@class!="right"] */ {
+ display: inline;
+ float: left;
+ /* float: left; */
+}
+
+/* IMG: floating right */
+img.right /* img[@class!="left"] */ {
+ display: inline;
+ float: right;
+ /* float: right; */
+}
+
+/* /WYMeditor */
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/background.gif b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/background.gif
new file mode 100644
index 0000000..0f892b1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/background.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/bullet.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/bullet.png
new file mode 100644
index 0000000..3e9c121
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/bullet.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/comments.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/comments.png
new file mode 100644
index 0000000..64d81a5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/comments.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/community.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/community.png
new file mode 100644
index 0000000..bb8ca4a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/community.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/favicon.ico b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/favicon.ico
new file mode 100644
index 0000000..6baafb3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/favicon.ico
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/favicon.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/favicon.png
new file mode 100644
index 0000000..d3269bf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/favicon.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/grid.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/grid.png
new file mode 100644
index 0000000..129d4a2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/grid.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/help.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/help.png
new file mode 100644
index 0000000..8e49281
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/help.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/logo.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/logo.png
new file mode 100644
index 0000000..668cbfd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/logo.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/manage.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/manage.png
new file mode 100644
index 0000000..807b82d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/manage.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/objecttype.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/objecttype.png
new file mode 100644
index 0000000..6647a4b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/objecttype.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/plugin.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/plugin.png
new file mode 100644
index 0000000..0b26234
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/plugin.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/preview.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/preview.png
new file mode 100644
index 0000000..292c578
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/preview.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/rss.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/rss.png
new file mode 100644
index 0000000..9006ffe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/rss.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/shorturl.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/shorturl.png
new file mode 100644
index 0000000..25eacb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/shorturl.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/sitemap.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/sitemap.png
new file mode 100644
index 0000000..092c959
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/sitemap.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/tags.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/tags.png
new file mode 100644
index 0000000..1478033
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/tags.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/trans.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/trans.png
new file mode 100644
index 0000000..cd1db6c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/trans.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/comments.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/comments.png
new file mode 100644
index 0000000..981b1af
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/comments.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/gstudio.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/gstudio.png
new file mode 100644
index 0000000..d3269bf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/gstudio.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/watermark.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/watermark.png
new file mode 100644
index 0000000..09223aa
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/img/wlw/watermark.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.chart.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.chart.js
new file mode 100644
index 0000000..281d007
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.chart.js
@@ -0,0 +1,984 @@
+(function(){d3.chart = {};
+// Inspired by http://informationandvisualization.de/blog/box-plot
+d3.chart.box = function() {
+ var width = 1,
+ height = 1,
+ duration = 0,
+ domain = null,
+ value = Number,
+ whiskers = d3_chart_boxWhiskers,
+ quartiles = d3_chart_boxQuartiles,
+ tickFormat = null;
+
+ // For each small multiple…
+ function box(g) {
+ g.each(function(d, i) {
+ d = d.map(value).sort(d3.ascending);
+ var g = d3.select(this),
+ n = d.length,
+ min = d[0],
+ max = d[n - 1];
+
+ // Compute quartiles. Must return exactly 3 elements.
+ var quartileData = d.quartiles = quartiles(d);
+
+ // Compute whiskers. Must return exactly 2 elements, or null.
+ var whiskerIndices = whiskers && whiskers.call(this, d, i),
+ whiskerData = whiskerIndices && whiskerIndices.map(function(i) { return d[i]; });
+
+ // Compute outliers. If no whiskers are specified, all data are "outliers".
+ // We compute the outliers as indices, so that we can join across transitions!
+ var outlierIndices = whiskerIndices
+ ? d3.range(0, whiskerIndices[0]).concat(d3.range(whiskerIndices[1] + 1, n))
+ : d3.range(n);
+
+ // Compute the new x-scale.
+ var x1 = d3.scale.linear()
+ .domain(domain && domain.call(this, d, i) || [min, max])
+ .range([height, 0]);
+
+ // Retrieve the old x-scale, if this is an update.
+ var x0 = this.__chart__ || d3.scale.linear()
+ .domain([0, Infinity])
+ .range(x1.range());
+
+ // Stash the new scale.
+ this.__chart__ = x1;
+
+ // Note: the box, median, and box tick elements are fixed in number,
+ // so we only have to handle enter and update. In contrast, the outliers
+ // and other elements are variable, so we need to exit them! Variable
+ // elements also fade in and out.
+
+ // Update center line: the vertical line spanning the whiskers.
+ var center = g.selectAll("line.center")
+ .data(whiskerData ? [whiskerData] : []);
+
+ center.enter().insert("svg:line", "rect")
+ .attr("class", "center")
+ .attr("x1", width / 2)
+ .attr("y1", function(d) { return x0(d[0]); })
+ .attr("x2", width / 2)
+ .attr("y2", function(d) { return x0(d[1]); })
+ .style("opacity", 1e-6)
+ .transition()
+ .duration(duration)
+ .style("opacity", 1)
+ .attr("y1", function(d) { return x1(d[0]); })
+ .attr("y2", function(d) { return x1(d[1]); });
+
+ center.transition()
+ .duration(duration)
+ .style("opacity", 1)
+ .attr("y1", function(d) { return x1(d[0]); })
+ .attr("y2", function(d) { return x1(d[1]); });
+
+ center.exit().transition()
+ .duration(duration)
+ .style("opacity", 1e-6)
+ .attr("y1", function(d) { return x1(d[0]); })
+ .attr("y2", function(d) { return x1(d[1]); })
+ .remove();
+
+ // Update innerquartile box.
+ var box = g.selectAll("rect.box")
+ .data([quartileData]);
+
+ box.enter().append("svg:rect")
+ .attr("class", "box")
+ .attr("x", 0)
+ .attr("y", function(d) { return x0(d[2]); })
+ .attr("width", width)
+ .attr("height", function(d) { return x0(d[0]) - x0(d[2]); })
+ .transition()
+ .duration(duration)
+ .attr("y", function(d) { return x1(d[2]); })
+ .attr("height", function(d) { return x1(d[0]) - x1(d[2]); });
+
+ box.transition()
+ .duration(duration)
+ .attr("y", function(d) { return x1(d[2]); })
+ .attr("height", function(d) { return x1(d[0]) - x1(d[2]); });
+
+ // Update median line.
+ var medianLine = g.selectAll("line.median")
+ .data([quartileData[1]]);
+
+ medianLine.enter().append("svg:line")
+ .attr("class", "median")
+ .attr("x1", 0)
+ .attr("y1", x0)
+ .attr("x2", width)
+ .attr("y2", x0)
+ .transition()
+ .duration(duration)
+ .attr("y1", x1)
+ .attr("y2", x1);
+
+ medianLine.transition()
+ .duration(duration)
+ .attr("y1", x1)
+ .attr("y2", x1);
+
+ // Update whiskers.
+ var whisker = g.selectAll("line.whisker")
+ .data(whiskerData || []);
+
+ whisker.enter().insert("svg:line", "circle, text")
+ .attr("class", "whisker")
+ .attr("x1", 0)
+ .attr("y1", x0)
+ .attr("x2", width)
+ .attr("y2", x0)
+ .style("opacity", 1e-6)
+ .transition()
+ .duration(duration)
+ .attr("y1", x1)
+ .attr("y2", x1)
+ .style("opacity", 1);
+
+ whisker.transition()
+ .duration(duration)
+ .attr("y1", x1)
+ .attr("y2", x1)
+ .style("opacity", 1);
+
+ whisker.exit().transition()
+ .duration(duration)
+ .attr("y1", x1)
+ .attr("y2", x1)
+ .style("opacity", 1e-6)
+ .remove();
+
+ // Update outliers.
+ var outlier = g.selectAll("circle.outlier")
+ .data(outlierIndices, Number);
+
+ outlier.enter().insert("svg:circle", "text")
+ .attr("class", "outlier")
+ .attr("r", 5)
+ .attr("cx", width / 2)
+ .attr("cy", function(i) { return x0(d[i]); })
+ .style("opacity", 1e-6)
+ .transition()
+ .duration(duration)
+ .attr("cy", function(i) { return x1(d[i]); })
+ .style("opacity", 1);
+
+ outlier.transition()
+ .duration(duration)
+ .attr("cy", function(i) { return x1(d[i]); })
+ .style("opacity", 1);
+
+ outlier.exit().transition()
+ .duration(duration)
+ .attr("cy", function(i) { return x1(d[i]); })
+ .style("opacity", 1e-6)
+ .remove();
+
+ // Compute the tick format.
+ var format = tickFormat || x1.tickFormat(8);
+
+ // Update box ticks.
+ var boxTick = g.selectAll("text.box")
+ .data(quartileData);
+
+ boxTick.enter().append("svg:text")
+ .attr("class", "box")
+ .attr("dy", ".3em")
+ .attr("dx", function(d, i) { return i & 1 ? 6 : -6 })
+ .attr("x", function(d, i) { return i & 1 ? width : 0 })
+ .attr("y", x0)
+ .attr("text-anchor", function(d, i) { return i & 1 ? "start" : "end"; })
+ .text(format)
+ .transition()
+ .duration(duration)
+ .attr("y", x1);
+
+ boxTick.transition()
+ .duration(duration)
+ .text(format)
+ .attr("y", x1);
+
+ // Update whisker ticks. These are handled separately from the box
+ // ticks because they may or may not exist, and we want don't want
+ // to join box ticks pre-transition with whisker ticks post-.
+ var whiskerTick = g.selectAll("text.whisker")
+ .data(whiskerData || []);
+
+ whiskerTick.enter().append("svg:text")
+ .attr("class", "whisker")
+ .attr("dy", ".3em")
+ .attr("dx", 6)
+ .attr("x", width)
+ .attr("y", x0)
+ .text(format)
+ .style("opacity", 1e-6)
+ .transition()
+ .duration(duration)
+ .attr("y", x1)
+ .style("opacity", 1);
+
+ whiskerTick.transition()
+ .duration(duration)
+ .text(format)
+ .attr("y", x1)
+ .style("opacity", 1);
+
+ whiskerTick.exit().transition()
+ .duration(duration)
+ .attr("y", x1)
+ .style("opacity", 1e-6)
+ .remove();
+ });
+ d3.timer.flush();
+ }
+
+ box.width = function(x) {
+ if (!arguments.length) return width;
+ width = x;
+ return box;
+ };
+
+ box.height = function(x) {
+ if (!arguments.length) return height;
+ height = x;
+ return box;
+ };
+
+ box.tickFormat = function(x) {
+ if (!arguments.length) return tickFormat;
+ tickFormat = x;
+ return box;
+ };
+
+ box.duration = function(x) {
+ if (!arguments.length) return duration;
+ duration = x;
+ return box;
+ };
+
+ box.domain = function(x) {
+ if (!arguments.length) return domain;
+ domain = x == null ? x : d3.functor(x);
+ return box;
+ };
+
+ box.value = function(x) {
+ if (!arguments.length) return value;
+ value = x;
+ return box;
+ };
+
+ box.whiskers = function(x) {
+ if (!arguments.length) return whiskers;
+ whiskers = x;
+ return box;
+ };
+
+ box.quartiles = function(x) {
+ if (!arguments.length) return quartiles;
+ quartiles = x;
+ return box;
+ };
+
+ return box;
+};
+
+function d3_chart_boxWhiskers(d) {
+ return [0, d.length - 1];
+}
+
+function d3_chart_boxQuartiles(d) {
+ return [
+ d3.quantile(d, .25),
+ d3.quantile(d, .5),
+ d3.quantile(d, .75)
+ ];
+}
+// Chart design based on the recommendations of Stephen Few. Implementation
+// based on the work of Clint Ivy, Jamie Love, and Jason Davies.
+// http://projects.instantcognition.com/protovis/bulletchart/
+d3.chart.bullet = function() {
+ var orient = "left", // TODO top & bottom
+ reverse = false,
+ duration = 0,
+ ranges = d3_chart_bulletRanges,
+ markers = d3_chart_bulletMarkers,
+ measures = d3_chart_bulletMeasures,
+ width = 380,
+ height = 30,
+ tickFormat = null;
+
+ // For each small multiple…
+ function bullet(g) {
+ g.each(function(d, i) {
+ var rangez = ranges.call(this, d, i).slice().sort(d3.descending),
+ markerz = markers.call(this, d, i).slice().sort(d3.descending),
+ measurez = measures.call(this, d, i).slice().sort(d3.descending),
+ g = d3.select(this);
+
+ // Compute the new x-scale.
+ var x1 = d3.scale.linear()
+ .domain([0, Math.max(rangez[0], markerz[0], measurez[0])])
+ .range(reverse ? [width, 0] : [0, width]);
+
+ // Retrieve the old x-scale, if this is an update.
+ var x0 = this.__chart__ || d3.scale.linear()
+ .domain([0, Infinity])
+ .range(x1.range());
+
+ // Stash the new scale.
+ this.__chart__ = x1;
+
+ // Derive width-scales from the x-scales.
+ var w0 = d3_chart_bulletWidth(x0),
+ w1 = d3_chart_bulletWidth(x1);
+
+ // Update the range rects.
+ var range = g.selectAll("rect.range")
+ .data(rangez);
+
+ range.enter().append("svg:rect")
+ .attr("class", function(d, i) { return "range s" + i; })
+ .attr("width", w0)
+ .attr("height", height)
+ .attr("x", reverse ? x0 : 0)
+ .transition()
+ .duration(duration)
+ .attr("width", w1)
+ .attr("x", reverse ? x1 : 0);
+
+ range.transition()
+ .duration(duration)
+ .attr("x", reverse ? x1 : 0)
+ .attr("width", w1)
+ .attr("height", height);
+
+ // Update the measure rects.
+ var measure = g.selectAll("rect.measure")
+ .data(measurez);
+
+ measure.enter().append("svg:rect")
+ .attr("class", function(d, i) { return "measure s" + i; })
+ .attr("width", w0)
+ .attr("height", height / 3)
+ .attr("x", reverse ? x0 : 0)
+ .attr("y", height / 3)
+ .transition()
+ .duration(duration)
+ .attr("width", w1)
+ .attr("x", reverse ? x1 : 0);
+
+ measure.transition()
+ .duration(duration)
+ .attr("width", w1)
+ .attr("height", height / 3)
+ .attr("x", reverse ? x1 : 0)
+ .attr("y", height / 3);
+
+ // Update the marker lines.
+ var marker = g.selectAll("line.marker")
+ .data(markerz);
+
+ marker.enter().append("svg:line")
+ .attr("class", "marker")
+ .attr("x1", x0)
+ .attr("x2", x0)
+ .attr("y1", height / 6)
+ .attr("y2", height * 5 / 6)
+ .transition()
+ .duration(duration)
+ .attr("x1", x1)
+ .attr("x2", x1);
+
+ marker.transition()
+ .duration(duration)
+ .attr("x1", x1)
+ .attr("x2", x1)
+ .attr("y1", height / 6)
+ .attr("y2", height * 5 / 6);
+
+ // Compute the tick format.
+ var format = tickFormat || x1.tickFormat(8);
+
+ // Update the tick groups.
+ var tick = g.selectAll("g.tick")
+ .data(x1.ticks(8), function(d) {
+ return this.textContent || format(d);
+ });
+
+ // Initialize the ticks with the old scale, x0.
+ var tickEnter = tick.enter().append("svg:g")
+ .attr("class", "tick")
+ .attr("transform", d3_chart_bulletTranslate(x0))
+ .style("opacity", 1e-6);
+
+ tickEnter.append("svg:line")
+ .attr("y1", height)
+ .attr("y2", height * 7 / 6);
+
+ tickEnter.append("svg:text")
+ .attr("text-anchor", "middle")
+ .attr("dy", "1em")
+ .attr("y", height * 7 / 6)
+ .text(format);
+
+ // Transition the entering ticks to the new scale, x1.
+ tickEnter.transition()
+ .duration(duration)
+ .attr("transform", d3_chart_bulletTranslate(x1))
+ .style("opacity", 1);
+
+ // Transition the updating ticks to the new scale, x1.
+ var tickUpdate = tick.transition()
+ .duration(duration)
+ .attr("transform", d3_chart_bulletTranslate(x1))
+ .style("opacity", 1);
+
+ tickUpdate.select("line")
+ .attr("y1", height)
+ .attr("y2", height * 7 / 6);
+
+ tickUpdate.select("text")
+ .attr("y", height * 7 / 6);
+
+ // Transition the exiting ticks to the new scale, x1.
+ tick.exit().transition()
+ .duration(duration)
+ .attr("transform", d3_chart_bulletTranslate(x1))
+ .style("opacity", 1e-6)
+ .remove();
+ });
+ d3.timer.flush();
+ }
+
+ // left, right, top, bottom
+ bullet.orient = function(x) {
+ if (!arguments.length) return orient;
+ orient = x;
+ reverse = orient == "right" || orient == "bottom";
+ return bullet;
+ };
+
+ // ranges (bad, satisfactory, good)
+ bullet.ranges = function(x) {
+ if (!arguments.length) return ranges;
+ ranges = x;
+ return bullet;
+ };
+
+ // markers (previous, goal)
+ bullet.markers = function(x) {
+ if (!arguments.length) return markers;
+ markers = x;
+ return bullet;
+ };
+
+ // measures (actual, forecast)
+ bullet.measures = function(x) {
+ if (!arguments.length) return measures;
+ measures = x;
+ return bullet;
+ };
+
+ bullet.width = function(x) {
+ if (!arguments.length) return width;
+ width = x;
+ return bullet;
+ };
+
+ bullet.height = function(x) {
+ if (!arguments.length) return height;
+ height = x;
+ return bullet;
+ };
+
+ bullet.tickFormat = function(x) {
+ if (!arguments.length) return tickFormat;
+ tickFormat = x;
+ return bullet;
+ };
+
+ bullet.duration = function(x) {
+ if (!arguments.length) return duration;
+ duration = x;
+ return bullet;
+ };
+
+ return bullet;
+};
+
+function d3_chart_bulletRanges(d) {
+ return d.ranges;
+}
+
+function d3_chart_bulletMarkers(d) {
+ return d.markers;
+}
+
+function d3_chart_bulletMeasures(d) {
+ return d.measures;
+}
+
+function d3_chart_bulletTranslate(x) {
+ return function(d) {
+ return "translate(" + x(d) + ",0)";
+ };
+}
+
+function d3_chart_bulletWidth(x) {
+ var x0 = x(0);
+ return function(d) {
+ return Math.abs(x(d) - x0);
+ };
+}
+// Implements a horizon layout, which is a variation of a single-series
+// area chart where the area is folded into multiple bands. Color is used to
+// encode band, allowing the size of the chart to be reduced significantly
+// without impeding readability. This layout algorithm is based on the work of
+// J. Heer, N. Kong and M. Agrawala in "Sizing the Horizon: The Effects of Chart
+// Size and Layering on the Graphical Perception of Time Series Visualizations",
+// CHI 2009. http://hci.stanford.edu/publications/2009/heer-horizon-chi09.pdf
+d3.chart.horizon = function() {
+ var bands = 1, // between 1 and 5, typically
+ mode = "offset", // or mirror
+ interpolate = "linear", // or basis, monotone, step-before, etc.
+ x = d3_chart_horizonX,
+ y = d3_chart_horizonY,
+ w = 960,
+ h = 40,
+ duration = 0;
+
+ var color = d3.scale.linear()
+ .domain([-1, 0, 1])
+ .range(["#d62728", "#fff", "#1f77b4"]);
+
+ // For each small multiple…
+ function horizon(g) {
+ g.each(function(d, i) {
+ var g = d3.select(this),
+ n = 2 * bands + 1,
+ xMin = Infinity,
+ xMax = -Infinity,
+ yMax = -Infinity,
+ x0, // old x-scale
+ y0, // old y-scale
+ id; // unique id for paths
+
+ // Compute x- and y-values along with extents.
+ var data = d.map(function(d, i) {
+ var xv = x.call(this, d, i),
+ yv = y.call(this, d, i);
+ if (xv < xMin) xMin = xv;
+ if (xv > xMax) xMax = xv;
+ if (-yv > yMax) yMax = -yv;
+ if (yv > yMax) yMax = yv;
+ return [xv, yv];
+ });
+
+ // Compute the new x- and y-scales.
+ var x1 = d3.scale.linear().domain([xMin, xMax]).range([0, w]),
+ y1 = d3.scale.linear().domain([0, yMax]).range([0, h * bands]);
+
+ // Retrieve the old scales, if this is an update.
+ if (this.__chart__) {
+ x0 = this.__chart__.x;
+ y0 = this.__chart__.y;
+ id = this.__chart__.id;
+ } else {
+ x0 = d3.scale.linear().domain([0, Infinity]).range(x1.range());
+ y0 = d3.scale.linear().domain([0, Infinity]).range(y1.range());
+ id = ++d3_chart_horizonId;
+ }
+
+ // We'll use a defs to store the area path and the clip path.
+ var defs = g.selectAll("defs")
+ .data([data]);
+
+ var defsEnter = defs.enter().append("svg:defs");
+
+ // The clip path is a simple rect.
+ defsEnter.append("svg:clipPath")
+ .attr("id", "d3_chart_horizon_clip" + id)
+ .append("svg:rect")
+ .attr("width", w)
+ .attr("height", h);
+
+ defs.select("rect").transition()
+ .duration(duration)
+ .attr("width", w)
+ .attr("height", h);
+
+ // The area path is rendered with our resuable d3.svg.area.
+ defsEnter.append("svg:path")
+ .attr("id", "d3_chart_horizon_path" + id)
+ .attr("d", d3_chart_horizonArea
+ .interpolate(interpolate)
+ .x(function(d) { return x0(d[0]); })
+ .y0(h * bands)
+ .y1(function(d) { return h * bands - y0(d[1]); }))
+ .transition()
+ .duration(duration)
+ .attr("d", d3_chart_horizonArea
+ .x(function(d) { return x1(d[0]); })
+ .y1(function(d) { return h * bands - y1(d[1]); }));
+
+ defs.select("path").transition()
+ .duration(duration)
+ .attr("d", d3_chart_horizonArea);
+
+ // We'll use a container to clip all horizon layers at once.
+ g.selectAll("g")
+ .data([null])
+ .enter().append("svg:g")
+ .attr("clip-path", "url(#d3_chart_horizon_clip" + id + ")");
+
+ // Define the transform function based on the mode.
+ var transform = mode == "offset"
+ ? function(d) { return "translate(0," + (d + (d < 0) - bands) * h + ")"; }
+ : function(d) { return (d < 0 ? "scale(1,-1)" : "") + "translate(0," + (d - bands) * h + ")"; };
+
+ // Instantiate each copy of the path with different transforms.
+ var u = g.select("g").selectAll("use")
+ .data(d3.range(-1, -bands - 1, -1).concat(d3.range(1, bands + 1)), Number);
+
+ // TODO don't fudge the enter transition
+ u.enter().append("svg:use")
+ .attr("xlink:href", "#d3_chart_horizon_path" + id)
+ .attr("transform", function(d) { return transform(d + (d > 0 ? 1 : -1)); })
+ .style("fill", color)
+ .transition()
+ .duration(duration)
+ .attr("transform", transform);
+
+ u.transition()
+ .duration(duration)
+ .attr("transform", transform)
+ .style("fill", color);
+
+ u.exit().transition()
+ .duration(duration)
+ .attr("transform", transform)
+ .remove();
+
+ // Stash the new scales.
+ this.__chart__ = {x: x1, y: y1, id: id};
+ });
+ d3.timer.flush();
+ }
+
+ horizon.duration = function(x) {
+ if (!arguments.length) return duration;
+ duration = +x;
+ return horizon;
+ };
+
+ horizon.bands = function(x) {
+ if (!arguments.length) return bands;
+ bands = +x;
+ color.domain([-bands, 0, bands]);
+ return horizon;
+ };
+
+ horizon.mode = function(x) {
+ if (!arguments.length) return mode;
+ mode = x + "";
+ return horizon;
+ };
+
+ horizon.colors = function(x) {
+ if (!arguments.length) return color.range();
+ color.range(x);
+ return horizon;
+ };
+
+ horizon.interpolate = function(x) {
+ if (!arguments.length) return interpolate;
+ interpolate = x + "";
+ return horizon;
+ };
+
+ horizon.x = function(z) {
+ if (!arguments.length) return x;
+ x = z;
+ return horizon;
+ };
+
+ horizon.y = function(z) {
+ if (!arguments.length) return y;
+ y = z;
+ return horizon;
+ };
+
+ horizon.width = function(x) {
+ if (!arguments.length) return w;
+ w = +x;
+ return horizon;
+ };
+
+ horizon.height = function(x) {
+ if (!arguments.length) return h;
+ h = +x;
+ return horizon;
+ };
+
+ return horizon;
+};
+
+var d3_chart_horizonArea = d3.svg.area(),
+ d3_chart_horizonId = 0;
+
+function d3_chart_horizonX(d) {
+ return d[0];
+}
+
+function d3_chart_horizonY(d) {
+ return d[1];
+}
+// Based on http://vis.stanford.edu/protovis/ex/qqplot.html
+d3.chart.qq = function() {
+ var width = 1,
+ height = 1,
+ duration = 0,
+ domain = null,
+ tickFormat = null,
+ n = 100,
+ x = d3_chart_qqX,
+ y = d3_chart_qqY;
+
+ // For each small multiple…
+ function qq(g) {
+ g.each(function(d, i) {
+ var g = d3.select(this),
+ qx = d3_chart_qqQuantiles(n, x.call(this, d, i)),
+ qy = d3_chart_qqQuantiles(n, y.call(this, d, i)),
+ xd = domain && domain.call(this, d, i) || [d3.min(qx), d3.max(qx)], // new x-domain
+ yd = domain && domain.call(this, d, i) || [d3.min(qy), d3.max(qy)], // new y-domain
+ x0, // old x-scale
+ y0; // old y-scale
+
+ // Compute the new x-scale.
+ var x1 = d3.scale.linear()
+ .domain(xd)
+ .range([0, width]);
+
+ // Compute the new y-scale.
+ var y1 = d3.scale.linear()
+ .domain(yd)
+ .range([height, 0]);
+
+ // Retrieve the old scales, if this is an update.
+ if (this.__chart__) {
+ x0 = this.__chart__.x;
+ y0 = this.__chart__.y;
+ } else {
+ x0 = d3.scale.linear().domain([0, Infinity]).range(x1.range());
+ y0 = d3.scale.linear().domain([0, Infinity]).range(y1.range());
+ }
+
+ // Stash the new scales.
+ this.__chart__ = {x: x1, y: y1};
+
+ // Update diagonal line.
+ var diagonal = g.selectAll("line.diagonal")
+ .data([null]);
+
+ diagonal.enter().append("svg:line")
+ .attr("class", "diagonal")
+ .attr("x1", x1(yd[0]))
+ .attr("y1", y1(xd[0]))
+ .attr("x2", x1(yd[1]))
+ .attr("y2", y1(xd[1]));
+
+ diagonal.transition()
+ .duration(duration)
+ .attr("x1", x1(yd[0]))
+ .attr("y1", y1(xd[0]))
+ .attr("x2", x1(yd[1]))
+ .attr("y2", y1(xd[1]));
+
+ // Update quantile plots.
+ var circle = g.selectAll("circle")
+ .data(d3.range(n).map(function(i) {
+ return {x: qx[i], y: qy[i]};
+ }));
+
+ circle.enter().append("svg:circle")
+ .attr("class", "quantile")
+ .attr("r", 4.5)
+ .attr("cx", function(d) { return x0(d.x); })
+ .attr("cy", function(d) { return y0(d.y); })
+ .style("opacity", 1e-6)
+ .transition()
+ .duration(duration)
+ .attr("cx", function(d) { return x1(d.x); })
+ .attr("cy", function(d) { return y1(d.y); })
+ .style("opacity", 1);
+
+ circle.transition()
+ .duration(duration)
+ .attr("cx", function(d) { return x1(d.x); })
+ .attr("cy", function(d) { return y1(d.y); })
+ .style("opacity", 1);
+
+ circle.exit().transition()
+ .duration(duration)
+ .attr("cx", function(d) { return x1(d.x); })
+ .attr("cy", function(d) { return y1(d.y); })
+ .style("opacity", 1e-6)
+ .remove();
+
+ var xformat = tickFormat || x1.tickFormat(4),
+ yformat = tickFormat || y1.tickFormat(4),
+ tx = function(d) { return "translate(" + x1(d) + "," + height + ")"; },
+ ty = function(d) { return "translate(0," + y1(d) + ")"; };
+
+ // Update x-ticks.
+ var xtick = g.selectAll("g.x.tick")
+ .data(x1.ticks(4), function(d) {
+ return this.textContent || xformat(d);
+ });
+
+ var xtickEnter = xtick.enter().append("svg:g")
+ .attr("class", "x tick")
+ .attr("transform", function(d) { return "translate(" + x0(d) + "," + height + ")"; })
+ .style("opacity", 1e-6);
+
+ xtickEnter.append("svg:line")
+ .attr("y1", 0)
+ .attr("y2", -6);
+
+ xtickEnter.append("svg:text")
+ .attr("text-anchor", "middle")
+ .attr("dy", "1em")
+ .text(xformat);
+
+ // Transition the entering ticks to the new scale, x1.
+ xtickEnter.transition()
+ .duration(duration)
+ .attr("transform", tx)
+ .style("opacity", 1);
+
+ // Transition the updating ticks to the new scale, x1.
+ xtick.transition()
+ .duration(duration)
+ .attr("transform", tx)
+ .style("opacity", 1);
+
+ // Transition the exiting ticks to the new scale, x1.
+ xtick.exit().transition()
+ .duration(duration)
+ .attr("transform", tx)
+ .style("opacity", 1e-6)
+ .remove();
+
+ // Update ticks.
+ var ytick = g.selectAll("g.y.tick")
+ .data(y1.ticks(4), function(d) {
+ return this.textContent || yformat(d);
+ });
+
+ var ytickEnter = ytick.enter().append("svg:g")
+ .attr("class", "y tick")
+ .attr("transform", function(d) { return "translate(0," + y0(d) + ")"; })
+ .style("opacity", 1e-6);
+
+ ytickEnter.append("svg:line")
+ .attr("x1", 0)
+ .attr("x2", 6);
+
+ ytickEnter.append("svg:text")
+ .attr("text-anchor", "end")
+ .attr("dx", "-.5em")
+ .attr("dy", ".3em")
+ .text(yformat);
+
+ // Transition the entering ticks to the new scale, y1.
+ ytickEnter.transition()
+ .duration(duration)
+ .attr("transform", ty)
+ .style("opacity", 1);
+
+ // Transition the updating ticks to the new scale, y1.
+ ytick.transition()
+ .duration(duration)
+ .attr("transform", ty)
+ .style("opacity", 1);
+
+ // Transition the exiting ticks to the new scale, y1.
+ ytick.exit().transition()
+ .duration(duration)
+ .attr("transform", ty)
+ .style("opacity", 1e-6)
+ .remove();
+ });
+ }
+
+ qq.width = function(x) {
+ if (!arguments.length) return width;
+ width = x;
+ return qq;
+ };
+
+ qq.height = function(x) {
+ if (!arguments.length) return height;
+ height = x;
+ return qq;
+ };
+
+ qq.duration = function(x) {
+ if (!arguments.length) return duration;
+ duration = x;
+ return qq;
+ };
+
+ qq.domain = function(x) {
+ if (!arguments.length) return domain;
+ domain = x == null ? x : d3.functor(x);
+ return qq;
+ };
+
+ qq.count = function(z) {
+ if (!arguments.length) return n;
+ n = z;
+ return qq;
+ };
+
+ qq.x = function(z) {
+ if (!arguments.length) return x;
+ x = z;
+ return qq;
+ };
+
+ qq.y = function(z) {
+ if (!arguments.length) return y;
+ y = z;
+ return qq;
+ };
+
+ qq.tickFormat = function(x) {
+ if (!arguments.length) return tickFormat;
+ tickFormat = x;
+ return qq;
+ };
+
+ return qq;
+};
+
+function d3_chart_qqQuantiles(n, values) {
+ var m = values.length - 1;
+ values = values.slice().sort(d3.ascending);
+ return d3.range(n).map(function(i) {
+ return values[~~(i * m / n)];
+ });
+}
+
+function d3_chart_qqX(d) {
+ return d.x;
+}
+
+function d3_chart_qqY(d) {
+ return d.y;
+}
+})();
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.chart.min.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.chart.min.js
new file mode 100644
index 0000000..464690d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.chart.min.js
@@ -0,0 +1 @@
+(function(){function a(a){return[0,a.length-1]}function b(a){return[d3.quantile(a,.25),d3.quantile(a,.5),d3.quantile(a,.75)]}function c(a){return a.ranges}function d(a){return a.markers}function e(a){return a.measures}function f(a){return function(b){return"translate("+a(b)+",0)"}}function g(a){var b=a(0);return function(c){return Math.abs(a(c)-b)}}function j(a){return a[0]}function k(a){return a[1]}function l(a,b){var c=b.length-1;return b=b.slice().sort(d3.ascending),d3.range(a).map(function(d){return b[~~(d*c/a)]})}function m(a){return a.x}function n(a){return a.y}d3.chart={},d3.chart.box=function(){function k(a){a.each(function(a,b){a=a.map(g).sort(d3.ascending);var k=d3.select(this),l=a.length,m=a[0],n=a[l-1],o=a.quartiles=i(a),p=h&&h.call(this,a,b),q=p&&p.map(function(b){return a[b]}),r=p?d3.range(0,p[0]).concat(d3.range(p[1]+1,l)):d3.range(l),s=d3.scale.linear().domain(f&&f.call(this,a,b)||[m,n]).range([d,0]),t=this.__chart__||d3.scale.linear().domain([0,Infinity]).range(s.range());this.__chart__=s;var u=k.selectAll("line.center").data(q?[q]:[]);u.enter().insert("svg:line","rect").attr("class","center").attr("x1",c/2).attr("y1",function(a){return t(a[0])}).attr("x2",c/2).attr("y2",function(a){return t(a[1])}).style("opacity",1e-6).transition().duration(e).style("opacity",1).attr("y1",function(a){return s(a[0])}).attr("y2",function(a){return s(a[1])}),u.transition().duration(e).style("opacity",1).attr("y1",function(a){return s(a[0])}).attr("y2",function(a){return s(a[1])}),u.exit().transition().duration(e).style("opacity",1e-6).attr("y1",function(a){return s(a[0])}).attr("y2",function(a){return s(a[1])}).remove();var v=k.selectAll("rect.box").data([o]);v.enter().append("svg:rect").attr("class","box").attr("x",0).attr("y",function(a){return t(a[2])}).attr("width",c).attr("height",function(a){return t(a[0])-t(a[2])}).transition().duration(e).attr("y",function(a){return s(a[2])}).attr("height",function(a){return s(a[0])-s(a[2])}),v.transition().duration(e).attr("y",function(a){return s(a[2])}).attr("height",function(a){return s(a[0])-s(a[2])});var w=k.selectAll("line.median").data([o[1]]);w.enter().append("svg:line").attr("class","median").attr("x1",0).attr("y1",t).attr("x2",c).attr("y2",t).transition().duration(e).attr("y1",s).attr("y2",s),w.transition().duration(e).attr("y1",s).attr("y2",s);var x=k.selectAll("line.whisker").data(q||[]);x.enter().insert("svg:line","circle, text").attr("class","whisker").attr("x1",0).attr("y1",t).attr("x2",c).attr("y2",t).style("opacity",1e-6).transition().duration(e).attr("y1",s).attr("y2",s).style("opacity",1),x.transition().duration(e).attr("y1",s).attr("y2",s).style("opacity",1),x.exit().transition().duration(e).attr("y1",s).attr("y2",s).style("opacity",1e-6).remove();var y=k.selectAll("circle.outlier").data(r,Number);y.enter().insert("svg:circle","text").attr("class","outlier").attr("r",5).attr("cx",c/2).attr("cy",function(b){return t(a[b])}).style("opacity",1e-6).transition().duration(e).attr("cy",function(b){return s(a[b])}).style("opacity",1),y.transition().duration(e).attr("cy",function(b){return s(a[b])}).style("opacity",1),y.exit().transition().duration(e).attr("cy",function(b){return s(a[b])}).style("opacity",1e-6).remove();var z=j||s.tickFormat(8),A=k.selectAll("text.box").data(o);A.enter().append("svg:text").attr("class","box").attr("dy",".3em").attr("dx",function(a,b){return b&1?6:-6}).attr("x",function(a,b){return b&1?c:0}).attr("y",t).attr("text-anchor",function(a,b){return b&1?"start":"end"}).text(z).transition().duration(e).attr("y",s),A.transition().duration(e).text(z).attr("y",s);var B=k.selectAll("text.whisker").data(q||[]);B.enter().append("svg:text").attr("class","whisker").attr("dy",".3em").attr("dx",6).attr("x",c).attr("y",t).text(z).style("opacity",1e-6).transition().duration(e).attr("y",s).style("opacity",1),B.transition().duration(e).text(z).attr("y",s).style("opacity",1),B.exit().transition().duration(e).attr("y",s).style("opacity",1e-6).remove()}),d3.timer.flush()}var c=1,d=1,e=0,f=null,g=Number,h=a,i=b,j=null;return k.width=function(a){return arguments.length?(c=a,k):c},k.height=function(a){return arguments.length?(d=a,k):d},k.tickFormat=function(a){return arguments.length?(j=a,k):j},k.duration=function(a){return arguments.length?(e=a,k):e},k.domain=function(a){return arguments.length?(f=a==null?a:d3.functor(a),k):f},k.value=function(a){return arguments.length?(g=a,k):g},k.whiskers=function(a){return arguments.length?(h=a,k):h},k.quartiles=function(a){return arguments.length?(i=a,k):i},k},d3.chart.bullet=function(){function o(a){a.each(function(a,c){var d=i.call(this,a,c).slice().sort(d3.descending),e=j.call(this,a,c).slice().sort(d3.descending),o=k.call(this,a,c).slice().sort(d3.descending),p=d3.select(this),q=d3.scale.linear().domain([0,Math.max(d[0],e[0],o[0])]).range(b?[l,0]:[0,l]),r=this.__chart__||d3.scale.linear().domain([0,Infinity]).range(q.range());this.__chart__=q;var s=g(r),t=g(q),u=p.selectAll("rect.range").data(d);u.enter().append("svg:rect").attr("class",function(a,b){return"range s"+b}).attr("width",s).attr("height",m).attr("x",b?r:0).transition().duration(h).attr("width",t).attr("x",b?q:0),u.transition().duration(h).attr("x",b?q:0).attr("width",t).attr("height",m);var v=p.selectAll("rect.measure").data(o);v.enter().append("svg:rect").attr("class",function(a,b){return"measure s"+b}).attr("width",s).attr("height",m/3).attr("x",b?r:0).attr("y",m/3).transition().duration(h).attr("width",t).attr("x",b?q:0),v.transition().duration(h).attr("width",t).attr("height",m/3).attr("x",b?q:0).attr("y",m/3);var w=p.selectAll("line.marker").data(e);w.enter().append("svg:line").attr("class","marker").attr("x1",r).attr("x2",r).attr("y1",m/6).attr("y2",m*5/6).transition().duration(h).attr("x1",q).attr("x2",q),w.transition().duration(h).attr("x1",q).attr("x2",q).attr("y1",m/6).attr("y2",m*5/6);var x=n||q.tickFormat(8),y=p.selectAll("g.tick").data(q.ticks(8),function(a){return this.textContent||x(a)}),z=y.enter().append("svg:g").attr("class","tick").attr("transform",f(r)).style("opacity",1e-6);z.append("svg:line").attr("y1",m).attr("y2",m*7/6),z.append("svg:text").attr("text-anchor","middle").attr("dy","1em").attr("y",m*7/6).text(x),z.transition().duration(h).attr("transform",f(q)).style("opacity",1);var A=y.transition().duration(h).attr("transform",f(q)).style("opacity",1);A.select("line").attr("y1",m).attr("y2",m*7/6),A.select("text").attr("y",m*7/6),y.exit().transition().duration(h).attr("transform",f(q)).style("opacity",1e-6).remove()}),d3.timer.flush()}var a="left",b=!1,h=0,i=c,j=d,k=e,l=380,m=30,n=null;return o.orient=function(c){return arguments.length?(a=c,b=a=="right"||a=="bottom",o):a},o.ranges=function(a){return arguments.length?(i=a,o):i},o.markers=function(a){return arguments.length?(j=a,o):j},o.measures=function(a){return arguments.length?(k=a,o):k},o.width=function(a){return arguments.length?(l=a,o):l},o.height=function(a){return arguments.length?(m=a,o):m},o.tickFormat=function(a){return arguments.length?(n=a,o):n},o.duration=function(a){return arguments.length?(h=a,o):h},o},d3.chart.horizon=function(){function n(j){j.each(function(j,k){var n=d3.select(this),o=2*a+1,p=Infinity,q=-Infinity,r=-Infinity,s,t,u,v=j.map(function(a,b){var c=d.call(this,a,b),f=e.call(this,a,b);return c<p&&(p=c),c>q&&(q=c),-f>r&&(r=-f),f>r&&(r=f),[c,f]}),z=d3.scale.linear().domain([p,q]).range([0,f]),A=d3.scale.linear().domain([0,r]).range([0,g*a]);this.__chart__?(s=this.__chart__.x,t=this.__chart__.y,u=this.__chart__.id):(s=d3.scale.linear().domain([0,Infinity]).range(z.range()),t=d3.scale.linear().domain([0,Infinity]).range(A.range()),u=++i);var B=n.selectAll("defs").data([v]),C=B.enter().append("svg:defs");C.append("svg:clipPath").attr("id","d3_chart_horizon_clip"+u).append("svg:rect").attr("width",f).attr("height",g),B.select("rect").transition().duration(l).attr("width",f).attr("height",g),C.append("svg:path").attr("id","d3_chart_horizon_path"+u).attr("d",h.interpolate(c).x(function(a){return s(a[0])}).y0(g*a).y1(function(b){return g*a-t(b[1])})).transition().duration(l).attr("d",h.x(function(a){return z(a[0])}).y1(function(b){return g*a-A(b[1])})),B.select("path").transition().duration(l).attr("d",h),n.selectAll("g").data([null]).enter().append("svg:g").attr("clip-path","url(#d3_chart_horizon_clip"+u+")");var D=b=="offset"?function(b){return"translate(0,"+(b+(b<0)-a)*g+")"}:function(b){return(b<0?"scale(1,-1)":"")+"translate(0,"+(b-a)*g+")"},E=n.select("g").selectAll("use").data(d3.range(-1,-a-1,-1).concat(d3.range(1,a+1)),Number);E.enter().append("svg:use").attr("xlink:href","#d3_chart_horizon_path"+u).attr("transform",function(a){return D(a+(a>0?1:-1))}).style("fill",m).transition().duration(l).attr("transform",D),E.transition().duration(l).attr("transform",D).style("fill",m),E.exit().transition().duration(l).attr("transform",D).remove(),this.__chart__={x:z,y:A,id:u}}),d3.timer.flush()}var a=1,b="offset",c="linear",d=j,e=k,f=960,g=40,l=0,m=d3.scale.linear().domain([-1,0,1]).range(["#d62728","#fff","#1f77b4"]);return n.duration=function(a){return arguments.length?(l=+a,n):l},n.bands=function(b){return arguments.length?(a=+b,m.domain([-a,0,a]),n):a},n.mode=function(a){return arguments.length?(b=a+"",n):b},n.colors=function(a){return arguments.length?(m.range(a),n):m.range()},n.interpolate=function(a){return arguments.length?(c=a+"",n):c},n.x=function(a){return arguments.length?(d=a,n):d},n.y=function(a){return arguments.length?(e=a,n):e},n.width=function(a){return arguments.length?(f=+a,n):f},n.height=function(a){return arguments.length?(g=+a,n):g},n};var h=d3.svg.area(),i=0;d3.chart.qq=function(){function i(i){i.each(function(i,j){var k=d3.select(this),m=l(f,g.call(this,i,j)),n=l(f,h.call(this,i,j)),o=d&&d.call(this,i,j)||[d3.min(m),d3.max(m)],p=d&&d.call(this,i,j)||[d3.min(n),d3.max(n)],q,r,s=d3.scale.linear().domain(o).range([0,a]),t=d3.scale.linear().domain(p).range([b,0]);this.__chart__?(q=this.__chart__.x,r=this.__chart__.y):(q=d3.scale.linear().domain([0,Infinity]).range(s.range()),r=d3.scale.linear().domain([0,Infinity]).range(t.range())),this.__chart__={x:s,y:t};var u=k.selectAll("line.diagonal").data([null]);u.enter().append("svg:line").attr("class","diagonal").attr("x1",s(p[0])).attr("y1",t(o[0])).attr("x2",s(p[1])).attr("y2",t(o[1])),u.transition().duration(c).attr("x1",s(p[0])).attr("y1",t(o[0])).attr("x2",s(p[1])).attr("y2",t(o[1]));var v=k.selectAll("circle").data(d3.range(f).map(function(a){return{x:m[a],y:n[a]}}));v.enter().append("svg:circle").attr("class","quantile").attr("r",4.5).attr("cx",function(a){return q(a.x)}).attr("cy",function(a){return r(a.y)}).style("opacity",1e-6).transition().duration(c).attr("cx",function(a){return s(a.x)}).attr("cy",function(a){return t(a.y)}).style("opacity",1),v.transition().duration(c).attr("cx",function(a){return s(a.x)}).attr("cy",function(a){return t(a.y)}).style("opacity",1),v.exit().transition().duration(c).attr("cx",function(a){return s(a.x)}).attr("cy",function(a){return t(a.y)}).style("opacity",1e-6).remove();var w=e||s.tickFormat(4),z=e||t.tickFormat(4),A=function(a){return"translate("+s(a)+","+b+")"},B=function(a){return"translate(0,"+t(a)+")"},C=k.selectAll("g.x.tick").data(s.ticks(4),function(a){return this.textContent||w(a)}),D=C.enter().append("svg:g").attr("class","x tick").attr("transform",function(a){return"translate("+q(a)+","+b+")"}).style("opacity",1e-6);D.append("svg:line").attr("y1",0).attr("y2",-6),D.append("svg:text").attr("text-anchor","middle").attr("dy","1em").text(w),D.transition().duration(c).attr("transform",A).style("opacity",1),C.transition().duration(c).attr("transform",A).style("opacity",1),C.exit().transition().duration(c).attr("transform",A).style("opacity",1e-6).remove();var E=k.selectAll("g.y.tick").data(t.ticks(4),function(a){return this.textContent||z(a)}),F=E.enter().append("svg:g").attr("class","y tick").attr("transform",function(a){return"translate(0,"+r(a)+")"}).style("opacity",1e-6);F.append("svg:line").attr("x1",0).attr("x2",6),F.append("svg:text").attr("text-anchor","end").attr("dx","-.5em").attr("dy",".3em").text(z),F.transition().duration(c).attr("transform",B).style("opacity",1),E.transition().duration(c).attr("transform",B).style("opacity",1),E.exit().transition().duration(c).attr("transform",B).style("opacity",1e-6).remove()})}var a=1,b=1,c=0,d=null,e=null,f=100,g=m,h=n;return i.width=function(b){return arguments.length?(a=b,i):a},i.height=function(a){return arguments.length?(b=a,i):b},i.duration=function(a){return arguments.length?(c=a,i):c},i.domain=function(a){return arguments.length?(d=a==null?a:d3.functor(a),i):d},i.count=function(a){return arguments.length?(f=a,i):f},i.x=function(a){return arguments.length?(g=a,i):g},i.y=function(a){return arguments.length?(h=a,i):h},i.tickFormat=function(a){return arguments.length?(e=a,i):e},i}})(); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.csv.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.csv.js
new file mode 100644
index 0000000..7565b83
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.csv.js
@@ -0,0 +1,92 @@
+(function(){d3.csv = function(url, callback) {
+ d3.text(url, "text/csv", function(text) {
+ callback(text && d3.csv.parse(text));
+ });
+};
+d3.csv.parse = function(text) {
+ var header;
+ return d3.csv.parseRows(text, function(row, i) {
+ if (i) {
+ var o = {}, j = -1, m = header.length;
+ while (++j < m) o[header[j]] = row[j];
+ return o;
+ } else {
+ header = row;
+ return null;
+ }
+ });
+};
+
+d3.csv.parseRows = function(text, f) {
+ var EOL = {}, // sentinel value for end-of-line
+ EOF = {}, // sentinel value for end-of-file
+ rows = [], // output rows
+ re = /\r\n|[,\r\n]/g, // field separator regex
+ n = 0, // the current line number
+ t, // the current token
+ eol; // is the current token followed by EOL?
+
+ re.lastIndex = 0; // work-around bug in FF 3.6
+
+ /** @private Returns the next token. */
+ function token() {
+ if (re.lastIndex >= text.length) return EOF; // special case: end of file
+ if (eol) { eol = false; return EOL; } // special case: end of line
+
+ // special case: quotes
+ var j = re.lastIndex;
+ if (text.charCodeAt(j) === 34) {
+ var i = j;
+ while (i++ < text.length) {
+ if (text.charCodeAt(i) === 34) {
+ if (text.charCodeAt(i + 1) !== 34) break;
+ i++;
+ }
+ }
+ re.lastIndex = i + 2;
+ var c = text.charCodeAt(i + 1);
+ if (c === 13) {
+ eol = true;
+ if (text.charCodeAt(i + 2) === 10) re.lastIndex++;
+ } else if (c === 10) {
+ eol = true;
+ }
+ return text.substring(j + 1, i).replace(/""/g, "\"");
+ }
+
+ // common case
+ var m = re.exec(text);
+ if (m) {
+ eol = m[0].charCodeAt(0) !== 44;
+ return text.substring(j, m.index);
+ }
+ re.lastIndex = text.length;
+ return text.substring(j);
+ }
+
+ while ((t = token()) !== EOF) {
+ var a = [];
+ while ((t !== EOL) && (t !== EOF)) {
+ a.push(t);
+ t = token();
+ }
+ if (f && !(a = f(a, n++))) continue;
+ rows.push(a);
+ }
+
+ return rows;
+};
+d3.csv.format = function(rows) {
+ return rows.map(d3_csv_formatRow).join("\n");
+};
+
+function d3_csv_formatRow(row) {
+ return row.map(d3_csv_formatValue).join(",");
+}
+
+function d3_csv_formatValue(text) {
+ return /[",\n]/.test(text)
+ ? "\"" + text.replace(/\"/g, "\"\"") + "\""
+ : text;
+}
+})();
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.csv.min.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.csv.min.js
new file mode 100644
index 0000000..3a384ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.csv.min.js
@@ -0,0 +1 @@
+(function(){function a(a){return a.map(b).join(",")}function b(a){return/[",\n]/.test(a)?'"'+a.replace(/\"/g,'""')+'"':a}d3.csv=function(a,b){d3.text(a,"text/csv",function(a){b(a&&d3.csv.parse(a))})},d3.csv.parse=function(a){var b;return d3.csv.parseRows(a,function(a,c){if(c){var d={},e=-1,f=b.length;while(++e<f)d[b[e]]=a[e];return d}return b=a,null})},d3.csv.parseRows=function(a,b){function j(){if(f.lastIndex>=a.length)return d;if(i)return i=!1,c;var b=f.lastIndex;if(a.charCodeAt(b)===34){var e=b;while(e++<a.length)if(a.charCodeAt(e)===34){if(a.charCodeAt(e+1)!==34)break;e++}f.lastIndex=e+2;var g=a.charCodeAt(e+1);return g===13?(i=!0,a.charCodeAt(e+2)===10&&f.lastIndex++):g===10&&(i=!0),a.substring(b+1,e).replace(/""/g,'"')}var h=f.exec(a);return h?(i=h[0].charCodeAt(0)!==44,a.substring(b,h.index)):(f.lastIndex=a.length,a.substring(b))}var c={},d={},e=[],f=/\r\n|[,\r\n]/g,g=0,h,i;f.lastIndex=0;while((h=j())!==d){var k=[];while(h!==c&&h!==d)k.push(h),h=j();if(b&&!(k=b(k,g++)))continue;e.push(k)}return e},d3.csv.format=function(b){return b.map(a).join("\n")}})(); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geo.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geo.js
new file mode 100644
index 0000000..2b40252
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geo.js
@@ -0,0 +1,938 @@
+(function(){d3.geo = {};
+
+var d3_geo_radians = Math.PI / 180;
+// TODO clip input coordinates on opposite hemisphere
+d3.geo.azimuthal = function() {
+ var mode = "orthographic", // or stereographic, gnomonic, equidistant or equalarea
+ origin,
+ scale = 200,
+ translate = [480, 250],
+ x0,
+ y0,
+ cy0,
+ sy0;
+
+ function azimuthal(coordinates) {
+ var x1 = coordinates[0] * d3_geo_radians - x0,
+ y1 = coordinates[1] * d3_geo_radians,
+ cx1 = Math.cos(x1),
+ sx1 = Math.sin(x1),
+ cy1 = Math.cos(y1),
+ sy1 = Math.sin(y1),
+ cc = mode !== "orthographic" ? sy0 * sy1 + cy0 * cy1 * cx1 : null,
+ c,
+ k = mode === "stereographic" ? 1 / (1 + cc)
+ : mode === "gnomonic" ? 1 / cc
+ : mode === "equidistant" ? (c = Math.acos(cc), c ? c / Math.sin(c) : 0)
+ : mode === "equalarea" ? Math.sqrt(2 / (1 + cc))
+ : 1,
+ x = k * cy1 * sx1,
+ y = k * (sy0 * cy1 * cx1 - cy0 * sy1);
+ return [
+ scale * x + translate[0],
+ scale * y + translate[1]
+ ];
+ }
+
+ azimuthal.invert = function(coordinates) {
+ var x = (coordinates[0] - translate[0]) / scale,
+ y = (coordinates[1] - translate[1]) / scale,
+ p = Math.sqrt(x * x + y * y),
+ c = mode === "stereographic" ? 2 * Math.atan(p)
+ : mode === "gnomonic" ? Math.atan(p)
+ : mode === "equidistant" ? p
+ : mode === "equalarea" ? 2 * Math.asin(.5 * p)
+ : Math.asin(p),
+ sc = Math.sin(c),
+ cc = Math.cos(c);
+ return [
+ (x0 + Math.atan2(x * sc, p * cy0 * cc + y * sy0 * sc)) / d3_geo_radians,
+ Math.asin(cc * sy0 - (p ? (y * sc * cy0) / p : 0)) / d3_geo_radians
+ ];
+ };
+
+ azimuthal.mode = function(x) {
+ if (!arguments.length) return mode;
+ mode = x + "";
+ return azimuthal;
+ };
+
+ azimuthal.origin = function(x) {
+ if (!arguments.length) return origin;
+ origin = x;
+ x0 = origin[0] * d3_geo_radians;
+ y0 = origin[1] * d3_geo_radians;
+ cy0 = Math.cos(y0);
+ sy0 = Math.sin(y0);
+ return azimuthal;
+ };
+
+ azimuthal.scale = function(x) {
+ if (!arguments.length) return scale;
+ scale = +x;
+ return azimuthal;
+ };
+
+ azimuthal.translate = function(x) {
+ if (!arguments.length) return translate;
+ translate = [+x[0], +x[1]];
+ return azimuthal;
+ };
+
+ return azimuthal.origin([0, 0]);
+};
+// Derived from Tom Carden's Albers implementation for Protovis.
+// http://gist.github.com/476238
+// http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html
+
+d3.geo.albers = function() {
+ var origin = [-98, 38],
+ parallels = [29.5, 45.5],
+ scale = 1000,
+ translate = [480, 250],
+ lng0, // d3_geo_radians * origin[0]
+ n,
+ C,
+ p0;
+
+ function albers(coordinates) {
+ var t = n * (d3_geo_radians * coordinates[0] - lng0),
+ p = Math.sqrt(C - 2 * n * Math.sin(d3_geo_radians * coordinates[1])) / n;
+ return [
+ scale * p * Math.sin(t) + translate[0],
+ scale * (p * Math.cos(t) - p0) + translate[1]
+ ];
+ }
+
+ albers.invert = function(coordinates) {
+ var x = (coordinates[0] - translate[0]) / scale,
+ y = (coordinates[1] - translate[1]) / scale,
+ p0y = p0 + y,
+ t = Math.atan2(x, p0y),
+ p = Math.sqrt(x * x + p0y * p0y);
+ return [
+ (lng0 + t / n) / d3_geo_radians,
+ Math.asin((C - p * p * n * n) / (2 * n)) / d3_geo_radians
+ ];
+ };
+
+ function reload() {
+ var phi1 = d3_geo_radians * parallels[0],
+ phi2 = d3_geo_radians * parallels[1],
+ lat0 = d3_geo_radians * origin[1],
+ s = Math.sin(phi1),
+ c = Math.cos(phi1);
+ lng0 = d3_geo_radians * origin[0];
+ n = .5 * (s + Math.sin(phi2));
+ C = c * c + 2 * n * s;
+ p0 = Math.sqrt(C - 2 * n * Math.sin(lat0)) / n;
+ return albers;
+ }
+
+ albers.origin = function(x) {
+ if (!arguments.length) return origin;
+ origin = [+x[0], +x[1]];
+ return reload();
+ };
+
+ albers.parallels = function(x) {
+ if (!arguments.length) return parallels;
+ parallels = [+x[0], +x[1]];
+ return reload();
+ };
+
+ albers.scale = function(x) {
+ if (!arguments.length) return scale;
+ scale = +x;
+ return albers;
+ };
+
+ albers.translate = function(x) {
+ if (!arguments.length) return translate;
+ translate = [+x[0], +x[1]];
+ return albers;
+ };
+
+ return reload();
+};
+
+// A composite projection for the United States, 960x500. The set of standard
+// parallels for each region comes from USGS, which is published here:
+// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
+// TODO allow the composite projection to be rescaled?
+d3.geo.albersUsa = function() {
+ var lower48 = d3.geo.albers();
+
+ var alaska = d3.geo.albers()
+ .origin([-160, 60])
+ .parallels([55, 65]);
+
+ var hawaii = d3.geo.albers()
+ .origin([-160, 20])
+ .parallels([8, 18]);
+
+ var puertoRico = d3.geo.albers()
+ .origin([-60, 10])
+ .parallels([8, 18]);
+
+ function albersUsa(coordinates) {
+ var lon = coordinates[0],
+ lat = coordinates[1];
+ return (lat > 50 ? alaska
+ : lon < -140 ? hawaii
+ : lat < 21 ? puertoRico
+ : lower48)(coordinates);
+ }
+
+ albersUsa.scale = function(x) {
+ if (!arguments.length) return lower48.scale();
+ lower48.scale(x);
+ alaska.scale(x * .6);
+ hawaii.scale(x);
+ puertoRico.scale(x * 1.5);
+ return albersUsa.translate(lower48.translate());
+ };
+
+ albersUsa.translate = function(x) {
+ if (!arguments.length) return lower48.translate();
+ var dz = lower48.scale() / 1000,
+ dx = x[0],
+ dy = x[1];
+ lower48.translate(x);
+ alaska.translate([dx - 400 * dz, dy + 170 * dz]);
+ hawaii.translate([dx - 190 * dz, dy + 200 * dz]);
+ puertoRico.translate([dx + 580 * dz, dy + 430 * dz]);
+ return albersUsa;
+ };
+
+ return albersUsa.scale(lower48.scale());
+};
+d3.geo.bonne = function() {
+ var scale = 200,
+ translate = [480, 250],
+ x0, // origin longitude in radians
+ y0, // origin latitude in radians
+ y1, // parallel latitude in radians
+ c1; // cot(y1)
+
+ function bonne(coordinates) {
+ var x = coordinates[0] * d3_geo_radians - x0,
+ y = coordinates[1] * d3_geo_radians - y0;
+ if (y1) {
+ var p = c1 + y1 - y, E = x * Math.cos(y) / p;
+ x = p * Math.sin(E);
+ y = p * Math.cos(E) - c1;
+ } else {
+ x *= Math.cos(y);
+ y *= -1;
+ }
+ return [
+ scale * x + translate[0],
+ scale * y + translate[1]
+ ];
+ }
+
+ bonne.invert = function(coordinates) {
+ var x = (coordinates[0] - translate[0]) / scale,
+ y = (coordinates[1] - translate[1]) / scale;
+ if (y1) {
+ var c = c1 + y, p = Math.sqrt(x * x + c * c);
+ y = c1 + y1 - p;
+ x = x0 + p * Math.atan2(x, c) / Math.cos(y);
+ } else {
+ y *= -1;
+ x /= Math.cos(y);
+ }
+ return [
+ x / d3_geo_radians,
+ y / d3_geo_radians
+ ];
+ };
+
+ // 90° for Werner, 0° for Sinusoidal
+ bonne.parallel = function(x) {
+ if (!arguments.length) return y1 / d3_geo_radians;
+ c1 = 1 / Math.tan(y1 = x * d3_geo_radians);
+ return bonne;
+ };
+
+ bonne.origin = function(x) {
+ if (!arguments.length) return [x0 / d3_geo_radians, y0 / d3_geo_radians];
+ x0 = x[0] * d3_geo_radians;
+ y0 = x[1] * d3_geo_radians;
+ return bonne;
+ };
+
+ bonne.scale = function(x) {
+ if (!arguments.length) return scale;
+ scale = +x;
+ return bonne;
+ };
+
+ bonne.translate = function(x) {
+ if (!arguments.length) return translate;
+ translate = [+x[0], +x[1]];
+ return bonne;
+ };
+
+ return bonne.origin([0, 0]).parallel(45);
+};
+d3.geo.equirectangular = function() {
+ var scale = 500,
+ translate = [480, 250];
+
+ function equirectangular(coordinates) {
+ var x = coordinates[0] / 360,
+ y = -coordinates[1] / 360;
+ return [
+ scale * x + translate[0],
+ scale * y + translate[1]
+ ];
+ }
+
+ equirectangular.invert = function(coordinates) {
+ var x = (coordinates[0] - translate[0]) / scale,
+ y = (coordinates[1] - translate[1]) / scale;
+ return [
+ 360 * x,
+ -360 * y
+ ];
+ };
+
+ equirectangular.scale = function(x) {
+ if (!arguments.length) return scale;
+ scale = +x;
+ return equirectangular;
+ };
+
+ equirectangular.translate = function(x) {
+ if (!arguments.length) return translate;
+ translate = [+x[0], +x[1]];
+ return equirectangular;
+ };
+
+ return equirectangular;
+};
+d3.geo.mercator = function() {
+ var scale = 500,
+ translate = [480, 250];
+
+ function mercator(coordinates) {
+ var x = coordinates[0] / 360,
+ y = -(Math.log(Math.tan(Math.PI / 4 + coordinates[1] * d3_geo_radians / 2)) / d3_geo_radians) / 360;
+ return [
+ scale * x + translate[0],
+ scale * Math.max(-.5, Math.min(.5, y)) + translate[1]
+ ];
+ }
+
+ mercator.invert = function(coordinates) {
+ var x = (coordinates[0] - translate[0]) / scale,
+ y = (coordinates[1] - translate[1]) / scale;
+ return [
+ 360 * x,
+ 2 * Math.atan(Math.exp(-360 * y * d3_geo_radians)) / d3_geo_radians - 90
+ ];
+ };
+
+ mercator.scale = function(x) {
+ if (!arguments.length) return scale;
+ scale = +x;
+ return mercator;
+ };
+
+ mercator.translate = function(x) {
+ if (!arguments.length) return translate;
+ translate = [+x[0], +x[1]];
+ return mercator;
+ };
+
+ return mercator;
+};
+function d3_geo_type(types, defaultValue) {
+ return function(object) {
+ return object && object.type in types ? types[object.type](object) : defaultValue;
+ };
+}
+/**
+ * Returns a function that, given a GeoJSON object (e.g., a feature), returns
+ * the corresponding SVG path. The function can be customized by overriding the
+ * projection. Point features are mapped to circles with a default radius of
+ * 4.5px; the radius can be specified either as a constant or a function that
+ * is evaluated per object.
+ */
+d3.geo.path = function() {
+ var pointRadius = 4.5,
+ pointCircle = d3_path_circle(pointRadius),
+ projection = d3.geo.albersUsa();
+
+ function path(d, i) {
+ if (typeof pointRadius === "function") {
+ pointCircle = d3_path_circle(pointRadius.apply(this, arguments));
+ }
+ return pathType(d) || null;
+ }
+
+ function project(coordinates) {
+ return projection(coordinates).join(",");
+ }
+
+ var pathType = d3_geo_type({
+
+ FeatureCollection: function(o) {
+ var path = [],
+ features = o.features,
+ i = -1, // features.index
+ n = features.length;
+ while (++i < n) path.push(pathType(features[i].geometry));
+ return path.join("");
+ },
+
+ Feature: function(o) {
+ return pathType(o.geometry);
+ },
+
+ Point: function(o) {
+ return "M" + project(o.coordinates) + pointCircle;
+ },
+
+ MultiPoint: function(o) {
+ var path = [],
+ coordinates = o.coordinates,
+ i = -1, // coordinates.index
+ n = coordinates.length;
+ while (++i < n) path.push("M", project(coordinates[i]), pointCircle);
+ return path.join("");
+ },
+
+ LineString: function(o) {
+ var path = ["M"],
+ coordinates = o.coordinates,
+ i = -1, // coordinates.index
+ n = coordinates.length;
+ while (++i < n) path.push(project(coordinates[i]), "L");
+ path.pop();
+ return path.join("");
+ },
+
+ MultiLineString: function(o) {
+ var path = [],
+ coordinates = o.coordinates,
+ i = -1, // coordinates.index
+ n = coordinates.length,
+ subcoordinates, // coordinates[i]
+ j, // subcoordinates.index
+ m; // subcoordinates.length
+ while (++i < n) {
+ subcoordinates = coordinates[i];
+ j = -1;
+ m = subcoordinates.length;
+ path.push("M");
+ while (++j < m) path.push(project(subcoordinates[j]), "L");
+ path.pop();
+ }
+ return path.join("");
+ },
+
+ Polygon: function(o) {
+ var path = [],
+ coordinates = o.coordinates,
+ i = -1, // coordinates.index
+ n = coordinates.length,
+ subcoordinates, // coordinates[i]
+ j, // subcoordinates.index
+ m; // subcoordinates.length
+ while (++i < n) {
+ subcoordinates = coordinates[i];
+ j = -1;
+ if ((m = subcoordinates.length - 1) > 0) {
+ path.push("M");
+ while (++j < m) path.push(project(subcoordinates[j]), "L");
+ path[path.length - 1] = "Z";
+ }
+ }
+ return path.join("");
+ },
+
+ MultiPolygon: function(o) {
+ var path = [],
+ coordinates = o.coordinates,
+ i = -1, // coordinates index
+ n = coordinates.length,
+ subcoordinates, // coordinates[i]
+ j, // subcoordinates index
+ m, // subcoordinates.length
+ subsubcoordinates, // subcoordinates[j]
+ k, // subsubcoordinates index
+ p; // subsubcoordinates.length
+ while (++i < n) {
+ subcoordinates = coordinates[i];
+ j = -1;
+ m = subcoordinates.length;
+ while (++j < m) {
+ subsubcoordinates = subcoordinates[j];
+ k = -1;
+ if ((p = subsubcoordinates.length - 1) > 0) {
+ path.push("M");
+ while (++k < p) path.push(project(subsubcoordinates[k]), "L");
+ path[path.length - 1] = "Z";
+ }
+ }
+ }
+ return path.join("");
+ },
+
+ GeometryCollection: function(o) {
+ var path = [],
+ geometries = o.geometries,
+ i = -1, // geometries index
+ n = geometries.length;
+ while (++i < n) path.push(pathType(geometries[i]));
+ return path.join("");
+ }
+
+ });
+
+ var areaType = path.area = d3_geo_type({
+
+ FeatureCollection: function(o) {
+ var area = 0,
+ features = o.features,
+ i = -1, // features.index
+ n = features.length;
+ while (++i < n) area += areaType(features[i]);
+ return area;
+ },
+
+ Feature: function(o) {
+ return areaType(o.geometry);
+ },
+
+ Polygon: function(o) {
+ return polygonArea(o.coordinates);
+ },
+
+ MultiPolygon: function(o) {
+ var sum = 0,
+ coordinates = o.coordinates,
+ i = -1, // coordinates index
+ n = coordinates.length;
+ while (++i < n) sum += polygonArea(coordinates[i]);
+ return sum;
+ },
+
+ GeometryCollection: function(o) {
+ var sum = 0,
+ geometries = o.geometries,
+ i = -1, // geometries index
+ n = geometries.length;
+ while (++i < n) sum += areaType(geometries[i]);
+ return sum;
+ }
+
+ }, 0);
+
+ function polygonArea(coordinates) {
+ var sum = area(coordinates[0]), // exterior ring
+ i = 0, // coordinates.index
+ n = coordinates.length;
+ while (++i < n) sum -= area(coordinates[i]); // holes
+ return sum;
+ }
+
+ function polygonCentroid(coordinates) {
+ var polygon = d3.geom.polygon(coordinates[0].map(projection)), // exterior ring
+ area = polygon.area(),
+ centroid = polygon.centroid(area < 0 ? (area *= -1, 1) : -1),
+ x = centroid[0],
+ y = centroid[1],
+ z = area,
+ i = 0, // coordinates index
+ n = coordinates.length;
+ while (++i < n) {
+ polygon = d3.geom.polygon(coordinates[i].map(projection)); // holes
+ area = polygon.area();
+ centroid = polygon.centroid(area < 0 ? (area *= -1, 1) : -1);
+ x -= centroid[0];
+ y -= centroid[1];
+ z -= area;
+ }
+ return [x, y, 6 * z]; // weighted centroid
+ }
+
+ var centroidType = path.centroid = d3_geo_type({
+
+ // TODO FeatureCollection
+ // TODO Point
+ // TODO MultiPoint
+ // TODO LineString
+ // TODO MultiLineString
+ // TODO GeometryCollection
+
+ Feature: function(o) {
+ return centroidType(o.geometry);
+ },
+
+ Polygon: function(o) {
+ var centroid = polygonCentroid(o.coordinates);
+ return [centroid[0] / centroid[2], centroid[1] / centroid[2]];
+ },
+
+ MultiPolygon: function(o) {
+ var area = 0,
+ coordinates = o.coordinates,
+ centroid,
+ x = 0,
+ y = 0,
+ z = 0,
+ i = -1, // coordinates index
+ n = coordinates.length;
+ while (++i < n) {
+ centroid = polygonCentroid(coordinates[i]);
+ x += centroid[0];
+ y += centroid[1];
+ z += centroid[2];
+ }
+ return [x / z, y / z];
+ }
+
+ });
+
+ function area(coordinates) {
+ return Math.abs(d3.geom.polygon(coordinates.map(projection)).area());
+ }
+
+ path.projection = function(x) {
+ projection = x;
+ return path;
+ };
+
+ path.pointRadius = function(x) {
+ if (typeof x === "function") pointRadius = x;
+ else {
+ pointRadius = +x;
+ pointCircle = d3_path_circle(pointRadius);
+ }
+ return path;
+ };
+
+ return path;
+};
+
+function d3_path_circle(radius) {
+ return "m0," + radius
+ + "a" + radius + "," + radius + " 0 1,1 0," + (-2 * radius)
+ + "a" + radius + "," + radius + " 0 1,1 0," + (+2 * radius)
+ + "z";
+}
+/**
+ * Given a GeoJSON object, returns the corresponding bounding box. The bounding
+ * box is represented by a two-dimensional array: [[left, bottom], [right,
+ * top]], where left is the minimum longitude, bottom is the minimum latitude,
+ * right is maximum longitude, and top is the maximum latitude.
+ */
+d3.geo.bounds = function(feature) {
+ var left = Infinity,
+ bottom = Infinity,
+ right = -Infinity,
+ top = -Infinity;
+ d3_geo_bounds(feature, function(x, y) {
+ if (x < left) left = x;
+ if (x > right) right = x;
+ if (y < bottom) bottom = y;
+ if (y > top) top = y;
+ });
+ return [[left, bottom], [right, top]];
+};
+
+function d3_geo_bounds(o, f) {
+ if (o.type in d3_geo_boundsTypes) d3_geo_boundsTypes[o.type](o, f);
+}
+
+var d3_geo_boundsTypes = {
+ Feature: d3_geo_boundsFeature,
+ FeatureCollection: d3_geo_boundsFeatureCollection,
+ GeometryCollection: d3_geo_boundsGeometryCollection,
+ LineString: d3_geo_boundsLineString,
+ MultiLineString: d3_geo_boundsMultiLineString,
+ MultiPoint: d3_geo_boundsLineString,
+ MultiPolygon: d3_geo_boundsMultiPolygon,
+ Point: d3_geo_boundsPoint,
+ Polygon: d3_geo_boundsPolygon
+};
+
+function d3_geo_boundsFeature(o, f) {
+ d3_geo_bounds(o.geometry, f);
+}
+
+function d3_geo_boundsFeatureCollection(o, f) {
+ for (var a = o.features, i = 0, n = a.length; i < n; i++) {
+ d3_geo_bounds(a[i].geometry, f);
+ }
+}
+
+function d3_geo_boundsGeometryCollection(o, f) {
+ for (var a = o.geometries, i = 0, n = a.length; i < n; i++) {
+ d3_geo_bounds(a[i], f);
+ }
+}
+
+function d3_geo_boundsLineString(o, f) {
+ for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
+ f.apply(null, a[i]);
+ }
+}
+
+function d3_geo_boundsMultiLineString(o, f) {
+ for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
+ for (var b = a[i], j = 0, m = b.length; j < m; j++) {
+ f.apply(null, b[j]);
+ }
+ }
+}
+
+function d3_geo_boundsMultiPolygon(o, f) {
+ for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
+ for (var b = a[i][0], j = 0, m = b.length; j < m; j++) {
+ f.apply(null, b[j]);
+ }
+ }
+}
+
+function d3_geo_boundsPoint(o, f) {
+ f.apply(null, o.coordinates);
+}
+
+function d3_geo_boundsPolygon(o, f) {
+ for (var a = o.coordinates[0], i = 0, n = a.length; i < n; i++) {
+ f.apply(null, a[i]);
+ }
+}
+// TODO breakAtDateLine?
+
+d3.geo.circle = function() {
+ var origin = [0, 0],
+ degrees = 90 - 1e-2,
+ radians = degrees * d3_geo_radians,
+ arc = d3.geo.greatArc().target(Object);
+
+ function circle() {
+ // TODO render a circle as a Polygon
+ }
+
+ function visible(point) {
+ return arc.distance(point) < radians;
+ }
+
+ circle.clip = function(d) {
+ arc.source(typeof origin === "function" ? origin.apply(this, arguments) : origin);
+ return clipType(d);
+ };
+
+ var clipType = d3_geo_type({
+
+ FeatureCollection: function(o) {
+ var features = o.features.map(clipType).filter(Object);
+ return features && (o = Object.create(o), o.features = features, o);
+ },
+
+ Feature: function(o) {
+ var geometry = clipType(o.geometry);
+ return geometry && (o = Object.create(o), o.geometry = geometry, o);
+ },
+
+ Point: function(o) {
+ return visible(o.coordinates) && o;
+ },
+
+ MultiPoint: function(o) {
+ var coordinates = o.coordinates.filter(visible);
+ return coordinates.length && {
+ type: o.type,
+ coordinates: coordinates
+ };
+ },
+
+ LineString: function(o) {
+ var coordinates = clip(o.coordinates);
+ return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o);
+ },
+
+ MultiLineString: function(o) {
+ var coordinates = o.coordinates.map(clip).filter(function(d) { return d.length; });
+ return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o);
+ },
+
+ Polygon: function(o) {
+ var coordinates = o.coordinates.map(clip);
+ return coordinates[0].length && (o = Object.create(o), o.coordinates = coordinates, o);
+ },
+
+ MultiPolygon: function(o) {
+ var coordinates = o.coordinates.map(function(d) { return d.map(clip); }).filter(function(d) { return d[0].length; });
+ return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o);
+ },
+
+ GeometryCollection: function(o) {
+ var geometries = o.geometries.map(clipType).filter(Object);
+ return geometries.length && (o = Object.create(o), o.geometries = geometries, o);
+ }
+
+ });
+
+ function clip(coordinates) {
+ var i = -1,
+ n = coordinates.length,
+ clipped = [],
+ p0,
+ p1,
+ p2,
+ d0,
+ d1;
+
+ while (++i < n) {
+ d1 = arc.distance(p2 = coordinates[i]);
+ if (d1 < radians) {
+ if (p1) clipped.push(d3_geo_greatArcInterpolate(p1, p2)((d0 - radians) / (d0 - d1)));
+ clipped.push(p2);
+ p0 = p1 = null;
+ } else {
+ p1 = p2;
+ if (!p0 && clipped.length) {
+ clipped.push(d3_geo_greatArcInterpolate(clipped[clipped.length - 1], p1)((radians - d0) / (d1 - d0)));
+ p0 = p1;
+ }
+ }
+ d0 = d1;
+ }
+
+ if (p1 && clipped.length) {
+ d1 = arc.distance(p2 = clipped[0]);
+ clipped.push(d3_geo_greatArcInterpolate(p1, p2)((d0 - radians) / (d0 - d1)));
+ }
+
+ return resample(clipped);
+ }
+
+ // Resample coordinates, creating great arcs between each.
+ function resample(coordinates) {
+ var i = 0,
+ n = coordinates.length,
+ j,
+ m,
+ resampled = n ? [coordinates[0]] : coordinates,
+ resamples,
+ origin = arc.source();
+
+ while (++i < n) {
+ resamples = arc.source(coordinates[i - 1])(coordinates[i]).coordinates;
+ for (j = 0, m = resamples.length; ++j < m;) resampled.push(resamples[j]);
+ }
+
+ arc.source(origin);
+ return resampled;
+ }
+
+ circle.origin = function(x) {
+ if (!arguments.length) return origin;
+ origin = x;
+ return circle;
+ };
+
+ circle.angle = function(x) {
+ if (!arguments.length) return degrees;
+ radians = (degrees = +x) * d3_geo_radians;
+ return circle;
+ };
+
+ // Precision is specified in degrees.
+ circle.precision = function(x) {
+ if (!arguments.length) return arc.precision();
+ arc.precision(x);
+ return circle;
+ };
+
+ return circle;
+}
+d3.geo.greatArc = function() {
+ var source = d3_geo_greatArcSource,
+ target = d3_geo_greatArcTarget,
+ precision = 6 * d3_geo_radians;
+
+ function greatArc() {
+ var a = typeof source === "function" ? source.apply(this, arguments) : source,
+ b = typeof target === "function" ? target.apply(this, arguments) : target,
+ i = d3_geo_greatArcInterpolate(a, b),
+ dt = precision / i.d,
+ t = 0,
+ coordinates = [a];
+ while ((t += dt) < 1) coordinates.push(i(t));
+ coordinates.push(b);
+ return {
+ type: "LineString",
+ coordinates: coordinates
+ };
+ }
+
+ // Length returned in radians; multiply by radius for distance.
+ greatArc.distance = function() {
+ var a = typeof source === "function" ? source.apply(this, arguments) : source,
+ b = typeof target === "function" ? target.apply(this, arguments) : target;
+ return d3_geo_greatArcInterpolate(a, b).d;
+ };
+
+ greatArc.source = function(x) {
+ if (!arguments.length) return source;
+ source = x;
+ return greatArc;
+ };
+
+ greatArc.target = function(x) {
+ if (!arguments.length) return target;
+ target = x;
+ return greatArc;
+ };
+
+ // Precision is specified in degrees.
+ greatArc.precision = function(x) {
+ if (!arguments.length) return precision / d3_geo_radians;
+ precision = x * d3_geo_radians;
+ return greatArc;
+ };
+
+ return greatArc;
+};
+
+function d3_geo_greatArcSource(d) {
+ return d.source;
+}
+
+function d3_geo_greatArcTarget(d) {
+ return d.target;
+}
+
+function d3_geo_greatArcInterpolate(a, b) {
+ var x0 = a[0] * d3_geo_radians, cx0 = Math.cos(x0), sx0 = Math.sin(x0),
+ y0 = a[1] * d3_geo_radians, cy0 = Math.cos(y0), sy0 = Math.sin(y0),
+ x1 = b[0] * d3_geo_radians, cx1 = Math.cos(x1), sx1 = Math.sin(x1),
+ y1 = b[1] * d3_geo_radians, cy1 = Math.cos(y1), sy1 = Math.sin(y1),
+ d = interpolate.d = Math.acos(Math.max(-1, Math.min(1, sy0 * sy1 + cy0 * cy1 * Math.cos(x1 - x0)))),
+ sd = Math.sin(d);
+
+ // From http://williams.best.vwh.net/avform.htm#Intermediate
+ function interpolate(t) {
+ var A = Math.sin(d - (t *= d)) / sd,
+ B = Math.sin(t) / sd,
+ x = A * cy0 * cx0 + B * cy1 * cx1,
+ y = A * cy0 * sx0 + B * cy1 * sx1,
+ z = A * sy0 + B * sy1;
+ return [
+ Math.atan2(y, x) / d3_geo_radians,
+ Math.atan2(z, Math.sqrt(x * x + y * y)) / d3_geo_radians
+ ];
+ }
+
+ return interpolate;
+}
+d3.geo.greatCircle = d3.geo.circle;
+})();
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geo.min.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geo.min.js
new file mode 100644
index 0000000..a4fcd24
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geo.min.js
@@ -0,0 +1 @@
+(function(){function b(a,b){return function(c){return c&&c.type in a?a[c.type](c):b}}function c(a){return"m0,"+a+"a"+a+","+a+" 0 1,1 0,"+ -2*a+"a"+a+","+a+" 0 1,1 0,"+2*a+"z"}function d(a,b){a.type in e&&e[a.type](a,b)}function f(a,b){d(a.geometry,b)}function g(a,b){for(var c=a.features,e=0,f=c.length;e<f;e++)d(c[e].geometry,b)}function h(a,b){for(var c=a.geometries,e=0,f=c.length;e<f;e++)d(c[e],b)}function i(a,b){for(var c=a.coordinates,d=0,e=c.length;d<e;d++)b.apply(null,c[d])}function j(a,b){for(var c=a.coordinates,d=0,e=c.length;d<e;d++)for(var f=c[d],g=0,h=f.length;g<h;g++)b.apply(null,f[g])}function k(a,b){for(var c=a.coordinates,d=0,e=c.length;d<e;d++)for(var f=c[d][0],g=0,h=f.length;g<h;g++)b.apply(null,f[g])}function l(a,b){b.apply(null,a.coordinates)}function m(a,b){for(var c=a.coordinates[0],d=0,e=c.length;d<e;d++)b.apply(null,c[d])}function n(a){return a.source}function o(a){return a.target}function p(b,c){function r(b){var c=Math.sin(p-(b*=p))/q,d=Math.sin(b)/q,g=c*h*e+d*n*k,j=c*h*f+d*n*l,m=c*i+d*o;return[Math.atan2(j,g)/a,Math.atan2(m,Math.sqrt(g*g+j*j))/a]}var d=b[0]*a,e=Math.cos(d),f=Math.sin(d),g=b[1]*a,h=Math.cos(g),i=Math.sin(g),j=c[0]*a,k=Math.cos(j),l=Math.sin(j),m=c[1]*a,n=Math.cos(m),o=Math.sin(m),p=r.d=Math.acos(Math.max(-1,Math.min(1,i*o+h*n*Math.cos(j-d)))),q=Math.sin(p);return r}d3.geo={};var a=Math.PI/180;d3.geo.azimuthal=function(){function j(c){var g=c[0]*a-f,j=c[1]*a,k=Math.cos(g),l=Math.sin(g),m=Math.cos(j),n=Math.sin(j),o=b!=="orthographic"?i*n+h*m*k:null,p,q=b==="stereographic"?1/(1+o):b==="gnomonic"?1/o:b==="equidistant"?(p=Math.acos(o),p?p/Math.sin(p):0):b==="equalarea"?Math.sqrt(2/(1+o)):1,r=q*m*l,s=q*(i*m*k-h*n);return[d*r+e[0],d*s+e[1]]}var b="orthographic",c,d=200,e=[480,250],f,g,h,i;return j.invert=function(c){var g=(c[0]-e[0])/d,j=(c[1]-e[1])/d,k=Math.sqrt(g*g+j*j),l=b==="stereographic"?2*Math.atan(k):b==="gnomonic"?Math.atan(k):b==="equidistant"?k:b==="equalarea"?2*Math.asin(.5*k):Math.asin(k),m=Math.sin(l),n=Math.cos(l);return[(f+Math.atan2(g*m,k*h*n+j*i*m))/a,Math.asin(n*i-(k?j*m*h/k:0))/a]},j.mode=function(a){return arguments.length?(b=a+"",j):b},j.origin=function(b){return arguments.length?(c=b,f=c[0]*a,g=c[1]*a,h=Math.cos(g),i=Math.sin(g),j):c},j.scale=function(a){return arguments.length?(d=+a,j):d},j.translate=function(a){return arguments.length?(e=[+a[0],+a[1]],j):e},j.origin([0,0])},d3.geo.albers=function(){function j(b){var c=g*(a*b[0]-f),j=Math.sqrt(h-2*g*Math.sin(a*b[1]))/g;return[d*j*Math.sin(c)+e[0],d*(j*Math.cos(c)-i)+e[1]]}function k(){var d=a*c[0],e=a*c[1],k=a*b[1],l=Math.sin(d),m=Math.cos(d);return f=a*b[0],g=.5*(l+Math.sin(e)),h=m*m+2*g*l,i=Math.sqrt(h-2*g*Math.sin(k))/g,j}var b=[-98,38],c=[29.5,45.5],d=1e3,e=[480,250],f,g,h,i;return j.invert=function(b){var c=(b[0]-e[0])/d,j=(b[1]-e[1])/d,k=i+j,l=Math.atan2(c,k),m=Math.sqrt(c*c+k*k);return[(f+l/g)/a,Math.asin((h-m*m*g*g)/(2*g))/a]},j.origin=function(a){return arguments.length?(b=[+a[0],+a[1]],k()):b},j.parallels=function(a){return arguments.length?(c=[+a[0],+a[1]],k()):c},j.scale=function(a){return arguments.length?(d=+a,j):d},j.translate=function(a){return arguments.length?(e=[+a[0],+a[1]],j):e},k()},d3.geo.albersUsa=function(){function e(e){var f=e[0],g=e[1];return(g>50?b:f<-140?c:g<21?d:a)(e)}var a=d3.geo.albers(),b=d3.geo.albers().origin([-160,60]).parallels([55,65]),c=d3.geo.albers().origin([-160,20]).parallels([8,18]),d=d3.geo.albers().origin([-60,10]).parallels([8,18]);return e.scale=function(f){return arguments.length?(a.scale(f),b.scale(f*.6),c.scale(f),d.scale(f*1.5),e.translate(a.translate())):a.scale()},e.translate=function(f){if(!arguments.length)return a.translate();var g=a.scale()/1e3,h=f[0],i=f[1];return a.translate(f),b.translate([h-400*g,i+170*g]),c.translate([h-190*g,i+200*g]),d.translate([h+580*g,i+430*g]),e},e.scale(a.scale())},d3.geo.bonne=function(){function h(h){var i=h[0]*a-d,j=h[1]*a-e;if(f){var k=g+f-j,l=i*Math.cos(j)/k;i=k*Math.sin(l),j=k*Math.cos(l)-g}else i*=Math.cos(j),j*=-1;return[b*i+c[0],b*j+c[1]]}var b=200,c=[480,250],d,e,f,g;return h.invert=function(e){var h=(e[0]-c[0])/b,i=(e[1]-c[1])/b;if(f){var j=g+i,k=Math.sqrt(h*h+j*j);i=g+f-k,h=d+k*Math.atan2(h,j)/Math.cos(i)}else i*=-1,h/=Math.cos(i);return[h/a,i/a]},h.parallel=function(b){return arguments.length?(g=1/Math.tan(f=b*a),h):f/a},h.origin=function(b){return arguments.length?(d=b[0]*a,e=b[1]*a,h):[d/a,e/a]},h.scale=function(a){return arguments.length?(b=+a,h):b},h.translate=function(a){return arguments.length?(c=[+a[0],+a[1]],h):c},h.origin([0,0]).parallel(45)},d3.geo.equirectangular=function(){function c(c){var d=c[0]/360,e=-c[1]/360;return[a*d+b[0],a*e+b[1]]}var a=500,b=[480,250];return c.invert=function(c){var d=(c[0]-b[0])/a,e=(c[1]-b[1])/a;return[360*d,-360*e]},c.scale=function(b){return arguments.length?(a=+b,c):a},c.translate=function(a){return arguments.length?(b=[+a[0],+a[1]],c):b},c},d3.geo.mercator=function(){function d(d){var e=d[0]/360,f=-(Math.log(Math.tan(Math.PI/4+d[1]*a/2))/a)/360;return[b*e+c[0],b*Math.max(-0.5,Math.min(.5,f))+c[1]]}var b=500,c=[480,250];return d.invert=function(d){var e=(d[0]-c[0])/b,f=(d[1]-c[1])/b;return[360*e,2*Math.atan(Math.exp(-360*f*a))/a-90]},d.scale=function(a){return arguments.length?(b=+a,d):b},d.translate=function(a){return arguments.length?(c=[+a[0],+a[1]],d):c},d},d3.geo.path=function(){function f(b,e){return typeof a=="function"&&(d=c(a.apply(this,arguments))),h(b)||null}function g(a){return e(a).join(",")}function j(a){var b=m(a[0]),c=0,d=a.length;while(++c<d)b-=m(a[c]);return b}function k(a){var b=d3.geom.polygon(a[0].map(e)),c=b.area(),d=b.centroid(c<0?(c*=-1,1):-1),f=d[0],g=d[1],h=c,i=0,j=a.length;while(++i<j)b=d3.geom.polygon(a[i].map(e)),c=b.area(),d=b.centroid(c<0?(c*=-1,1):-1),f-=d[0],g-=d[1],h-=c;return[f,g,6*h]}function m(a){return Math.abs(d3.geom.polygon(a.map(e)).area())}var a=4.5,d=c(a),e=d3.geo.albersUsa(),h=b({FeatureCollection:function(a){var b=[],c=a.features,d=-1,e=c.length;while(++d<e)b.push(h(c[d].geometry));return b.join("")},Feature:function(a){return h(a.geometry)},Point:function(a){return"M"+g(a.coordinates)+d},MultiPoint:function(a){var b=[],c=a.coordinates,e=-1,f=c.length;while(++e<f)b.push("M",g(c[e]),d);return b.join("")},LineString:function(a){var b=["M"],c=a.coordinates,d=-1,e=c.length;while(++d<e)b.push(g(c[d]),"L");return b.pop(),b.join("")},MultiLineString:function(a){var b=[],c=a.coordinates,d=-1,e=c.length,f,h,i;while(++d<e){f=c[d],h=-1,i=f.length,b.push("M");while(++h<i)b.push(g(f[h]),"L");b.pop()}return b.join("")},Polygon:function(a){var b=[],c=a.coordinates,d=-1,e=c.length,f,h,i;while(++d<e){f=c[d],h=-1;if((i=f.length-1)>0){b.push("M");while(++h<i)b.push(g(f[h]),"L");b[b.length-1]="Z"}}return b.join("")},MultiPolygon:function(a){var b=[],c=a.coordinates,d=-1,e=c.length,f,h,i,j,k,l;while(++d<e){f=c[d],h=-1,i=f.length;while(++h<i){j=f[h],k=-1;if((l=j.length-1)>0){b.push("M");while(++k<l)b.push(g(j[k]),"L");b[b.length-1]="Z"}}}return b.join("")},GeometryCollection:function(a){var b=[],c=a.geometries,d=-1,e=c.length;while(++d<e)b.push(h(c[d]));return b.join("")}}),i=f.area=b({FeatureCollection:function(a){var b=0,c=a.features,d=-1,e=c.length;while(++d<e)b+=i(c[d]);return b},Feature:function(a){return i(a.geometry)},Polygon:function(a){return j(a.coordinates)},MultiPolygon:function(a){var b=0,c=a.coordinates,d=-1,e=c.length;while(++d<e)b+=j(c[d]);return b},GeometryCollection:function(a){var b=0,c=a.geometries,d=-1,e=c.length;while(++d<e)b+=i(c[d]);return b}},0),l=f.centroid=b({Feature:function(a){return l(a.geometry)},Polygon:function(a){var b=k(a.coordinates);return[b[0]/b[2],b[1]/b[2]]},MultiPolygon:function(a){var b=0,c=a.coordinates,d,e=0,f=0,g=0,h=-1,i=c.length;while(++h<i)d=k(c[h]),e+=d[0],f+=d[1],g+=d[2];return[e/g,f/g]}});return f.projection=function(a){return e=a,f},f.pointRadius=function(b){return typeof b=="function"?a=b:(a=+b,d=c(a)),f},f},d3.geo.bounds=function(a){var b=Infinity,c=Infinity,e=-Infinity,f=-Infinity;return d(a,function(a,d){a<b&&(b=a),a>e&&(e=a),d<c&&(c=d),d>f&&(f=d)}),[[b,c],[e,f]]};var e={Feature:f,FeatureCollection:g,GeometryCollection:h,LineString:i,MultiLineString:j,MultiPoint:i,MultiPolygon:k,Point:l,Polygon:m};d3.geo.circle=function(){function g(){}function h(a){return f.distance(a)<e}function j(a){var b=-1,c=a.length,d=[],g,h,i,j,l;while(++b<c)l=f.distance(i=a[b]),l<e?(h&&d.push(p(h,i)((j-e)/(j-l))),d.push(i),g=h=null):(h=i,!g&&d.length&&(d.push(p(d[d.length-1],h)((e-j)/(l-j))),g=h)),j=l;return h&&d.length&&(l=f.distance(i=d[0]),d.push(p(h,i)((j-e)/(j-l)))),k(d)}function k(a){var b=0,c=a.length,d,e,g=c?[a[0]]:a,h,i=f.source();while(++b<c){h=f.source(a[b-1])(a[b]).coordinates;for(d=0,e=h.length;++d<e;)g.push(h[d])}return f.source(i),g}var c=[0,0],d=89.99,e=d*a,f=d3.geo.greatArc().target(Object);g.clip=function(a){return f.source(typeof c=="function"?c.apply(this,arguments):c),i(a)};var i=b({FeatureCollection:function(a){var b=a.features.map(i).filter(Object);return b&&(a=Object.create(a),a.features=b,a)},Feature:function(a){var b=i(a.geometry);return b&&(a=Object.create(a),a.geometry=b,a)},Point:function(a){return h(a.coordinates)&&a},MultiPoint:function(a){var b=a.coordinates.filter(h);return b.length&&{type:a.type,coordinates:b}},LineString:function(a){var b=j(a.coordinates);return b.length&&(a=Object.create(a),a.coordinates=b,a)},MultiLineString:function(a){var b=a.coordinates.map(j).filter(function(a){return a.length});return b.length&&(a=Object.create(a),a.coordinates=b,a)},Polygon:function(a){var b=a.coordinates.map(j);return b[0].length&&(a=Object.create(a),a.coordinates=b,a)},MultiPolygon:function(a){var b=a.coordinates.map(function(a){return a.map(j)}).filter(function(a){return a[0].length});return b.length&&(a=Object.create(a),a.coordinates=b,a)},GeometryCollection:function(a){var b=a.geometries.map(i).filter(Object);return b.length&&(a=Object.create(a),a.geometries=b,a)}});return g.origin=function(a){return arguments.length?(c=a,g):c},g.angle=function(b){return arguments.length?(e=(d=+b)*a,g):d},g.precision=function(a){return arguments.length?(f.precision(a),g):f.precision()},g},d3.geo.greatArc=function(){function e(){var a=typeof b=="function"?b.apply(this,arguments):b,e=typeof c=="function"?c.apply(this,arguments):c,f=p(a,e),g=d/f.d,h=0,i=[a];while((h+=g)<1)i.push(f(h));return i.push(e),{type:"LineString",coordinates:i}}var b=n,c=o,d=6*a;return e.distance=function(){var a=typeof b=="function"?b.apply(this,arguments):b,d=typeof c=="function"?c.apply(this,arguments):c;return p(a,d).d},e.source=function(a){return arguments.length?(b=a,e):b},e.target=function(a){return arguments.length?(c=a,e):c},e.precision=function(b){return arguments.length?(d=b*a,e):d/a},e},d3.geo.greatCircle=d3.geo.circle})(); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geom.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geom.js
new file mode 100644
index 0000000..d860c2b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geom.js
@@ -0,0 +1,835 @@
+(function(){d3.geom = {};
+/**
+ * Computes a contour for a given input grid function using the <a
+ * href="http://en.wikipedia.org/wiki/Marching_squares">marching
+ * squares</a> algorithm. Returns the contour polygon as an array of points.
+ *
+ * @param grid a two-input function(x, y) that returns true for values
+ * inside the contour and false for values outside the contour.
+ * @param start an optional starting point [x, y] on the grid.
+ * @returns polygon [[x1, y1], [x2, y2], …]
+ */
+d3.geom.contour = function(grid, start) {
+ var s = start || d3_geom_contourStart(grid), // starting point
+ c = [], // contour polygon
+ x = s[0], // current x position
+ y = s[1], // current y position
+ dx = 0, // next x direction
+ dy = 0, // next y direction
+ pdx = NaN, // previous x direction
+ pdy = NaN, // previous y direction
+ i = 0;
+
+ do {
+ // determine marching squares index
+ i = 0;
+ if (grid(x-1, y-1)) i += 1;
+ if (grid(x, y-1)) i += 2;
+ if (grid(x-1, y )) i += 4;
+ if (grid(x, y )) i += 8;
+
+ // determine next direction
+ if (i === 6) {
+ dx = pdy === -1 ? -1 : 1;
+ dy = 0;
+ } else if (i === 9) {
+ dx = 0;
+ dy = pdx === 1 ? -1 : 1;
+ } else {
+ dx = d3_geom_contourDx[i];
+ dy = d3_geom_contourDy[i];
+ }
+
+ // update contour polygon
+ if (dx != pdx && dy != pdy) {
+ c.push([x, y]);
+ pdx = dx;
+ pdy = dy;
+ }
+
+ x += dx;
+ y += dy;
+ } while (s[0] != x || s[1] != y);
+
+ return c;
+};
+
+// lookup tables for marching directions
+var d3_geom_contourDx = [1, 0, 1, 1,-1, 0,-1, 1,0, 0,0,0,-1, 0,-1,NaN],
+ d3_geom_contourDy = [0,-1, 0, 0, 0,-1, 0, 0,1,-1,1,1, 0,-1, 0,NaN];
+
+function d3_geom_contourStart(grid) {
+ var x = 0,
+ y = 0;
+
+ // search for a starting point; begin at origin
+ // and proceed along outward-expanding diagonals
+ while (true) {
+ if (grid(x,y)) {
+ return [x,y];
+ }
+ if (x === 0) {
+ x = y + 1;
+ y = 0;
+ } else {
+ x = x - 1;
+ y = y + 1;
+ }
+ }
+}
+/**
+ * Computes the 2D convex hull of a set of points using Graham's scanning
+ * algorithm. The algorithm has been implemented as described in Cormen,
+ * Leiserson, and Rivest's Introduction to Algorithms. The running time of
+ * this algorithm is O(n log n), where n is the number of input points.
+ *
+ * @param vertices [[x1, y1], [x2, y2], …]
+ * @returns polygon [[x1, y1], [x2, y2], …]
+ */
+d3.geom.hull = function(vertices) {
+ if (vertices.length < 3) return [];
+
+ var len = vertices.length,
+ plen = len - 1,
+ points = [],
+ stack = [],
+ i, j, h = 0, x1, y1, x2, y2, u, v, a, sp;
+
+ // find the starting ref point: leftmost point with the minimum y coord
+ for (i=1; i<len; ++i) {
+ if (vertices[i][1] < vertices[h][1]) {
+ h = i;
+ } else if (vertices[i][1] == vertices[h][1]) {
+ h = (vertices[i][0] < vertices[h][0] ? i : h);
+ }
+ }
+
+ // calculate polar angles from ref point and sort
+ for (i=0; i<len; ++i) {
+ if (i === h) continue;
+ y1 = vertices[i][1] - vertices[h][1];
+ x1 = vertices[i][0] - vertices[h][0];
+ points.push({angle: Math.atan2(y1, x1), index: i});
+ }
+ points.sort(function(a, b) { return a.angle - b.angle; });
+
+ // toss out duplicate angles
+ a = points[0].angle;
+ v = points[0].index;
+ u = 0;
+ for (i=1; i<plen; ++i) {
+ j = points[i].index;
+ if (a == points[i].angle) {
+ // keep angle for point most distant from the reference
+ x1 = vertices[v][0] - vertices[h][0];
+ y1 = vertices[v][1] - vertices[h][1];
+ x2 = vertices[j][0] - vertices[h][0];
+ y2 = vertices[j][1] - vertices[h][1];
+ if ((x1*x1 + y1*y1) >= (x2*x2 + y2*y2)) {
+ points[i].index = -1;
+ } else {
+ points[u].index = -1;
+ a = points[i].angle;
+ u = i;
+ v = j;
+ }
+ } else {
+ a = points[i].angle;
+ u = i;
+ v = j;
+ }
+ }
+
+ // initialize the stack
+ stack.push(h);
+ for (i=0, j=0; i<2; ++j) {
+ if (points[j].index !== -1) {
+ stack.push(points[j].index);
+ i++;
+ }
+ }
+ sp = stack.length;
+
+ // do graham's scan
+ for (; j<plen; ++j) {
+ if (points[j].index === -1) continue; // skip tossed out points
+ while (!d3_geom_hullCCW(stack[sp-2], stack[sp-1], points[j].index, vertices)) {
+ --sp;
+ }
+ stack[sp++] = points[j].index;
+ }
+
+ // construct the hull
+ var poly = [];
+ for (i=0; i<sp; ++i) {
+ poly.push(vertices[stack[i]]);
+ }
+ return poly;
+}
+
+// are three points in counter-clockwise order?
+function d3_geom_hullCCW(i1, i2, i3, v) {
+ var t, a, b, c, d, e, f;
+ t = v[i1]; a = t[0]; b = t[1];
+ t = v[i2]; c = t[0]; d = t[1];
+ t = v[i3]; e = t[0]; f = t[1];
+ return ((f-b)*(c-a) - (d-b)*(e-a)) > 0;
+}
+// Note: requires coordinates to be counterclockwise and convex!
+d3.geom.polygon = function(coordinates) {
+
+ coordinates.area = function() {
+ var i = 0,
+ n = coordinates.length,
+ a = coordinates[n - 1][0] * coordinates[0][1],
+ b = coordinates[n - 1][1] * coordinates[0][0];
+ while (++i < n) {
+ a += coordinates[i - 1][0] * coordinates[i][1];
+ b += coordinates[i - 1][1] * coordinates[i][0];
+ }
+ return (b - a) * .5;
+ };
+
+ coordinates.centroid = function(k) {
+ var i = -1,
+ n = coordinates.length - 1,
+ x = 0,
+ y = 0,
+ a,
+ b,
+ c;
+ if (!arguments.length) k = -1 / (6 * coordinates.area());
+ while (++i < n) {
+ a = coordinates[i];
+ b = coordinates[i + 1];
+ c = a[0] * b[1] - b[0] * a[1];
+ x += (a[0] + b[0]) * c;
+ y += (a[1] + b[1]) * c;
+ }
+ return [x * k, y * k];
+ };
+
+ // The Sutherland-Hodgman clipping algorithm.
+ coordinates.clip = function(subject) {
+ var input,
+ i = -1,
+ n = coordinates.length,
+ j,
+ m,
+ a = coordinates[n - 1],
+ b,
+ c,
+ d;
+ while (++i < n) {
+ input = subject.slice();
+ subject.length = 0;
+ b = coordinates[i];
+ c = input[(m = input.length) - 1];
+ j = -1;
+ while (++j < m) {
+ d = input[j];
+ if (d3_geom_polygonInside(d, a, b)) {
+ if (!d3_geom_polygonInside(c, a, b)) {
+ subject.push(d3_geom_polygonIntersect(c, d, a, b));
+ }
+ subject.push(d);
+ } else if (d3_geom_polygonInside(c, a, b)) {
+ subject.push(d3_geom_polygonIntersect(c, d, a, b));
+ }
+ c = d;
+ }
+ a = b;
+ }
+ return subject;
+ };
+
+ return coordinates;
+};
+
+function d3_geom_polygonInside(p, a, b) {
+ return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
+}
+
+// Intersect two infinite lines cd and ab.
+function d3_geom_polygonIntersect(c, d, a, b) {
+ var x1 = c[0], x2 = d[0], x3 = a[0], x4 = b[0],
+ y1 = c[1], y2 = d[1], y3 = a[1], y4 = b[1],
+ x13 = x1 - x3,
+ x21 = x2 - x1,
+ x43 = x4 - x3,
+ y13 = y1 - y3,
+ y21 = y2 - y1,
+ y43 = y4 - y3,
+ ua = (x43 * y13 - y43 * x13) / (y43 * x21 - x43 * y21);
+ return [x1 + ua * x21, y1 + ua * y21];
+}
+// Adapted from Nicolas Garcia Belmonte's JIT implementation:
+// http://blog.thejit.org/2010/02/12/voronoi-tessellation/
+// http://blog.thejit.org/assets/voronoijs/voronoi.js
+// See lib/jit/LICENSE for details.
+
+// Notes:
+//
+// This implementation does not clip the returned polygons, so if you want to
+// clip them to a particular shape you will need to do that either in SVG or by
+// post-processing with d3.geom.polygon's clip method.
+//
+// If any vertices are coincident or have NaN positions, the behavior of this
+// method is undefined. Most likely invalid polygons will be returned. You
+// should filter invalid points, and consolidate coincident points, before
+// computing the tessellation.
+
+/**
+ * @param vertices [[x1, y1], [x2, y2], …]
+ * @returns polygons [[[x1, y1], [x2, y2], …], …]
+ */
+d3.geom.voronoi = function(vertices) {
+ var polygons = vertices.map(function() { return []; });
+
+ d3_voronoi_tessellate(vertices, function(e) {
+ var s1,
+ s2,
+ x1,
+ x2,
+ y1,
+ y2;
+ if (e.a === 1 && e.b >= 0) {
+ s1 = e.ep.r;
+ s2 = e.ep.l;
+ } else {
+ s1 = e.ep.l;
+ s2 = e.ep.r;
+ }
+ if (e.a === 1) {
+ y1 = s1 ? s1.y : -1e6;
+ x1 = e.c - e.b * y1;
+ y2 = s2 ? s2.y : 1e6;
+ x2 = e.c - e.b * y2;
+ } else {
+ x1 = s1 ? s1.x : -1e6;
+ y1 = e.c - e.a * x1;
+ x2 = s2 ? s2.x : 1e6;
+ y2 = e.c - e.a * x2;
+ }
+ var v1 = [x1, y1],
+ v2 = [x2, y2];
+ polygons[e.region.l.index].push(v1, v2);
+ polygons[e.region.r.index].push(v1, v2);
+ });
+
+ // Reconnect the polygon segments into counterclockwise loops.
+ return polygons.map(function(polygon, i) {
+ var cx = vertices[i][0],
+ cy = vertices[i][1];
+ polygon.forEach(function(v) {
+ v.angle = Math.atan2(v[0] - cx, v[1] - cy);
+ });
+ return polygon.sort(function(a, b) {
+ return a.angle - b.angle;
+ }).filter(function(d, i) {
+ return !i || (d.angle - polygon[i - 1].angle > 1e-10);
+ });
+ });
+};
+
+var d3_voronoi_opposite = {"l": "r", "r": "l"};
+
+function d3_voronoi_tessellate(vertices, callback) {
+
+ var Sites = {
+ list: vertices
+ .map(function(v, i) {
+ return {
+ index: i,
+ x: v[0],
+ y: v[1]
+ };
+ })
+ .sort(function(a, b) {
+ return a.y < b.y ? -1
+ : a.y > b.y ? 1
+ : a.x < b.x ? -1
+ : a.x > b.x ? 1
+ : 0;
+ }),
+ bottomSite: null
+ };
+
+ var EdgeList = {
+ list: [],
+ leftEnd: null,
+ rightEnd: null,
+
+ init: function() {
+ EdgeList.leftEnd = EdgeList.createHalfEdge(null, "l");
+ EdgeList.rightEnd = EdgeList.createHalfEdge(null, "l");
+ EdgeList.leftEnd.r = EdgeList.rightEnd;
+ EdgeList.rightEnd.l = EdgeList.leftEnd;
+ EdgeList.list.unshift(EdgeList.leftEnd, EdgeList.rightEnd);
+ },
+
+ createHalfEdge: function(edge, side) {
+ return {
+ edge: edge,
+ side: side,
+ vertex: null,
+ "l": null,
+ "r": null
+ };
+ },
+
+ insert: function(lb, he) {
+ he.l = lb;
+ he.r = lb.r;
+ lb.r.l = he;
+ lb.r = he;
+ },
+
+ leftBound: function(p) {
+ var he = EdgeList.leftEnd;
+ do {
+ he = he.r;
+ } while (he != EdgeList.rightEnd && Geom.rightOf(he, p));
+ he = he.l;
+ return he;
+ },
+
+ del: function(he) {
+ he.l.r = he.r;
+ he.r.l = he.l;
+ he.edge = null;
+ },
+
+ right: function(he) {
+ return he.r;
+ },
+
+ left: function(he) {
+ return he.l;
+ },
+
+ leftRegion: function(he) {
+ return he.edge == null
+ ? Sites.bottomSite
+ : he.edge.region[he.side];
+ },
+
+ rightRegion: function(he) {
+ return he.edge == null
+ ? Sites.bottomSite
+ : he.edge.region[d3_voronoi_opposite[he.side]];
+ }
+ };
+
+ var Geom = {
+
+ bisect: function(s1, s2) {
+ var newEdge = {
+ region: {"l": s1, "r": s2},
+ ep: {"l": null, "r": null}
+ };
+
+ var dx = s2.x - s1.x,
+ dy = s2.y - s1.y,
+ adx = dx > 0 ? dx : -dx,
+ ady = dy > 0 ? dy : -dy;
+
+ newEdge.c = s1.x * dx + s1.y * dy
+ + (dx * dx + dy * dy) * .5;
+
+ if (adx > ady) {
+ newEdge.a = 1;
+ newEdge.b = dy / dx;
+ newEdge.c /= dx;
+ } else {
+ newEdge.b = 1;
+ newEdge.a = dx / dy;
+ newEdge.c /= dy;
+ }
+
+ return newEdge;
+ },
+
+ intersect: function(el1, el2) {
+ var e1 = el1.edge,
+ e2 = el2.edge;
+ if (!e1 || !e2 || (e1.region.r == e2.region.r)) {
+ return null;
+ }
+ var d = (e1.a * e2.b) - (e1.b * e2.a);
+ if (Math.abs(d) < 1e-10) {
+ return null;
+ }
+ var xint = (e1.c * e2.b - e2.c * e1.b) / d,
+ yint = (e2.c * e1.a - e1.c * e2.a) / d,
+ e1r = e1.region.r,
+ e2r = e2.region.r,
+ el,
+ e;
+ if ((e1r.y < e2r.y) ||
+ (e1r.y == e2r.y && e1r.x < e2r.x)) {
+ el = el1;
+ e = e1;
+ } else {
+ el = el2;
+ e = e2;
+ }
+ var rightOfSite = (xint >= e.region.r.x);
+ if ((rightOfSite && (el.side === "l")) ||
+ (!rightOfSite && (el.side === "r"))) {
+ return null;
+ }
+ return {
+ x: xint,
+ y: yint
+ };
+ },
+
+ rightOf: function(he, p) {
+ var e = he.edge,
+ topsite = e.region.r,
+ rightOfSite = (p.x > topsite.x);
+
+ if (rightOfSite && (he.side === "l")) {
+ return 1;
+ }
+ if (!rightOfSite && (he.side === "r")) {
+ return 0;
+ }
+ if (e.a === 1) {
+ var dyp = p.y - topsite.y,
+ dxp = p.x - topsite.x,
+ fast = 0,
+ above = 0;
+
+ if ((!rightOfSite && (e.b < 0)) ||
+ (rightOfSite && (e.b >= 0))) {
+ above = fast = (dyp >= e.b * dxp);
+ } else {
+ above = ((p.x + p.y * e.b) > e.c);
+ if (e.b < 0) {
+ above = !above;
+ }
+ if (!above) {
+ fast = 1;
+ }
+ }
+ if (!fast) {
+ var dxs = topsite.x - e.region.l.x;
+ above = (e.b * (dxp * dxp - dyp * dyp)) <
+ (dxs * dyp * (1 + 2 * dxp / dxs + e.b * e.b));
+
+ if (e.b < 0) {
+ above = !above;
+ }
+ }
+ } else /* e.b == 1 */ {
+ var yl = e.c - e.a * p.x,
+ t1 = p.y - yl,
+ t2 = p.x - topsite.x,
+ t3 = yl - topsite.y;
+
+ above = (t1 * t1) > (t2 * t2 + t3 * t3);
+ }
+ return he.side === "l" ? above : !above;
+ },
+
+ endPoint: function(edge, side, site) {
+ edge.ep[side] = site;
+ if (!edge.ep[d3_voronoi_opposite[side]]) return;
+ callback(edge);
+ },
+
+ distance: function(s, t) {
+ var dx = s.x - t.x,
+ dy = s.y - t.y;
+ return Math.sqrt(dx * dx + dy * dy);
+ }
+ };
+
+ var EventQueue = {
+ list: [],
+
+ insert: function(he, site, offset) {
+ he.vertex = site;
+ he.ystar = site.y + offset;
+ for (var i=0, list=EventQueue.list, l=list.length; i<l; i++) {
+ var next = list[i];
+ if (he.ystar > next.ystar ||
+ (he.ystar == next.ystar &&
+ site.x > next.vertex.x)) {
+ continue;
+ } else {
+ break;
+ }
+ }
+ list.splice(i, 0, he);
+ },
+
+ del: function(he) {
+ for (var i=0, ls=EventQueue.list, l=ls.length; i<l && (ls[i] != he); ++i) {}
+ ls.splice(i, 1);
+ },
+
+ empty: function() { return EventQueue.list.length === 0; },
+
+ nextEvent: function(he) {
+ for (var i=0, ls=EventQueue.list, l=ls.length; i<l; ++i) {
+ if (ls[i] == he) return ls[i+1];
+ }
+ return null;
+ },
+
+ min: function() {
+ var elem = EventQueue.list[0];
+ return {
+ x: elem.vertex.x,
+ y: elem.ystar
+ };
+ },
+
+ extractMin: function() {
+ return EventQueue.list.shift();
+ }
+ };
+
+ EdgeList.init();
+ Sites.bottomSite = Sites.list.shift();
+
+ var newSite = Sites.list.shift(), newIntStar;
+ var lbnd, rbnd, llbnd, rrbnd, bisector;
+ var bot, top, temp, p, v;
+ var e, pm;
+
+ while (true) {
+ if (!EventQueue.empty()) {
+ newIntStar = EventQueue.min();
+ }
+ if (newSite && (EventQueue.empty()
+ || newSite.y < newIntStar.y
+ || (newSite.y == newIntStar.y
+ && newSite.x < newIntStar.x))) { //new site is smallest
+ lbnd = EdgeList.leftBound(newSite);
+ rbnd = EdgeList.right(lbnd);
+ bot = EdgeList.rightRegion(lbnd);
+ e = Geom.bisect(bot, newSite);
+ bisector = EdgeList.createHalfEdge(e, "l");
+ EdgeList.insert(lbnd, bisector);
+ p = Geom.intersect(lbnd, bisector);
+ if (p) {
+ EventQueue.del(lbnd);
+ EventQueue.insert(lbnd, p, Geom.distance(p, newSite));
+ }
+ lbnd = bisector;
+ bisector = EdgeList.createHalfEdge(e, "r");
+ EdgeList.insert(lbnd, bisector);
+ p = Geom.intersect(bisector, rbnd);
+ if (p) {
+ EventQueue.insert(bisector, p, Geom.distance(p, newSite));
+ }
+ newSite = Sites.list.shift();
+ } else if (!EventQueue.empty()) { //intersection is smallest
+ lbnd = EventQueue.extractMin();
+ llbnd = EdgeList.left(lbnd);
+ rbnd = EdgeList.right(lbnd);
+ rrbnd = EdgeList.right(rbnd);
+ bot = EdgeList.leftRegion(lbnd);
+ top = EdgeList.rightRegion(rbnd);
+ v = lbnd.vertex;
+ Geom.endPoint(lbnd.edge, lbnd.side, v);
+ Geom.endPoint(rbnd.edge, rbnd.side, v);
+ EdgeList.del(lbnd);
+ EventQueue.del(rbnd);
+ EdgeList.del(rbnd);
+ pm = "l";
+ if (bot.y > top.y) {
+ temp = bot;
+ bot = top;
+ top = temp;
+ pm = "r";
+ }
+ e = Geom.bisect(bot, top);
+ bisector = EdgeList.createHalfEdge(e, pm);
+ EdgeList.insert(llbnd, bisector);
+ Geom.endPoint(e, d3_voronoi_opposite[pm], v);
+ p = Geom.intersect(llbnd, bisector);
+ if (p) {
+ EventQueue.del(llbnd);
+ EventQueue.insert(llbnd, p, Geom.distance(p, bot));
+ }
+ p = Geom.intersect(bisector, rrbnd);
+ if (p) {
+ EventQueue.insert(bisector, p, Geom.distance(p, bot));
+ }
+ } else {
+ break;
+ }
+ }//end while
+
+ for (lbnd = EdgeList.right(EdgeList.leftEnd);
+ lbnd != EdgeList.rightEnd;
+ lbnd = EdgeList.right(lbnd)) {
+ callback(lbnd.edge);
+ }
+}
+/**
+* @param vertices [[x1, y1], [x2, y2], …]
+* @returns triangles [[[x1, y1], [x2, y2], [x3, y3]], …]
+ */
+d3.geom.delaunay = function(vertices) {
+ var edges = vertices.map(function() { return []; }),
+ triangles = [];
+
+ // Use the Voronoi tessellation to determine Delaunay edges.
+ d3_voronoi_tessellate(vertices, function(e) {
+ edges[e.region.l.index].push(vertices[e.region.r.index]);
+ });
+
+ // Reconnect the edges into counterclockwise triangles.
+ edges.forEach(function(edge, i) {
+ var v = vertices[i],
+ cx = v[0],
+ cy = v[1];
+ edge.forEach(function(v) {
+ v.angle = Math.atan2(v[0] - cx, v[1] - cy);
+ });
+ edge.sort(function(a, b) {
+ return a.angle - b.angle;
+ });
+ for (var j = 0, m = edge.length - 1; j < m; j++) {
+ triangles.push([v, edge[j], edge[j + 1]]);
+ }
+ });
+
+ return triangles;
+};
+// Constructs a new quadtree for the specified array of points. A quadtree is a
+// two-dimensional recursive spatial subdivision. This implementation uses
+// square partitions, dividing each square into four equally-sized squares. Each
+// point exists in a unique node; if multiple points are in the same position,
+// some points may be stored on internal nodes rather than leaf nodes. Quadtrees
+// can be used to accelerate various spatial operations, such as the Barnes-Hut
+// approximation for computing n-body forces, or collision detection.
+d3.geom.quadtree = function(points, x1, y1, x2, y2) {
+ var p,
+ i = -1,
+ n = points.length;
+
+ // Type conversion for deprecated API.
+ if (n && isNaN(points[0].x)) points = points.map(d3_geom_quadtreePoint);
+
+ // Allow bounds to be specified explicitly.
+ if (arguments.length < 5) {
+ if (arguments.length === 3) {
+ y2 = x2 = y1;
+ y1 = x1;
+ } else {
+ x1 = y1 = Infinity;
+ x2 = y2 = -Infinity;
+
+ // Compute bounds.
+ while (++i < n) {
+ p = points[i];
+ if (p.x < x1) x1 = p.x;
+ if (p.y < y1) y1 = p.y;
+ if (p.x > x2) x2 = p.x;
+ if (p.y > y2) y2 = p.y;
+ }
+
+ // Squarify the bounds.
+ var dx = x2 - x1,
+ dy = y2 - y1;
+ if (dx > dy) y2 = y1 + dx;
+ else x2 = x1 + dy;
+ }
+ }
+
+ // Recursively inserts the specified point p at the node n or one of its
+ // descendants. The bounds are defined by [x1, x2] and [y1, y2].
+ function insert(n, p, x1, y1, x2, y2) {
+ if (isNaN(p.x) || isNaN(p.y)) return; // ignore invalid points
+ if (n.leaf) {
+ var v = n.point;
+ if (v) {
+ // If the point at this leaf node is at the same position as the new
+ // point we are adding, we leave the point associated with the
+ // internal node while adding the new point to a child node. This
+ // avoids infinite recursion.
+ if ((Math.abs(v.x - p.x) + Math.abs(v.y - p.y)) < .01) {
+ insertChild(n, p, x1, y1, x2, y2);
+ } else {
+ n.point = null;
+ insertChild(n, v, x1, y1, x2, y2);
+ insertChild(n, p, x1, y1, x2, y2);
+ }
+ } else {
+ n.point = p;
+ }
+ } else {
+ insertChild(n, p, x1, y1, x2, y2);
+ }
+ }
+
+ // Recursively inserts the specified point p into a descendant of node n. The
+ // bounds are defined by [x1, x2] and [y1, y2].
+ function insertChild(n, p, x1, y1, x2, y2) {
+ // Compute the split point, and the quadrant in which to insert p.
+ var sx = (x1 + x2) * .5,
+ sy = (y1 + y2) * .5,
+ right = p.x >= sx,
+ bottom = p.y >= sy,
+ i = (bottom << 1) + right;
+
+ // Recursively insert into the child node.
+ n.leaf = false;
+ n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());
+
+ // Update the bounds as we recurse.
+ if (right) x1 = sx; else x2 = sx;
+ if (bottom) y1 = sy; else y2 = sy;
+ insert(n, p, x1, y1, x2, y2);
+ }
+
+ // Create the root node.
+ var root = d3_geom_quadtreeNode();
+
+ root.add = function(p) {
+ insert(root, p, x1, y1, x2, y2);
+ };
+
+ root.visit = function(f) {
+ d3_geom_quadtreeVisit(f, root, x1, y1, x2, y2);
+ };
+
+ // Insert all points.
+ points.forEach(root.add);
+ return root;
+};
+
+function d3_geom_quadtreeNode() {
+ return {
+ leaf: true,
+ nodes: [],
+ point: null
+ };
+}
+
+function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {
+ if (!f(node, x1, y1, x2, y2)) {
+ var sx = (x1 + x2) * .5,
+ sy = (y1 + y2) * .5,
+ children = node.nodes;
+ if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);
+ if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);
+ if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);
+ if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);
+ }
+}
+
+function d3_geom_quadtreePoint(p) {
+ return {
+ x: p[0],
+ y: p[1]
+ };
+}
+})();
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geom.min.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geom.min.js
new file mode 100644
index 0000000..2dc6395
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.geom.min.js
@@ -0,0 +1 @@
+(function(){function c(a){var b=0,c=0;for(;;){if(a(b,c))return[b,c];b===0?(b=c+1,c=0):(b-=1,c+=1)}}function d(a,b,c,d){var e,f,g,h,i,j,k;return e=d[a],f=e[0],g=e[1],e=d[b],h=e[0],i=e[1],e=d[c],j=e[0],k=e[1],(k-g)*(h-f)-(i-g)*(j-f)>0}function e(a,b,c){return(c[0]-b[0])*(a[1]-b[1])<(c[1]-b[1])*(a[0]-b[0])}function f(a,b,c,d){var e=a[0],f=b[0],g=c[0],h=d[0],i=a[1],j=b[1],k=c[1],l=d[1],m=e-g,n=f-e,o=h-g,p=i-k,q=j-i,r=l-k,s=(o*p-r*m)/(r*n-o*q);return[e+s*n,i+s*q]}function h(a,b){var c={list:a.map(function(a,b){return{index:b,x:a[0],y:a[1]}}).sort(function(a,b){return a.y<b.y?-1:a.y>b.y?1:a.x<b.x?-1:a.x>b.x?1:0}),bottomSite:null},d={list:[],leftEnd:null,rightEnd:null,init:function(){d.leftEnd=d.createHalfEdge(null,"l"),d.rightEnd=d.createHalfEdge(null,"l"),d.leftEnd.r=d.rightEnd,d.rightEnd.l=d.leftEnd,d.list.unshift(d.leftEnd,d.rightEnd)},createHalfEdge:function(a,b){return{edge:a,side:b,vertex:null,l:null,r:null}},insert:function(a,b){b.l=a,b.r=a.r,a.r.l=b,a.r=b},leftBound:function(a){var b=d.leftEnd;do b=b.r;while(b!=d.rightEnd&&e.rightOf(b,a));return b=b.l,b},del:function(a){a.l.r=a.r,a.r.l=a.l,a.edge=null},right:function(a){return a.r},left:function(a){return a.l},leftRegion:function(a){return a.edge==null?c.bottomSite:a.edge.region[a.side]},rightRegion:function(a){return a.edge==null?c.bottomSite:a.edge.region[g[a.side]]}},e={bisect:function(a,b){var c={region:{l:a,r:b},ep:{l:null,r:null}},d=b.x-a.x,e=b.y-a.y,f=d>0?d:-d,g=e>0?e:-e;return c.c=a.x*d+a.y*e+(d*d+e*e)*.5,f>g?(c.a=1,c.b=e/d,c.c/=d):(c.b=1,c.a=d/e,c.c/=e),c},intersect:function(a,b){var c=a.edge,d=b.edge;if(!c||!d||c.region.r==d.region.r)return null;var e=c.a*d.b-c.b*d.a;if(Math.abs(e)<1e-10)return null;var f=(c.c*d.b-d.c*c.b)/e,g=(d.c*c.a-c.c*d.a)/e,h=c.region.r,i=d.region.r,j,k;h.y<i.y||h.y==i.y&&h.x<i.x?(j=a,k=c):(j=b,k=d);var l=f>=k.region.r.x;return l&&j.side==="l"||!l&&j.side==="r"?null:{x:f,y:g}},rightOf:function(a,b){var c=a.edge,d=c.region.r,e=b.x>d.x;if(e&&a.side==="l")return 1;if(!e&&a.side==="r")return 0;if(c.a===1){var f=b.y-d.y,g=b.x-d.x,h=0,i=0;!e&&c.b<0||e&&c.b>=0?i=h=f>=c.b*g:(i=b.x+b.y*c.b>c.c,c.b<0&&(i=!i),i||(h=1));if(!h){var j=d.x-c.region.l.x;i=c.b*(g*g-f*f)<j*f*(1+2*g/j+c.b*c.b),c.b<0&&(i=!i)}}else{var k=c.c-c.a*b.x,l=b.y-k,m=b.x-d.x,n=k-d.y;i=l*l>m*m+n*n}return a.side==="l"?i:!i},endPoint:function(a,c,d){a.ep[c]=d;if(!a.ep[g[c]])return;b(a)},distance:function(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}},f={list:[],insert:function(a,b,c){a.vertex=b,a.ystar=b.y+c;for(var d=0,e=f.list,g=e.length;d<g;d++){var h=e[d];if(a.ystar>h.ystar||a.ystar==h.ystar&&b.x>h.vertex.x)continue;break}e.splice(d,0,a)},del:function(a){for(var b=0,c=f.list,d=c.length;b<d&&c[b]!=a;++b);c.splice(b,1)},empty:function(){return f.list.length===0},nextEvent:function(a){for(var b=0,c=f.list,d=c.length;b<d;++b)if(c[b]==a)return c[b+1];return null},min:function(){var a=f.list[0];return{x:a.vertex.x,y:a.ystar}},extractMin:function(){return f.list.shift()}};d.init(),c.bottomSite=c.list.shift();var h=c.list.shift(),i,j,k,l,m,n,o,p,q,r,s,t,u;for(;;){f.empty()||(i=f.min());if(h&&(f.empty()||h.y<i.y||h.y==i.y&&h.x<i.x))j=d.leftBound(h),k=d.right(j),o=d.rightRegion(j),t=e.bisect(o,h),n=d.createHalfEdge(t,"l"),d.insert(j,n),r=e.intersect(j,n),r&&(f.del(j),f.insert(j,r,e.distance(r,h))),j=n,n=d.createHalfEdge(t,"r"),d.insert(j,n),r=e.intersect(n,k),r&&f.insert(n,r,e.distance(r,h)),h=c.list.shift();else if(!f.empty())j=f.extractMin(),l=d.left(j),k=d.right(j),m=d.right(k),o=d.leftRegion(j),p=d.rightRegion(k),s=j.vertex,e.endPoint(j.edge,j.side,s),e.endPoint(k.edge,k.side,s),d.del(j),f.del(k),d.del(k),u="l",o.y>p.y&&(q=o,o=p,p=q,u="r"),t=e.bisect(o,p),n=d.createHalfEdge(t,u),d.insert(l,n),e.endPoint(t,g[u],s),r=e.intersect(l,n),r&&(f.del(l),f.insert(l,r,e.distance(r,o))),r=e.intersect(n,m),r&&f.insert(n,r,e.distance(r,o));else break}for(j=d.right(d.leftEnd);j!=d.rightEnd;j=d.right(j))b(j.edge)}function i(){return{leaf:!0,nodes:[],point:null}}function j(a,b,c,d,e,f){if(!a(b,c,d,e,f)){var g=(c+e)*.5,h=(d+f)*.5,i=b.nodes;i[0]&&j(a,i[0],c,d,g,h),i[1]&&j(a,i[1],g,d,e,h),i[2]&&j(a,i[2],c,h,g,f),i[3]&&j(a,i[3],g,h,e,f)}}function k(a){return{x:a[0],y:a[1]}}d3.geom={},d3.geom.contour=function(d,e){var f=e||c(d),g=[],h=f[0],i=f[1],j=0,k=0,l=NaN,m=NaN,n=0;do n=0,d(h-1,i-1)&&(n+=1),d(h,i-1)&&(n+=2),d(h-1,i)&&(n+=4),d(h,i)&&(n+=8),n===6?(j=m===-1?-1:1,k=0):n===9?(j=0,k=l===1?-1:1):(j=a[n],k=b[n]),j!=l&&k!=m&&(g.push([h,i]),l=j,m=k),h+=j,i+=k;while(f[0]!=h||f[1]!=i);return g};var a=[1,0,1,1,-1,0,-1,1,0,0,0,0,-1,0,-1,NaN],b=[0,-1,0,0,0,-1,0,0,1,-1,1,1,0,-1,0,NaN];d3.geom.hull=function(a){if(a.length<3)return[];var b=a.length,c=b-1,e=[],f=[],g,h,i=0,j,k,l,m,n,o,p,q;for(g=1;g<b;++g)a[g][1]<a[i][1]?i=g:a[g][1]==a[i][1]&&(i=a[g][0]<a[i][0]?g:i);for(g=0;g<b;++g){if(g===i)continue;k=a[g][1]-a[i][1],j=a[g][0]-a[i][0],e.push({angle:Math.atan2(k,j),index:g})}e.sort(function(a,b){return a.angle-b.angle}),p=e[0].angle,o=e[0].index,n=0;for(g=1;g<c;++g)h=e[g].index,p==e[g].angle?(j=a[o][0]-a[i][0],k=a[o][1]-a[i][1],l=a[h][0]-a[i][0],m=a[h][1]-a[i][1],j*j+k*k>=l*l+m*m?e[g].index=-1:(e[n].index=-1,p=e[g].angle,n=g,o=h)):(p=e[g].angle,n=g,o=h);f.push(i);for(g=0,h=0;g<2;++h)e[h].index!==-1&&(f.push(e[h].index),g++);q=f.length;for(;h<c;++h){if(e[h].index===-1)continue;while(!d(f[q-2],f[q-1],e[h].index,a))--q;f[q++]=e[h].index}var r=[];for(g=0;g<q;++g)r.push(a[f[g]]);return r},d3.geom.polygon=function(a){return a.area=function(){var b=0,c=a.length,d=a[c-1][0]*a[0][1],e=a[c-1][1]*a[0][0];while(++b<c)d+=a[b-1][0]*a[b][1],e+=a[b-1][1]*a[b][0];return(e-d)*.5},a.centroid=function(b){var c=-1,d=a.length-1,e=0,f=0,g,h,i;arguments.length||(b=-1/(6*a.area()));while(++c<d)g=a[c],h=a[c+1],i=g[0]*h[1]-h[0]*g[1],e+=(g[0]+h[0])*i,f+=(g[1]+h[1])*i;return[e*b,f*b]},a.clip=function(b){var c,d=-1,g=a.length,h,i,j=a[g-1],k,l,m;while(++d<g){c=b.slice(),b.length=0,k=a[d],l=c[(i=c.length)-1],h=-1;while(++h<i)m=c[h],e(m,j,k)?(e(l,j,k)||b.push(f(l,m,j,k)),b.push(m)):e(l,j,k)&&b.push(f(l,m,j,k)),l=m;j=k}return b},a},d3.geom.voronoi=function(a){var b=a.map(function(){return[]});return h(a,function(a){var c,d,e,f,g,h;a.a===1&&a.b>=0?(c=a.ep.r,d=a.ep.l):(c=a.ep.l,d=a.ep.r),a.a===1?(g=c?c.y:-1e6,e=a.c-a.b*g,h=d?d.y:1e6,f=a.c-a.b*h):(e=c?c.x:-1e6,g=a.c-a.a*e,f=d?d.x:1e6,h=a.c-a.a*f);var i=[e,g],j=[f,h];b[a.region.l.index].push(i,j),b[a.region.r.index].push(i,j)}),b.map(function(b,c){var d=a[c][0],e=a[c][1];return b.forEach(function(a){a.angle=Math.atan2(a[0]-d,a[1]-e)}),b.sort(function(a,b){return a.angle-b.angle}).filter(function(a,c){return!c||a.angle-b[c-1].angle>1e-10})})};var g={l:"r",r:"l"};d3.geom.delaunay=function(a){var b=a.map(function(){return[]}),c=[];return h(a,function(c){b[c.region.l.index].push(a[c.region.r.index])}),b.forEach(function(b,d){var e=a[d],f=e[0],g=e[1];b.forEach(function(a){a.angle=Math.atan2(a[0]-f,a[1]-g)}),b.sort(function(a,b){return a.angle-b.angle});for(var h=0,i=b.length-1;h<i;h++)c.push([e,b[h],b[h+1]])}),c},d3.geom.quadtree=function(a,b,c,d,e){function n(a,b,c,d,e,f){if(isNaN(b.x)||isNaN(b.y))return;if(a.leaf){var g=a.point;g?Math.abs(g.x-b.x)+Math.abs(g.y-b.y)<.01?o(a,b,c,d,e,f):(a.point=null,o(a,g,c,d,e,f),o(a,b,c,d,e,f)):a.point=b}else o(a,b,c,d,e,f)}function o(a,b,c,d,e,f){var g=(c+e)*.5,h=(d+f)*.5,j=b.x>=g,k=b.y>=h,l=(k<<1)+j;a.leaf=!1,a=a.nodes[l]||(a.nodes[l]=i()),j?c=g:e=g,k?d=h:f=h,n(a,b,c,d,e,f)}var f,g=-1,h=a.length;h&&isNaN(a[0].x)&&(a=a.map(k));if(arguments.length<5)if(arguments.length===3)e=d=c,c=b;else{b=c=Infinity,d=e=-Infinity;while(++g<h)f=a[g],f.x<b&&(b=f.x),f.y<c&&(c=f.y),f.x>d&&(d=f.x),f.y>e&&(e=f.y);var l=d-b,m=e-c;l>m?e=c+l:d=b+m}var p=i();return p.add=function(a){n(p,a,b,c,d,e)},p.visit=function(a){j(a,p,b,c,d,e)},a.forEach(p.add),p}})(); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.js
new file mode 100644
index 0000000..e59d614
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.js
@@ -0,0 +1,4690 @@
+(function(){if (!Date.now) Date.now = function() {
+ return +new Date;
+};
+try {
+ document.createElement("div").style.setProperty("opacity", 0, "");
+} catch (error) {
+ var d3_style_prototype = CSSStyleDeclaration.prototype,
+ d3_style_setProperty = d3_style_prototype.setProperty;
+ d3_style_prototype.setProperty = function(name, value, priority) {
+ d3_style_setProperty.call(this, name, value + "", priority);
+ };
+}
+d3 = {version: "2.7.0"}; // semver
+var d3_array = d3_arraySlice; // conversion for NodeLists
+
+function d3_arrayCopy(pseudoarray) {
+ var i = -1, n = pseudoarray.length, array = [];
+ while (++i < n) array.push(pseudoarray[i]);
+ return array;
+}
+
+function d3_arraySlice(pseudoarray) {
+ return Array.prototype.slice.call(pseudoarray);
+}
+
+try {
+ d3_array(document.documentElement.childNodes)[0].nodeType;
+} catch(e) {
+ d3_array = d3_arrayCopy;
+}
+
+var d3_arraySubclass = [].__proto__?
+
+// Until ECMAScript supports array subclassing, prototype injection works well.
+function(array, prototype) {
+ array.__proto__ = prototype;
+}:
+
+// And if your browser doesn't support __proto__, we'll use direct extension.
+function(array, prototype) {
+ for (var property in prototype) array[property] = prototype[property];
+};
+function d3_this() {
+ return this;
+}
+d3.functor = function(v) {
+ return typeof v === "function" ? v : function() { return v; };
+};
+// Copies a variable number of methods from source to target.
+d3.rebind = function(target, source) {
+ var i = 1, n = arguments.length, method;
+ while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
+ return target;
+};
+
+// Method is assumed to be a standard D3 getter-setter:
+// If passed with no arguments, gets the value.
+// If passed with arguments, sets the value and returns the target.
+function d3_rebind(target, source, method) {
+ return function() {
+ var value = method.apply(source, arguments);
+ return arguments.length ? target : value;
+ };
+}
+d3.ascending = function(a, b) {
+ return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+};
+d3.descending = function(a, b) {
+ return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
+};
+d3.mean = function(array, f) {
+ var n = array.length,
+ a,
+ m = 0,
+ i = -1,
+ j = 0;
+ if (arguments.length === 1) {
+ while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j;
+ } else {
+ while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j;
+ }
+ return j ? m : undefined;
+};
+d3.median = function(array, f) {
+ if (arguments.length > 1) array = array.map(f);
+ array = array.filter(d3_number);
+ return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined;
+};
+d3.min = function(array, f) {
+ var i = -1,
+ n = array.length,
+ a,
+ b;
+ if (arguments.length === 1) {
+ while (++i < n && ((a = array[i]) == null || a != a)) a = undefined;
+ while (++i < n) if ((b = array[i]) != null && a > b) a = b;
+ } else {
+ while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined;
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
+ }
+ return a;
+};
+d3.max = function(array, f) {
+ var i = -1,
+ n = array.length,
+ a,
+ b;
+ if (arguments.length === 1) {
+ while (++i < n && ((a = array[i]) == null || a != a)) a = undefined;
+ while (++i < n) if ((b = array[i]) != null && b > a) a = b;
+ } else {
+ while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined;
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
+ }
+ return a;
+};
+d3.extent = function(array, f) {
+ var i = -1,
+ n = array.length,
+ a,
+ b,
+ c;
+ if (arguments.length === 1) {
+ while (++i < n && ((a = c = array[i]) == null || a != a)) a = c = undefined;
+ while (++i < n) if ((b = array[i]) != null) {
+ if (a > b) a = b;
+ if (c < b) c = b;
+ }
+ } else {
+ while (++i < n && ((a = c = f.call(array, array[i], i)) == null || a != a)) a = undefined;
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null) {
+ if (a > b) a = b;
+ if (c < b) c = b;
+ }
+ }
+ return [a, c];
+};
+d3.random = {
+ normal: function(mean, deviation) {
+ if (arguments.length < 2) deviation = 1;
+ if (arguments.length < 1) mean = 0;
+ return function() {
+ var x, y, r;
+ do {
+ x = Math.random() * 2 - 1;
+ y = Math.random() * 2 - 1;
+ r = x * x + y * y;
+ } while (!r || r > 1);
+ return mean + deviation * x * Math.sqrt(-2 * Math.log(r) / r);
+ };
+ }
+};
+function d3_number(x) {
+ return x != null && !isNaN(x);
+}
+d3.sum = function(array, f) {
+ var s = 0,
+ n = array.length,
+ a,
+ i = -1;
+
+ if (arguments.length === 1) {
+ while (++i < n) if (!isNaN(a = +array[i])) s += a;
+ } else {
+ while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a;
+ }
+
+ return s;
+};
+// R-7 per <http://en.wikipedia.org/wiki/Quantile>
+d3.quantile = function(values, p) {
+ var H = (values.length - 1) * p + 1,
+ h = Math.floor(H),
+ v = values[h - 1],
+ e = H - h;
+ return e ? v + e * (values[h] - v) : v;
+};
+d3.transpose = function(matrix) {
+ return d3.zip.apply(d3, matrix);
+};
+d3.zip = function() {
+ if (!(n = arguments.length)) return [];
+ for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) {
+ for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) {
+ zip[j] = arguments[j][i];
+ }
+ }
+ return zips;
+};
+
+function d3_zipLength(d) {
+ return d.length;
+}
+// Locate the insertion point for x in a to maintain sorted order. The
+// arguments lo and hi may be used to specify a subset of the array which should
+// be considered; by default the entire array is used. If x is already present
+// in a, the insertion point will be before (to the left of) any existing
+// entries. The return value is suitable for use as the first argument to
+// `array.splice` assuming that a is already sorted.
+//
+// The returned insertion point i partitions the array a into two halves so that
+// all v < x for v in a[lo:i] for the left side and all v >= x for v in a[i:hi]
+// for the right side.
+d3.bisectLeft = function(a, x, lo, hi) {
+ if (arguments.length < 3) lo = 0;
+ if (arguments.length < 4) hi = a.length;
+ while (lo < hi) {
+ var mid = (lo + hi) >> 1;
+ if (a[mid] < x) lo = mid + 1;
+ else hi = mid;
+ }
+ return lo;
+};
+
+// Similar to bisectLeft, but returns an insertion point which comes after (to
+// the right of) any existing entries of x in a.
+//
+// The returned insertion point i partitions the array into two halves so that
+// all v <= x for v in a[lo:i] for the left side and all v > x for v in a[i:hi]
+// for the right side.
+d3.bisect =
+d3.bisectRight = function(a, x, lo, hi) {
+ if (arguments.length < 3) lo = 0;
+ if (arguments.length < 4) hi = a.length;
+ while (lo < hi) {
+ var mid = (lo + hi) >> 1;
+ if (x < a[mid]) hi = mid;
+ else lo = mid + 1;
+ }
+ return lo;
+};
+d3.first = function(array, f) {
+ var i = 0,
+ n = array.length,
+ a = array[0],
+ b;
+ if (arguments.length === 1) f = d3.ascending;
+ while (++i < n) {
+ if (f.call(array, a, b = array[i]) > 0) {
+ a = b;
+ }
+ }
+ return a;
+};
+d3.last = function(array, f) {
+ var i = 0,
+ n = array.length,
+ a = array[0],
+ b;
+ if (arguments.length === 1) f = d3.ascending;
+ while (++i < n) {
+ if (f.call(array, a, b = array[i]) <= 0) {
+ a = b;
+ }
+ }
+ return a;
+};
+d3.nest = function() {
+ var nest = {},
+ keys = [],
+ sortKeys = [],
+ sortValues,
+ rollup;
+
+ function map(array, depth) {
+ if (depth >= keys.length) return rollup
+ ? rollup.call(nest, array) : (sortValues
+ ? array.sort(sortValues)
+ : array);
+
+ var i = -1,
+ n = array.length,
+ key = keys[depth++],
+ keyValue,
+ object,
+ o = {};
+
+ while (++i < n) {
+ if ((keyValue = key(object = array[i])) in o) {
+ o[keyValue].push(object);
+ } else {
+ o[keyValue] = [object];
+ }
+ }
+
+ for (keyValue in o) {
+ o[keyValue] = map(o[keyValue], depth);
+ }
+
+ return o;
+ }
+
+ function entries(map, depth) {
+ if (depth >= keys.length) return map;
+
+ var a = [],
+ sortKey = sortKeys[depth++],
+ key;
+
+ for (key in map) {
+ a.push({key: key, values: entries(map[key], depth)});
+ }
+
+ if (sortKey) a.sort(function(a, b) {
+ return sortKey(a.key, b.key);
+ });
+
+ return a;
+ }
+
+ nest.map = function(array) {
+ return map(array, 0);
+ };
+
+ nest.entries = function(array) {
+ return entries(map(array, 0), 0);
+ };
+
+ nest.key = function(d) {
+ keys.push(d);
+ return nest;
+ };
+
+ // Specifies the order for the most-recently specified key.
+ // Note: only applies to entries. Map keys are unordered!
+ nest.sortKeys = function(order) {
+ sortKeys[keys.length - 1] = order;
+ return nest;
+ };
+
+ // Specifies the order for leaf values.
+ // Applies to both maps and entries array.
+ nest.sortValues = function(order) {
+ sortValues = order;
+ return nest;
+ };
+
+ nest.rollup = function(f) {
+ rollup = f;
+ return nest;
+ };
+
+ return nest;
+};
+d3.keys = function(map) {
+ var keys = [];
+ for (var key in map) keys.push(key);
+ return keys;
+};
+d3.values = function(map) {
+ var values = [];
+ for (var key in map) values.push(map[key]);
+ return values;
+};
+d3.entries = function(map) {
+ var entries = [];
+ for (var key in map) entries.push({key: key, value: map[key]});
+ return entries;
+};
+d3.permute = function(array, indexes) {
+ var permutes = [],
+ i = -1,
+ n = indexes.length;
+ while (++i < n) permutes[i] = array[indexes[i]];
+ return permutes;
+};
+d3.merge = function(arrays) {
+ return Array.prototype.concat.apply([], arrays);
+};
+d3.split = function(array, f) {
+ var arrays = [],
+ values = [],
+ value,
+ i = -1,
+ n = array.length;
+ if (arguments.length < 2) f = d3_splitter;
+ while (++i < n) {
+ if (f.call(values, value = array[i], i)) {
+ values = [];
+ } else {
+ if (!values.length) arrays.push(values);
+ values.push(value);
+ }
+ }
+ return arrays;
+};
+
+function d3_splitter(d) {
+ return d == null;
+}
+function d3_collapse(s) {
+ return s.replace(/(^\s+)|(\s+$)/g, "").replace(/\s+/g, " ");
+}
+/**
+ * @param {number} start
+ * @param {number=} stop
+ * @param {number=} step
+ */
+d3.range = function(start, stop, step) {
+ if (arguments.length < 3) {
+ step = 1;
+ if (arguments.length < 2) {
+ stop = start;
+ start = 0;
+ }
+ }
+ if ((stop - start) / step == Infinity) throw new Error("infinite range");
+ var range = [],
+ i = -1,
+ j;
+ if (step < 0) while ((j = start + step * ++i) > stop) range.push(j);
+ else while ((j = start + step * ++i) < stop) range.push(j);
+ return range;
+};
+d3.requote = function(s) {
+ return s.replace(d3_requote_re, "\\$&");
+};
+
+var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
+d3.round = function(x, n) {
+ return n
+ ? Math.round(x * Math.pow(10, n)) * Math.pow(10, -n)
+ : Math.round(x);
+};
+d3.xhr = function(url, mime, callback) {
+ var req = new XMLHttpRequest;
+ if (arguments.length < 3) callback = mime;
+ else if (mime && req.overrideMimeType) req.overrideMimeType(mime);
+ req.open("GET", url, true);
+ req.onreadystatechange = function() {
+ if (req.readyState === 4) callback(req.status < 300 ? req : null);
+ };
+ req.send(null);
+};
+d3.text = function(url, mime, callback) {
+ function ready(req) {
+ callback(req && req.responseText);
+ }
+ if (arguments.length < 3) {
+ callback = mime;
+ mime = null;
+ }
+ d3.xhr(url, mime, ready);
+};
+d3.json = function(url, callback) {
+ d3.text(url, "application/json", function(text) {
+ callback(text ? JSON.parse(text) : null);
+ });
+};
+d3.html = function(url, callback) {
+ d3.text(url, "text/html", function(text) {
+ if (text != null) { // Treat empty string as valid HTML.
+ var range = document.createRange();
+ range.selectNode(document.body);
+ text = range.createContextualFragment(text);
+ }
+ callback(text);
+ });
+};
+d3.xml = function(url, mime, callback) {
+ function ready(req) {
+ callback(req && req.responseXML);
+ }
+ if (arguments.length < 3) {
+ callback = mime;
+ mime = null;
+ }
+ d3.xhr(url, mime, ready);
+};
+var d3_nsPrefix = {
+ svg: "http://www.w3.org/2000/svg",
+ xhtml: "http://www.w3.org/1999/xhtml",
+ xlink: "http://www.w3.org/1999/xlink",
+ xml: "http://www.w3.org/XML/1998/namespace",
+ xmlns: "http://www.w3.org/2000/xmlns/"
+};
+
+d3.ns = {
+ prefix: d3_nsPrefix,
+ qualify: function(name) {
+ var i = name.indexOf(":");
+ return i < 0 ? (name in d3_nsPrefix
+ ? {space: d3_nsPrefix[name], local: name} : name)
+ : {space: d3_nsPrefix[name.substring(0, i)], local: name.substring(i + 1)};
+ }
+};
+d3.dispatch = function() {
+ var dispatch = new d3_dispatch(),
+ i = -1,
+ n = arguments.length;
+ while (++i < n) dispatch[arguments[i]] = d3_dispatch_event();
+ return dispatch;
+};
+
+function d3_dispatch() {}
+
+d3_dispatch.prototype.on = function(type, listener) {
+ var i = type.indexOf("."),
+ name = "";
+
+ // Extract optional namespace, e.g., "click.foo"
+ if (i > 0) {
+ name = type.substring(i + 1);
+ type = type.substring(0, i);
+ }
+
+ return arguments.length < 2
+ ? this[type].on(name)
+ : (this[type].on(name, listener), this);
+};
+
+function d3_dispatch_event() {
+ var listeners = [],
+ listenerByName = {};
+
+ function dispatch() {
+ var z = listeners, // defensive reference
+ i = -1,
+ n = z.length,
+ l;
+ while (++i < n) if (l = z[i].on) l.apply(this, arguments);
+ }
+
+ dispatch.on = function(name, listener) {
+ var l, i;
+
+ // return the current listener, if any
+ if (arguments.length < 2) return (l = listenerByName[name]) && l.on;
+
+ // remove the old listener, if any (with copy-on-write)
+ if (l = listenerByName[name]) {
+ l.on = null;
+ listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));
+ delete listenerByName[name];
+ }
+
+ // add the new listener, if any
+ if (listener) {
+ listeners.push(listenerByName[name] = {on: listener});
+ }
+
+ return dispatch;
+ };
+
+ return dispatch;
+};
+// TODO align
+d3.format = function(specifier) {
+ var match = d3_format_re.exec(specifier),
+ fill = match[1] || " ",
+ sign = match[3] || "",
+ zfill = match[5],
+ width = +match[6],
+ comma = match[7],
+ precision = match[8],
+ type = match[9],
+ scale = 1,
+ suffix = "",
+ integer = false;
+
+ if (precision) precision = +precision.substring(1);
+
+ if (zfill) {
+ fill = "0"; // TODO align = "=";
+ if (comma) width -= Math.floor((width - 1) / 4);
+ }
+
+ switch (type) {
+ case "n": comma = true; type = "g"; break;
+ case "%": scale = 100; suffix = "%"; type = "f"; break;
+ case "p": scale = 100; suffix = "%"; type = "r"; break;
+ case "d": integer = true; precision = 0; break;
+ case "s": scale = -1; type = "r"; break;
+ }
+
+ // If no precision is specified for r, fallback to general notation.
+ if (type == "r" && !precision) type = "g";
+
+ type = d3_format_types[type] || d3_format_typeDefault;
+
+ return function(value) {
+
+ // Return the empty string for floats formatted as ints.
+ if (integer && (value % 1)) return "";
+
+ // Convert negative to positive, and record the sign prefix.
+ var negative = (value < 0) && (value = -value) ? "\u2212" : sign;
+
+ // Apply the scale, computing it from the value's exponent for si format.
+ if (scale < 0) {
+ var prefix = d3.formatPrefix(value, precision);
+ value *= prefix.scale;
+ suffix = prefix.symbol;
+ } else {
+ value *= scale;
+ }
+
+ // Convert to the desired precision.
+ value = type(value, precision);
+
+ // If the fill character is 0, the sign and group is applied after the fill.
+ if (zfill) {
+ var length = value.length + negative.length;
+ if (length < width) value = new Array(width - length + 1).join(fill) + value;
+ if (comma) value = d3_format_group(value);
+ value = negative + value;
+ }
+
+ // Otherwise (e.g., space-filling), the sign and group is applied before.
+ else {
+ if (comma) value = d3_format_group(value);
+ value = negative + value;
+ var length = value.length;
+ if (length < width) value = new Array(width - length + 1).join(fill) + value;
+ }
+
+ return value + suffix;
+ };
+};
+
+// [[fill]align][sign][#][0][width][,][.precision][type]
+var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/;
+
+var d3_format_types = {
+ g: function(x, p) { return x.toPrecision(p); },
+ e: function(x, p) { return x.toExponential(p); },
+ f: function(x, p) { return x.toFixed(p); },
+ r: function(x, p) { return d3.round(x, p = d3_format_precision(x, p)).toFixed(Math.max(0, Math.min(20, p))); }
+};
+
+function d3_format_precision(x, p) {
+ return p - (x ? 1 + Math.floor(Math.log(x + Math.pow(10, 1 + Math.floor(Math.log(x) / Math.LN10) - p)) / Math.LN10) : 1);
+}
+
+function d3_format_typeDefault(x) {
+ return x + "";
+}
+
+// Apply comma grouping for thousands.
+function d3_format_group(value) {
+ var i = value.lastIndexOf("."),
+ f = i >= 0 ? value.substring(i) : (i = value.length, ""),
+ t = [];
+ while (i > 0) t.push(value.substring(i -= 3, i + 3));
+ return t.reverse().join(",") + f;
+}
+var d3_formatPrefixes = ["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(d3_formatPrefix);
+
+d3.formatPrefix = function(value, precision) {
+ var i = 0;
+ if (value) {
+ if (value < 0) value *= -1;
+ if (precision) value = d3.round(value, d3_format_precision(value, precision));
+ i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);
+ i = Math.max(-24, Math.min(24, Math.floor((i <= 0 ? i + 1 : i - 1) / 3) * 3));
+ }
+ return d3_formatPrefixes[8 + i / 3];
+};
+
+function d3_formatPrefix(d, i) {
+ return {
+ scale: Math.pow(10, (8 - i) * 3),
+ symbol: d
+ };
+}
+
+/*
+ * TERMS OF USE - EASING EQUATIONS
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2001 Robert Penner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * - Neither the name of the author nor the names of contributors may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+var d3_ease_quad = d3_ease_poly(2),
+ d3_ease_cubic = d3_ease_poly(3);
+
+var d3_ease = {
+ linear: function() { return d3_ease_linear; },
+ poly: d3_ease_poly,
+ quad: function() { return d3_ease_quad; },
+ cubic: function() { return d3_ease_cubic; },
+ sin: function() { return d3_ease_sin; },
+ exp: function() { return d3_ease_exp; },
+ circle: function() { return d3_ease_circle; },
+ elastic: d3_ease_elastic,
+ back: d3_ease_back,
+ bounce: function() { return d3_ease_bounce; }
+};
+
+var d3_ease_mode = {
+ "in": function(f) { return f; },
+ "out": d3_ease_reverse,
+ "in-out": d3_ease_reflect,
+ "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); }
+};
+
+d3.ease = function(name) {
+ var i = name.indexOf("-"),
+ t = i >= 0 ? name.substring(0, i) : name,
+ m = i >= 0 ? name.substring(i + 1) : "in";
+ return d3_ease_clamp(d3_ease_mode[m](d3_ease[t].apply(null, Array.prototype.slice.call(arguments, 1))));
+};
+
+function d3_ease_clamp(f) {
+ return function(t) {
+ return t <= 0 ? 0 : t >= 1 ? 1 : f(t);
+ };
+}
+
+function d3_ease_reverse(f) {
+ return function(t) {
+ return 1 - f(1 - t);
+ };
+}
+
+function d3_ease_reflect(f) {
+ return function(t) {
+ return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t)));
+ };
+}
+
+function d3_ease_linear(t) {
+ return t;
+}
+
+function d3_ease_poly(e) {
+ return function(t) {
+ return Math.pow(t, e);
+ }
+}
+
+function d3_ease_sin(t) {
+ return 1 - Math.cos(t * Math.PI / 2);
+}
+
+function d3_ease_exp(t) {
+ return Math.pow(2, 10 * (t - 1));
+}
+
+function d3_ease_circle(t) {
+ return 1 - Math.sqrt(1 - t * t);
+}
+
+function d3_ease_elastic(a, p) {
+ var s;
+ if (arguments.length < 2) p = 0.45;
+ if (arguments.length < 1) { a = 1; s = p / 4; }
+ else s = p / (2 * Math.PI) * Math.asin(1 / a);
+ return function(t) {
+ return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * Math.PI / p);
+ };
+}
+
+function d3_ease_back(s) {
+ if (!s) s = 1.70158;
+ return function(t) {
+ return t * t * ((s + 1) * t - s);
+ };
+}
+
+function d3_ease_bounce(t) {
+ return t < 1 / 2.75 ? 7.5625 * t * t
+ : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75
+ : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375
+ : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
+}
+d3.event = null;
+
+function d3_eventCancel() {
+ d3.event.stopPropagation();
+ d3.event.preventDefault();
+}
+d3.interpolate = function(a, b) {
+ var i = d3.interpolators.length, f;
+ while (--i >= 0 && !(f = d3.interpolators[i](a, b)));
+ return f;
+};
+
+d3.interpolateNumber = function(a, b) {
+ b -= a;
+ return function(t) { return a + b * t; };
+};
+
+d3.interpolateRound = function(a, b) {
+ b -= a;
+ return function(t) { return Math.round(a + b * t); };
+};
+
+d3.interpolateString = function(a, b) {
+ var m, // current match
+ i, // current index
+ j, // current index (for coallescing)
+ s0 = 0, // start index of current string prefix
+ s1 = 0, // end index of current string prefix
+ s = [], // string constants and placeholders
+ q = [], // number interpolators
+ n, // q.length
+ o;
+
+ // Reset our regular expression!
+ d3_interpolate_number.lastIndex = 0;
+
+ // Find all numbers in b.
+ for (i = 0; m = d3_interpolate_number.exec(b); ++i) {
+ if (m.index) s.push(b.substring(s0, s1 = m.index));
+ q.push({i: s.length, x: m[0]});
+ s.push(null);
+ s0 = d3_interpolate_number.lastIndex;
+ }
+ if (s0 < b.length) s.push(b.substring(s0));
+
+ // Find all numbers in a.
+ for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) {
+ o = q[i];
+ if (o.x == m[0]) { // The numbers match, so coallesce.
+ if (o.i) {
+ if (s[o.i + 1] == null) { // This match is followed by another number.
+ s[o.i - 1] += o.x;
+ s.splice(o.i, 1);
+ for (j = i + 1; j < n; ++j) q[j].i--;
+ } else { // This match is followed by a string, so coallesce twice.
+ s[o.i - 1] += o.x + s[o.i + 1];
+ s.splice(o.i, 2);
+ for (j = i + 1; j < n; ++j) q[j].i -= 2;
+ }
+ } else {
+ if (s[o.i + 1] == null) { // This match is followed by another number.
+ s[o.i] = o.x;
+ } else { // This match is followed by a string, so coallesce twice.
+ s[o.i] = o.x + s[o.i + 1];
+ s.splice(o.i + 1, 1);
+ for (j = i + 1; j < n; ++j) q[j].i--;
+ }
+ }
+ q.splice(i, 1);
+ n--;
+ i--;
+ } else {
+ o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x));
+ }
+ }
+
+ // Remove any numbers in b not found in a.
+ while (i < n) {
+ o = q.pop();
+ if (s[o.i + 1] == null) { // This match is followed by another number.
+ s[o.i] = o.x;
+ } else { // This match is followed by a string, so coallesce twice.
+ s[o.i] = o.x + s[o.i + 1];
+ s.splice(o.i + 1, 1);
+ }
+ n--;
+ }
+
+ // Special optimization for only a single match.
+ if (s.length === 1) {
+ return s[0] == null ? q[0].x : function() { return b; };
+ }
+
+ // Otherwise, interpolate each of the numbers and rejoin the string.
+ return function(t) {
+ for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t);
+ return s.join("");
+ };
+};
+
+d3.interpolateTransform = function(a, b) {
+ return d3.interpolateString(d3.transform(a) + "", d3.transform(b) + "");
+};
+
+d3.interpolateRgb = function(a, b) {
+ a = d3.rgb(a);
+ b = d3.rgb(b);
+ var ar = a.r,
+ ag = a.g,
+ ab = a.b,
+ br = b.r - ar,
+ bg = b.g - ag,
+ bb = b.b - ab;
+ return function(t) {
+ return "#"
+ + d3_rgb_hex(Math.round(ar + br * t))
+ + d3_rgb_hex(Math.round(ag + bg * t))
+ + d3_rgb_hex(Math.round(ab + bb * t));
+ };
+};
+
+// interpolates HSL space, but outputs RGB string (for compatibility)
+d3.interpolateHsl = function(a, b) {
+ a = d3.hsl(a);
+ b = d3.hsl(b);
+ var h0 = a.h,
+ s0 = a.s,
+ l0 = a.l,
+ h1 = b.h - h0,
+ s1 = b.s - s0,
+ l1 = b.l - l0;
+ return function(t) {
+ return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString();
+ };
+};
+
+d3.interpolateArray = function(a, b) {
+ var x = [],
+ c = [],
+ na = a.length,
+ nb = b.length,
+ n0 = Math.min(a.length, b.length),
+ i;
+ for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i]));
+ for (; i < na; ++i) c[i] = a[i];
+ for (; i < nb; ++i) c[i] = b[i];
+ return function(t) {
+ for (i = 0; i < n0; ++i) c[i] = x[i](t);
+ return c;
+ };
+};
+
+d3.interpolateObject = function(a, b) {
+ var i = {},
+ c = {},
+ k;
+ for (k in a) {
+ if (k in b) {
+ i[k] = d3_interpolateByName(k)(a[k], b[k]);
+ } else {
+ c[k] = a[k];
+ }
+ }
+ for (k in b) {
+ if (!(k in a)) {
+ c[k] = b[k];
+ }
+ }
+ return function(t) {
+ for (k in i) c[k] = i[k](t);
+ return c;
+ };
+}
+
+var d3_interpolate_number = /[-+]?(?:\d*\.?\d+)(?:[eE][-+]?\d+)?/g;
+
+function d3_interpolateByName(n) {
+ return n == "transform"
+ ? d3.interpolateTransform
+ : d3.interpolate;
+}
+
+d3.interpolators = [
+ d3.interpolateObject,
+ function(a, b) { return (b instanceof Array) && d3.interpolateArray(a, b); },
+ function(a, b) { return (typeof a === "string" || typeof b === "string") && d3.interpolateString(a + "", b + ""); },
+ function(a, b) { return (typeof b === "string" ? b in d3_rgb_names || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Rgb || b instanceof d3_Hsl) && d3.interpolateRgb(a, b); },
+ function(a, b) { return !isNaN(a = +a) && !isNaN(b = +b) && d3.interpolateNumber(a, b); }
+];
+function d3_uninterpolateNumber(a, b) {
+ b = b - (a = +a) ? 1 / (b - a) : 0;
+ return function(x) { return (x - a) * b; };
+}
+
+function d3_uninterpolateClamp(a, b) {
+ b = b - (a = +a) ? 1 / (b - a) : 0;
+ return function(x) { return Math.max(0, Math.min(1, (x - a) * b)); };
+}
+d3.rgb = function(r, g, b) {
+ return arguments.length === 1
+ ? (r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b)
+ : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb))
+ : d3_rgb(~~r, ~~g, ~~b);
+};
+
+function d3_rgb(r, g, b) {
+ return new d3_Rgb(r, g, b);
+}
+
+function d3_Rgb(r, g, b) {
+ this.r = r;
+ this.g = g;
+ this.b = b;
+}
+
+d3_Rgb.prototype.brighter = function(k) {
+ k = Math.pow(0.7, arguments.length ? k : 1);
+ var r = this.r,
+ g = this.g,
+ b = this.b,
+ i = 30;
+ if (!r && !g && !b) return d3_rgb(i, i, i);
+ if (r && r < i) r = i;
+ if (g && g < i) g = i;
+ if (b && b < i) b = i;
+ return d3_rgb(
+ Math.min(255, Math.floor(r / k)),
+ Math.min(255, Math.floor(g / k)),
+ Math.min(255, Math.floor(b / k)));
+};
+
+d3_Rgb.prototype.darker = function(k) {
+ k = Math.pow(0.7, arguments.length ? k : 1);
+ return d3_rgb(
+ Math.floor(k * this.r),
+ Math.floor(k * this.g),
+ Math.floor(k * this.b));
+};
+
+d3_Rgb.prototype.hsl = function() {
+ return d3_rgb_hsl(this.r, this.g, this.b);
+};
+
+d3_Rgb.prototype.toString = function() {
+ return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
+};
+
+function d3_rgb_hex(v) {
+ return v < 0x10
+ ? "0" + Math.max(0, v).toString(16)
+ : Math.min(255, v).toString(16);
+}
+
+function d3_rgb_parse(format, rgb, hsl) {
+ var r = 0, // red channel; int in [0, 255]
+ g = 0, // green channel; int in [0, 255]
+ b = 0, // blue channel; int in [0, 255]
+ m1, // CSS color specification match
+ m2, // CSS color specification type (e.g., rgb)
+ name;
+
+ /* Handle hsl, rgb. */
+ m1 = /([a-z]+)\((.*)\)/i.exec(format);
+ if (m1) {
+ m2 = m1[2].split(",");
+ switch (m1[1]) {
+ case "hsl": {
+ return hsl(
+ parseFloat(m2[0]), // degrees
+ parseFloat(m2[1]) / 100, // percentage
+ parseFloat(m2[2]) / 100 // percentage
+ );
+ }
+ case "rgb": {
+ return rgb(
+ d3_rgb_parseNumber(m2[0]),
+ d3_rgb_parseNumber(m2[1]),
+ d3_rgb_parseNumber(m2[2])
+ );
+ }
+ }
+ }
+
+ /* Named colors. */
+ if (name = d3_rgb_names[format]) return rgb(name.r, name.g, name.b);
+
+ /* Hexadecimal colors: #rgb and #rrggbb. */
+ if (format != null && format.charAt(0) === "#") {
+ if (format.length === 4) {
+ r = format.charAt(1); r += r;
+ g = format.charAt(2); g += g;
+ b = format.charAt(3); b += b;
+ } else if (format.length === 7) {
+ r = format.substring(1, 3);
+ g = format.substring(3, 5);
+ b = format.substring(5, 7);
+ }
+ r = parseInt(r, 16);
+ g = parseInt(g, 16);
+ b = parseInt(b, 16);
+ }
+
+ return rgb(r, g, b);
+}
+
+function d3_rgb_hsl(r, g, b) {
+ var min = Math.min(r /= 255, g /= 255, b /= 255),
+ max = Math.max(r, g, b),
+ d = max - min,
+ h,
+ s,
+ l = (max + min) / 2;
+ if (d) {
+ s = l < .5 ? d / (max + min) : d / (2 - max - min);
+ if (r == max) h = (g - b) / d + (g < b ? 6 : 0);
+ else if (g == max) h = (b - r) / d + 2;
+ else h = (r - g) / d + 4;
+ h *= 60;
+ } else {
+ s = h = 0;
+ }
+ return d3_hsl(h, s, l);
+}
+
+function d3_rgb_parseNumber(c) { // either integer or percentage
+ var f = parseFloat(c);
+ return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
+}
+
+var d3_rgb_names = {
+ aliceblue: "#f0f8ff",
+ antiquewhite: "#faebd7",
+ aqua: "#00ffff",
+ aquamarine: "#7fffd4",
+ azure: "#f0ffff",
+ beige: "#f5f5dc",
+ bisque: "#ffe4c4",
+ black: "#000000",
+ blanchedalmond: "#ffebcd",
+ blue: "#0000ff",
+ blueviolet: "#8a2be2",
+ brown: "#a52a2a",
+ burlywood: "#deb887",
+ cadetblue: "#5f9ea0",
+ chartreuse: "#7fff00",
+ chocolate: "#d2691e",
+ coral: "#ff7f50",
+ cornflowerblue: "#6495ed",
+ cornsilk: "#fff8dc",
+ crimson: "#dc143c",
+ cyan: "#00ffff",
+ darkblue: "#00008b",
+ darkcyan: "#008b8b",
+ darkgoldenrod: "#b8860b",
+ darkgray: "#a9a9a9",
+ darkgreen: "#006400",
+ darkgrey: "#a9a9a9",
+ darkkhaki: "#bdb76b",
+ darkmagenta: "#8b008b",
+ darkolivegreen: "#556b2f",
+ darkorange: "#ff8c00",
+ darkorchid: "#9932cc",
+ darkred: "#8b0000",
+ darksalmon: "#e9967a",
+ darkseagreen: "#8fbc8f",
+ darkslateblue: "#483d8b",
+ darkslategray: "#2f4f4f",
+ darkslategrey: "#2f4f4f",
+ darkturquoise: "#00ced1",
+ darkviolet: "#9400d3",
+ deeppink: "#ff1493",
+ deepskyblue: "#00bfff",
+ dimgray: "#696969",
+ dimgrey: "#696969",
+ dodgerblue: "#1e90ff",
+ firebrick: "#b22222",
+ floralwhite: "#fffaf0",
+ forestgreen: "#228b22",
+ fuchsia: "#ff00ff",
+ gainsboro: "#dcdcdc",
+ ghostwhite: "#f8f8ff",
+ gold: "#ffd700",
+ goldenrod: "#daa520",
+ gray: "#808080",
+ green: "#008000",
+ greenyellow: "#adff2f",
+ grey: "#808080",
+ honeydew: "#f0fff0",
+ hotpink: "#ff69b4",
+ indianred: "#cd5c5c",
+ indigo: "#4b0082",
+ ivory: "#fffff0",
+ khaki: "#f0e68c",
+ lavender: "#e6e6fa",
+ lavenderblush: "#fff0f5",
+ lawngreen: "#7cfc00",
+ lemonchiffon: "#fffacd",
+ lightblue: "#add8e6",
+ lightcoral: "#f08080",
+ lightcyan: "#e0ffff",
+ lightgoldenrodyellow: "#fafad2",
+ lightgray: "#d3d3d3",
+ lightgreen: "#90ee90",
+ lightgrey: "#d3d3d3",
+ lightpink: "#ffb6c1",
+ lightsalmon: "#ffa07a",
+ lightseagreen: "#20b2aa",
+ lightskyblue: "#87cefa",
+ lightslategray: "#778899",
+ lightslategrey: "#778899",
+ lightsteelblue: "#b0c4de",
+ lightyellow: "#ffffe0",
+ lime: "#00ff00",
+ limegreen: "#32cd32",
+ linen: "#faf0e6",
+ magenta: "#ff00ff",
+ maroon: "#800000",
+ mediumaquamarine: "#66cdaa",
+ mediumblue: "#0000cd",
+ mediumorchid: "#ba55d3",
+ mediumpurple: "#9370db",
+ mediumseagreen: "#3cb371",
+ mediumslateblue: "#7b68ee",
+ mediumspringgreen: "#00fa9a",
+ mediumturquoise: "#48d1cc",
+ mediumvioletred: "#c71585",
+ midnightblue: "#191970",
+ mintcream: "#f5fffa",
+ mistyrose: "#ffe4e1",
+ moccasin: "#ffe4b5",
+ navajowhite: "#ffdead",
+ navy: "#000080",
+ oldlace: "#fdf5e6",
+ olive: "#808000",
+ olivedrab: "#6b8e23",
+ orange: "#ffa500",
+ orangered: "#ff4500",
+ orchid: "#da70d6",
+ palegoldenrod: "#eee8aa",
+ palegreen: "#98fb98",
+ paleturquoise: "#afeeee",
+ palevioletred: "#db7093",
+ papayawhip: "#ffefd5",
+ peachpuff: "#ffdab9",
+ peru: "#cd853f",
+ pink: "#ffc0cb",
+ plum: "#dda0dd",
+ powderblue: "#b0e0e6",
+ purple: "#800080",
+ red: "#ff0000",
+ rosybrown: "#bc8f8f",
+ royalblue: "#4169e1",
+ saddlebrown: "#8b4513",
+ salmon: "#fa8072",
+ sandybrown: "#f4a460",
+ seagreen: "#2e8b57",
+ seashell: "#fff5ee",
+ sienna: "#a0522d",
+ silver: "#c0c0c0",
+ skyblue: "#87ceeb",
+ slateblue: "#6a5acd",
+ slategray: "#708090",
+ slategrey: "#708090",
+ snow: "#fffafa",
+ springgreen: "#00ff7f",
+ steelblue: "#4682b4",
+ tan: "#d2b48c",
+ teal: "#008080",
+ thistle: "#d8bfd8",
+ tomato: "#ff6347",
+ turquoise: "#40e0d0",
+ violet: "#ee82ee",
+ wheat: "#f5deb3",
+ white: "#ffffff",
+ whitesmoke: "#f5f5f5",
+ yellow: "#ffff00",
+ yellowgreen: "#9acd32"
+};
+
+for (var d3_rgb_name in d3_rgb_names) {
+ d3_rgb_names[d3_rgb_name] = d3_rgb_parse(
+ d3_rgb_names[d3_rgb_name],
+ d3_rgb,
+ d3_hsl_rgb);
+}
+d3.hsl = function(h, s, l) {
+ return arguments.length === 1
+ ? (h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l)
+ : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl))
+ : d3_hsl(+h, +s, +l);
+};
+
+function d3_hsl(h, s, l) {
+ return new d3_Hsl(h, s, l);
+}
+
+function d3_Hsl(h, s, l) {
+ this.h = h;
+ this.s = s;
+ this.l = l;
+}
+
+d3_Hsl.prototype.brighter = function(k) {
+ k = Math.pow(0.7, arguments.length ? k : 1);
+ return d3_hsl(this.h, this.s, this.l / k);
+};
+
+d3_Hsl.prototype.darker = function(k) {
+ k = Math.pow(0.7, arguments.length ? k : 1);
+ return d3_hsl(this.h, this.s, k * this.l);
+};
+
+d3_Hsl.prototype.rgb = function() {
+ return d3_hsl_rgb(this.h, this.s, this.l);
+};
+
+d3_Hsl.prototype.toString = function() {
+ return this.rgb().toString();
+};
+
+function d3_hsl_rgb(h, s, l) {
+ var m1,
+ m2;
+
+ /* Some simple corrections for h, s and l. */
+ h = h % 360; if (h < 0) h += 360;
+ s = s < 0 ? 0 : s > 1 ? 1 : s;
+ l = l < 0 ? 0 : l > 1 ? 1 : l;
+
+ /* From FvD 13.37, CSS Color Module Level 3 */
+ m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
+ m1 = 2 * l - m2;
+
+ function v(h) {
+ if (h > 360) h -= 360;
+ else if (h < 0) h += 360;
+ if (h < 60) return m1 + (m2 - m1) * h / 60;
+ if (h < 180) return m2;
+ if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
+ return m1;
+ }
+
+ function vv(h) {
+ return Math.round(v(h) * 255);
+ }
+
+ return d3_rgb(vv(h + 120), vv(h), vv(h - 120));
+}
+function d3_selection(groups) {
+ d3_arraySubclass(groups, d3_selectionPrototype);
+ return groups;
+}
+
+var d3_select = function(s, n) { return n.querySelector(s); },
+ d3_selectAll = function(s, n) { return n.querySelectorAll(s); },
+ d3_selectRoot = document.documentElement,
+ d3_selectMatcher = d3_selectRoot.matchesSelector || d3_selectRoot.webkitMatchesSelector || d3_selectRoot.mozMatchesSelector || d3_selectRoot.msMatchesSelector || d3_selectRoot.oMatchesSelector,
+ d3_selectMatches = function(n, s) { return d3_selectMatcher.call(n, s); };
+
+// Prefer Sizzle, if available.
+if (typeof Sizzle === "function") {
+ d3_select = function(s, n) { return Sizzle(s, n)[0]; };
+ d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); };
+ d3_selectMatches = Sizzle.matchesSelector;
+}
+
+var d3_selectionPrototype = [];
+
+d3.selection = function() {
+ return d3_selectionRoot;
+};
+
+d3.selection.prototype = d3_selectionPrototype;
+d3_selectionPrototype.select = function(selector) {
+ var subgroups = [],
+ subgroup,
+ subnode,
+ group,
+ node;
+
+ if (typeof selector !== "function") selector = d3_selection_selector(selector);
+
+ for (var j = -1, m = this.length; ++j < m;) {
+ subgroups.push(subgroup = []);
+ subgroup.parentNode = (group = this[j]).parentNode;
+ for (var i = -1, n = group.length; ++i < n;) {
+ if (node = group[i]) {
+ subgroup.push(subnode = selector.call(node, node.__data__, i));
+ if (subnode && "__data__" in node) subnode.__data__ = node.__data__;
+ } else {
+ subgroup.push(null);
+ }
+ }
+ }
+
+ return d3_selection(subgroups);
+};
+
+function d3_selection_selector(selector) {
+ return function() {
+ return d3_select(selector, this);
+ };
+}
+d3_selectionPrototype.selectAll = function(selector) {
+ var subgroups = [],
+ subgroup,
+ node;
+
+ if (typeof selector !== "function") selector = d3_selection_selectorAll(selector);
+
+ for (var j = -1, m = this.length; ++j < m;) {
+ for (var group = this[j], i = -1, n = group.length; ++i < n;) {
+ if (node = group[i]) {
+ subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i)));
+ subgroup.parentNode = node;
+ }
+ }
+ }
+
+ return d3_selection(subgroups);
+};
+
+function d3_selection_selectorAll(selector) {
+ return function() {
+ return d3_selectAll(selector, this);
+ };
+}
+d3_selectionPrototype.attr = function(name, value) {
+ name = d3.ns.qualify(name);
+
+ // If no value is specified, return the first value.
+ if (arguments.length < 2) {
+ var node = this.node();
+ return name.local
+ ? node.getAttributeNS(name.space, name.local)
+ : node.getAttribute(name);
+ }
+
+ function attrNull() {
+ this.removeAttribute(name);
+ }
+
+ function attrNullNS() {
+ this.removeAttributeNS(name.space, name.local);
+ }
+
+ function attrConstant() {
+ this.setAttribute(name, value);
+ }
+
+ function attrConstantNS() {
+ this.setAttributeNS(name.space, name.local, value);
+ }
+
+ function attrFunction() {
+ var x = value.apply(this, arguments);
+ if (x == null) this.removeAttribute(name);
+ else this.setAttribute(name, x);
+ }
+
+ function attrFunctionNS() {
+ var x = value.apply(this, arguments);
+ if (x == null) this.removeAttributeNS(name.space, name.local);
+ else this.setAttributeNS(name.space, name.local, x);
+ }
+
+ return this.each(value == null
+ ? (name.local ? attrNullNS : attrNull) : (typeof value === "function"
+ ? (name.local ? attrFunctionNS : attrFunction)
+ : (name.local ? attrConstantNS : attrConstant)));
+};
+d3_selectionPrototype.classed = function(name, value) {
+ var names = name.split(d3_selection_classedWhitespace),
+ n = names.length,
+ i = -1;
+ if (arguments.length > 1) {
+ while (++i < n) d3_selection_classed.call(this, names[i], value);
+ return this;
+ } else {
+ while (++i < n) if (!d3_selection_classed.call(this, names[i])) return false;
+ return true;
+ }
+};
+
+var d3_selection_classedWhitespace = /\s+/g;
+
+function d3_selection_classed(name, value) {
+ var re = new RegExp("(^|\\s+)" + d3.requote(name) + "(\\s+|$)", "g");
+
+ // If no value is specified, return the first value.
+ if (arguments.length < 2) {
+ var node = this.node();
+ if (c = node.classList) return c.contains(name);
+ var c = node.className;
+ re.lastIndex = 0;
+ return re.test(c.baseVal != null ? c.baseVal : c);
+ }
+
+ function classedAdd() {
+ if (c = this.classList) return c.add(name);
+ var c = this.className,
+ cb = c.baseVal != null,
+ cv = cb ? c.baseVal : c;
+ re.lastIndex = 0;
+ if (!re.test(cv)) {
+ cv = d3_collapse(cv + " " + name);
+ if (cb) c.baseVal = cv;
+ else this.className = cv;
+ }
+ }
+
+ function classedRemove() {
+ if (c = this.classList) return c.remove(name);
+ var c = this.className,
+ cb = c.baseVal != null,
+ cv = cb ? c.baseVal : c;
+ cv = d3_collapse(cv.replace(re, " "));
+ if (cb) c.baseVal = cv;
+ else this.className = cv;
+ }
+
+ function classedFunction() {
+ (value.apply(this, arguments)
+ ? classedAdd
+ : classedRemove).call(this);
+ }
+
+ return this.each(typeof value === "function"
+ ? classedFunction : value
+ ? classedAdd
+ : classedRemove);
+}
+d3_selectionPrototype.style = function(name, value, priority) {
+ if (arguments.length < 3) priority = "";
+
+ // If no value is specified, return the first value.
+ if (arguments.length < 2) return window
+ .getComputedStyle(this.node(), null)
+ .getPropertyValue(name);
+
+ function styleNull() {
+ this.style.removeProperty(name);
+ }
+
+ function styleConstant() {
+ this.style.setProperty(name, value, priority);
+ }
+
+ function styleFunction() {
+ var x = value.apply(this, arguments);
+ if (x == null) this.style.removeProperty(name);
+ else this.style.setProperty(name, x, priority);
+ }
+
+ return this.each(value == null
+ ? styleNull : (typeof value === "function"
+ ? styleFunction : styleConstant));
+};
+d3_selectionPrototype.property = function(name, value) {
+
+ // If no value is specified, return the first value.
+ if (arguments.length < 2) return this.node()[name];
+
+ function propertyNull() {
+ delete this[name];
+ }
+
+ function propertyConstant() {
+ this[name] = value;
+ }
+
+ function propertyFunction() {
+ var x = value.apply(this, arguments);
+ if (x == null) delete this[name];
+ else this[name] = x;
+ }
+
+ return this.each(value == null
+ ? propertyNull : (typeof value === "function"
+ ? propertyFunction : propertyConstant));
+};
+d3_selectionPrototype.text = function(value) {
+ return arguments.length < 1 ? this.node().textContent
+ : (this.each(typeof value === "function"
+ ? function() { this.textContent = value.apply(this, arguments); }
+ : function() { this.textContent = value; }));
+};
+d3_selectionPrototype.html = function(value) {
+ return arguments.length < 1 ? this.node().innerHTML
+ : (this.each(typeof value === "function"
+ ? function() { this.innerHTML = value.apply(this, arguments); }
+ : function() { this.innerHTML = value; }));
+};
+// TODO append(node)?
+// TODO append(function)?
+d3_selectionPrototype.append = function(name) {
+ name = d3.ns.qualify(name);
+
+ function append() {
+ return this.appendChild(document.createElementNS(this.namespaceURI, name));
+ }
+
+ function appendNS() {
+ return this.appendChild(document.createElementNS(name.space, name.local));
+ }
+
+ return this.select(name.local ? appendNS : append);
+};
+// TODO insert(node, function)?
+// TODO insert(function, string)?
+// TODO insert(function, function)?
+d3_selectionPrototype.insert = function(name, before) {
+ name = d3.ns.qualify(name);
+
+ function insert() {
+ return this.insertBefore(
+ document.createElementNS(this.namespaceURI, name),
+ d3_select(before, this));
+ }
+
+ function insertNS() {
+ return this.insertBefore(
+ document.createElementNS(name.space, name.local),
+ d3_select(before, this));
+ }
+
+ return this.select(name.local ? insertNS : insert);
+};
+// TODO remove(selector)?
+// TODO remove(node)?
+// TODO remove(function)?
+d3_selectionPrototype.remove = function() {
+ return this.each(function() {
+ var parent = this.parentNode;
+ if (parent) parent.removeChild(this);
+ });
+};
+// TODO data(null) for clearing data?
+d3_selectionPrototype.data = function(data, join) {
+ var enter = [],
+ update = [],
+ exit = [];
+
+ function bind(group, groupData) {
+ var i,
+ n = group.length,
+ m = groupData.length,
+ n0 = Math.min(n, m),
+ n1 = Math.max(n, m),
+ updateNodes = [],
+ enterNodes = [],
+ exitNodes = [],
+ node,
+ nodeData;
+
+ if (join) {
+ var nodeByKey = {},
+ keys = [],
+ key,
+ j = groupData.length;
+
+ for (i = -1; ++i < n;) {
+ key = join.call(node = group[i], node.__data__, i);
+ if (key in nodeByKey) {
+ exitNodes[j++] = node; // duplicate key
+ } else {
+ nodeByKey[key] = node;
+ }
+ keys.push(key);
+ }
+
+ for (i = -1; ++i < m;) {
+ node = nodeByKey[key = join.call(groupData, nodeData = groupData[i], i)];
+ if (node) {
+ node.__data__ = nodeData;
+ updateNodes[i] = node;
+ enterNodes[i] = exitNodes[i] = null;
+ } else {
+ enterNodes[i] = d3_selection_dataNode(nodeData);
+ updateNodes[i] = exitNodes[i] = null;
+ }
+ delete nodeByKey[key];
+ }
+
+ for (i = -1; ++i < n;) {
+ if (keys[i] in nodeByKey) {
+ exitNodes[i] = group[i];
+ }
+ }
+ } else {
+ for (i = -1; ++i < n0;) {
+ node = group[i];
+ nodeData = groupData[i];
+ if (node) {
+ node.__data__ = nodeData;
+ updateNodes[i] = node;
+ enterNodes[i] = exitNodes[i] = null;
+ } else {
+ enterNodes[i] = d3_selection_dataNode(nodeData);
+ updateNodes[i] = exitNodes[i] = null;
+ }
+ }
+ for (; i < m; ++i) {
+ enterNodes[i] = d3_selection_dataNode(groupData[i]);
+ updateNodes[i] = exitNodes[i] = null;
+ }
+ for (; i < n1; ++i) {
+ exitNodes[i] = group[i];
+ enterNodes[i] = updateNodes[i] = null;
+ }
+ }
+
+ enterNodes.update
+ = updateNodes;
+
+ enterNodes.parentNode
+ = updateNodes.parentNode
+ = exitNodes.parentNode
+ = group.parentNode;
+
+ enter.push(enterNodes);
+ update.push(updateNodes);
+ exit.push(exitNodes);
+ }
+
+ var i = -1,
+ n = this.length,
+ group;
+ if (typeof data === "function") {
+ while (++i < n) {
+ bind(group = this[i], data.call(group, group.parentNode.__data__, i));
+ }
+ } else {
+ while (++i < n) {
+ bind(group = this[i], data);
+ }
+ }
+
+ var selection = d3_selection(update);
+ selection.enter = function() { return d3_selection_enter(enter); };
+ selection.exit = function() { return d3_selection(exit); };
+ return selection;
+};
+
+function d3_selection_dataNode(data) {
+ return {__data__: data};
+}
+d3_selectionPrototype.filter = function(filter) {
+ var subgroups = [],
+ subgroup,
+ group,
+ node;
+
+ if (typeof filter !== "function") filter = d3_selection_filter(filter);
+
+ for (var j = 0, m = this.length; j < m; j++) {
+ subgroups.push(subgroup = []);
+ subgroup.parentNode = (group = this[j]).parentNode;
+ for (var i = 0, n = group.length; i < n; i++) {
+ if ((node = group[i]) && filter.call(node, node.__data__, i)) {
+ subgroup.push(node);
+ }
+ }
+ }
+
+ return d3_selection(subgroups);
+};
+
+function d3_selection_filter(selector) {
+ return function() {
+ return d3_selectMatches(this, selector);
+ };
+}
+d3_selectionPrototype.map = function(map) {
+ return this.each(function() {
+ this.__data__ = map.apply(this, arguments);
+ });
+};
+d3_selectionPrototype.order = function() {
+ for (var j = -1, m = this.length; ++j < m;) {
+ for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
+ if (node = group[i]) {
+ if (next) next.parentNode.insertBefore(node, next);
+ next = node;
+ }
+ }
+ }
+ return this;
+};
+d3_selectionPrototype.sort = function(comparator) {
+ comparator = d3_selection_sortComparator.apply(this, arguments);
+ for (var j = -1, m = this.length; ++j < m;) this[j].sort(comparator);
+ return this.order();
+};
+
+function d3_selection_sortComparator(comparator) {
+ if (!arguments.length) comparator = d3.ascending;
+ return function(a, b) {
+ return comparator(a && a.__data__, b && b.__data__);
+ };
+}
+// type can be namespaced, e.g., "click.foo"
+// listener can be null for removal
+d3_selectionPrototype.on = function(type, listener, capture) {
+ if (arguments.length < 3) capture = false;
+
+ // parse the type specifier
+ var name = "__on" + type, i = type.indexOf(".");
+ if (i > 0) type = type.substring(0, i);
+
+ // if called with only one argument, return the current listener
+ if (arguments.length < 2) return (i = this.node()[name]) && i._;
+
+ // remove the old event listener, and add the new event listener
+ return this.each(function(d, i) {
+ var node = this;
+
+ if (node[name]) node.removeEventListener(type, node[name], capture);
+ if (listener) node.addEventListener(type, node[name] = l, capture);
+
+ // wrapped event listener that preserves i
+ function l(e) {
+ var o = d3.event; // Events can be reentrant (e.g., focus).
+ d3.event = e;
+ try {
+ listener.call(node, node.__data__, i);
+ } finally {
+ d3.event = o;
+ }
+ }
+
+ // stash the unwrapped listener for retrieval
+ l._ = listener;
+ });
+};
+d3_selectionPrototype.each = function(callback) {
+ for (var j = -1, m = this.length; ++j < m;) {
+ for (var group = this[j], i = -1, n = group.length; ++i < n;) {
+ var node = group[i];
+ if (node) callback.call(node, node.__data__, i, j);
+ }
+ }
+ return this;
+};
+//
+// Note: assigning to the arguments array simultaneously changes the value of
+// the corresponding argument!
+//
+// TODO The `this` argument probably shouldn't be the first argument to the
+// callback, anyway, since it's redundant. However, that will require a major
+// version bump due to backwards compatibility, so I'm not changing it right
+// away.
+//
+d3_selectionPrototype.call = function(callback) {
+ callback.apply(this, (arguments[0] = this, arguments));
+ return this;
+};
+d3_selectionPrototype.empty = function() {
+ return !this.node();
+};
+d3_selectionPrototype.node = function(callback) {
+ for (var j = 0, m = this.length; j < m; j++) {
+ for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+ var node = group[i];
+ if (node) return node;
+ }
+ }
+ return null;
+};
+d3_selectionPrototype.transition = function() {
+ var subgroups = [],
+ subgroup,
+ node;
+
+ for (var j = -1, m = this.length; ++j < m;) {
+ subgroups.push(subgroup = []);
+ for (var group = this[j], i = -1, n = group.length; ++i < n;) {
+ subgroup.push((node = group[i]) ? {node: node, delay: 0, duration: 250} : null);
+ }
+ }
+
+ return d3_transition(subgroups, d3_transitionInheritId || ++d3_transitionId, Date.now());
+};
+var d3_selectionRoot = d3_selection([[document]]);
+
+d3_selectionRoot[0].parentNode = d3_selectRoot;
+
+// TODO fast singleton implementation!
+// TODO select(function)
+d3.select = function(selector) {
+ return typeof selector === "string"
+ ? d3_selectionRoot.select(selector)
+ : d3_selection([[selector]]); // assume node
+};
+
+// TODO selectAll(function)
+d3.selectAll = function(selector) {
+ return typeof selector === "string"
+ ? d3_selectionRoot.selectAll(selector)
+ : d3_selection([d3_array(selector)]); // assume node[]
+};
+function d3_selection_enter(selection) {
+ d3_arraySubclass(selection, d3_selection_enterPrototype);
+ return selection;
+}
+
+var d3_selection_enterPrototype = [];
+
+d3_selection_enterPrototype.append = d3_selectionPrototype.append;
+d3_selection_enterPrototype.insert = d3_selectionPrototype.insert;
+d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;
+d3_selection_enterPrototype.node = d3_selectionPrototype.node;
+d3_selection_enterPrototype.select = function(selector) {
+ var subgroups = [],
+ subgroup,
+ subnode,
+ upgroup,
+ group,
+ node;
+
+ for (var j = -1, m = this.length; ++j < m;) {
+ upgroup = (group = this[j]).update;
+ subgroups.push(subgroup = []);
+ subgroup.parentNode = group.parentNode;
+ for (var i = -1, n = group.length; ++i < n;) {
+ if (node = group[i]) {
+ subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i));
+ subnode.__data__ = node.__data__;
+ } else {
+ subgroup.push(null);
+ }
+ }
+ }
+
+ return d3_selection(subgroups);
+};
+function d3_transition(groups, id, time) {
+ d3_arraySubclass(groups, d3_transitionPrototype);
+
+ var tweens = {},
+ event = d3.dispatch("start", "end"),
+ ease = d3_transitionEase;
+
+ groups.id = id;
+
+ groups.time = time;
+
+ groups.tween = function(name, tween) {
+ if (arguments.length < 2) return tweens[name];
+ if (tween == null) delete tweens[name];
+ else tweens[name] = tween;
+ return groups;
+ };
+
+ groups.ease = function(value) {
+ if (!arguments.length) return ease;
+ ease = typeof value === "function" ? value : d3.ease.apply(d3, arguments);
+ return groups;
+ };
+
+ groups.each = function(type, listener) {
+ if (arguments.length < 2) return d3_transition_each.call(groups, type);
+ event.on(type, listener);
+ return groups;
+ };
+
+ d3.timer(function(elapsed) {
+ groups.each(function(d, i, j) {
+ var tweened = [],
+ node = this,
+ delay = groups[j][i].delay,
+ duration = groups[j][i].duration,
+ lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0});
+
+ ++lock.count;
+
+ delay <= elapsed ? start(elapsed) : d3.timer(start, delay, time);
+
+ function start(elapsed) {
+ if (lock.active > id) return stop();
+ lock.active = id;
+
+ for (var tween in tweens) {
+ if (tween = tweens[tween].call(node, d, i)) {
+ tweened.push(tween);
+ }
+ }
+
+ event.start.call(node, d, i);
+ if (!tick(elapsed)) d3.timer(tick, 0, time);
+ return 1;
+ }
+
+ function tick(elapsed) {
+ if (lock.active !== id) return stop();
+
+ var t = (elapsed - delay) / duration,
+ e = ease(t),
+ n = tweened.length;
+
+ while (n > 0) {
+ tweened[--n].call(node, e);
+ }
+
+ if (t >= 1) {
+ stop();
+ d3_transitionInheritId = id;
+ event.end.call(node, d, i);
+ d3_transitionInheritId = 0;
+ return 1;
+ }
+ }
+
+ function stop() {
+ if (!--lock.count) delete node.__transition__;
+ return 1;
+ }
+ });
+ return 1;
+ }, 0, time);
+
+ return groups;
+}
+
+var d3_transitionRemove = {};
+
+function d3_transitionNull(d, i, a) {
+ return a != "" && d3_transitionRemove;
+}
+
+function d3_transitionTween(name, b) {
+ var interpolate = d3_interpolateByName(name);
+
+ function transitionFunction(d, i, a) {
+ var v = b.call(this, d, i);
+ return v == null
+ ? a != "" && d3_transitionRemove
+ : a != v && interpolate(a, v);
+ }
+
+ function transitionString(d, i, a) {
+ return a != b && interpolate(a, b);
+ }
+
+ return typeof b === "function" ? transitionFunction
+ : b == null ? d3_transitionNull
+ : (b += "", transitionString);
+}
+
+var d3_transitionPrototype = [],
+ d3_transitionId = 0,
+ d3_transitionInheritId = 0,
+ d3_transitionEase = d3.ease("cubic-in-out");
+
+d3_transitionPrototype.call = d3_selectionPrototype.call;
+
+d3.transition = function() {
+ return d3_selectionRoot.transition();
+};
+
+d3.transition.prototype = d3_transitionPrototype;
+d3_transitionPrototype.select = function(selector) {
+ var subgroups = [],
+ subgroup,
+ subnode,
+ node;
+
+ if (typeof selector !== "function") selector = d3_selection_selector(selector);
+
+ for (var j = -1, m = this.length; ++j < m;) {
+ subgroups.push(subgroup = []);
+ for (var group = this[j], i = -1, n = group.length; ++i < n;) {
+ if ((node = group[i]) && (subnode = selector.call(node.node, node.node.__data__, i))) {
+ if ("__data__" in node.node) subnode.__data__ = node.node.__data__;
+ subgroup.push({node: subnode, delay: node.delay, duration: node.duration});
+ } else {
+ subgroup.push(null);
+ }
+ }
+ }
+
+ return d3_transition(subgroups, this.id, this.time).ease(this.ease());
+};
+d3_transitionPrototype.selectAll = function(selector) {
+ var subgroups = [],
+ subgroup,
+ subnodes,
+ node;
+
+ if (typeof selector !== "function") selector = d3_selection_selectorAll(selector);
+
+ for (var j = -1, m = this.length; ++j < m;) {
+ for (var group = this[j], i = -1, n = group.length; ++i < n;) {
+ if (node = group[i]) {
+ subnodes = selector.call(node.node, node.node.__data__, i);
+ subgroups.push(subgroup = []);
+ for (var k = -1, o = subnodes.length; ++k < o;) {
+ subgroup.push({node: subnodes[k], delay: node.delay, duration: node.duration});
+ }
+ }
+ }
+ }
+
+ return d3_transition(subgroups, this.id, this.time).ease(this.ease());
+};
+d3_transitionPrototype.attr = function(name, value) {
+ return this.attrTween(name, d3_transitionTween(name, value));
+};
+
+d3_transitionPrototype.attrTween = function(nameNS, tween) {
+ var name = d3.ns.qualify(nameNS);
+
+ function attrTween(d, i) {
+ var f = tween.call(this, d, i, this.getAttribute(name));
+ return f === d3_transitionRemove
+ ? (this.removeAttribute(name), null)
+ : f && function(t) { this.setAttribute(name, f(t)); };
+ }
+
+ function attrTweenNS(d, i) {
+ var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
+ return f === d3_transitionRemove
+ ? (this.removeAttributeNS(name.space, name.local), null)
+ : f && function(t) { this.setAttributeNS(name.space, name.local, f(t)); };
+ }
+
+ return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);
+};
+d3_transitionPrototype.style = function(name, value, priority) {
+ if (arguments.length < 3) priority = "";
+ return this.styleTween(name, d3_transitionTween(name, value), priority);
+};
+
+d3_transitionPrototype.styleTween = function(name, tween, priority) {
+ if (arguments.length < 3) priority = "";
+ return this.tween("style." + name, function(d, i) {
+ var f = tween.call(this, d, i, window.getComputedStyle(this, null).getPropertyValue(name));
+ return f === d3_transitionRemove
+ ? (this.style.removeProperty(name), null)
+ : f && function(t) { this.style.setProperty(name, f(t), priority); };
+ });
+};
+d3_transitionPrototype.text = function(value) {
+ return this.tween("text", function(d, i) {
+ this.textContent = typeof value === "function"
+ ? value.call(this, d, i)
+ : value;
+ });
+};
+d3_transitionPrototype.remove = function() {
+ return this.each("end", function() {
+ var p;
+ if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this);
+ });
+};
+d3_transitionPrototype.delay = function(value) {
+ var groups = this;
+ return groups.each(typeof value === "function"
+ ? function(d, i, j) { groups[j][i].delay = +value.apply(this, arguments); }
+ : (value = +value, function(d, i, j) { groups[j][i].delay = value; }));
+};
+d3_transitionPrototype.duration = function(value) {
+ var groups = this;
+ return groups.each(typeof value === "function"
+ ? function(d, i, j) { groups[j][i].duration = +value.apply(this, arguments); }
+ : (value = +value, function(d, i, j) { groups[j][i].duration = value; }));
+};
+function d3_transition_each(callback) {
+ for (var j = 0, m = this.length; j < m; j++) {
+ for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+ var node = group[i];
+ if (node) callback.call(node = node.node, node.__data__, i, j);
+ }
+ }
+ return this;
+}
+d3_transitionPrototype.transition = function() {
+ return this.select(d3_this);
+};
+var d3_timer_queue = null,
+ d3_timer_interval, // is an interval (or frame) active?
+ d3_timer_timeout; // is a timeout active?
+
+// The timer will continue to fire until callback returns true.
+d3.timer = function(callback, delay, then) {
+ var found = false,
+ t0,
+ t1 = d3_timer_queue;
+
+ if (arguments.length < 3) {
+ if (arguments.length < 2) delay = 0;
+ else if (!isFinite(delay)) return;
+ then = Date.now();
+ }
+
+ // See if the callback's already in the queue.
+ while (t1) {
+ if (t1.callback === callback) {
+ t1.then = then;
+ t1.delay = delay;
+ found = true;
+ break;
+ }
+ t0 = t1;
+ t1 = t1.next;
+ }
+
+ // Otherwise, add the callback to the queue.
+ if (!found) d3_timer_queue = {
+ callback: callback,
+ then: then,
+ delay: delay,
+ next: d3_timer_queue
+ };
+
+ // Start animatin'!
+ if (!d3_timer_interval) {
+ d3_timer_timeout = clearTimeout(d3_timer_timeout);
+ d3_timer_interval = 1;
+ d3_timer_frame(d3_timer_step);
+ }
+}
+
+function d3_timer_step() {
+ var elapsed,
+ now = Date.now(),
+ t1 = d3_timer_queue;
+
+ while (t1) {
+ elapsed = now - t1.then;
+ if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed);
+ t1 = t1.next;
+ }
+
+ var delay = d3_timer_flush() - now;
+ if (delay > 24) {
+ if (isFinite(delay)) {
+ clearTimeout(d3_timer_timeout);
+ d3_timer_timeout = setTimeout(d3_timer_step, delay);
+ }
+ d3_timer_interval = 0;
+ } else {
+ d3_timer_interval = 1;
+ d3_timer_frame(d3_timer_step);
+ }
+}
+
+d3.timer.flush = function() {
+ var elapsed,
+ now = Date.now(),
+ t1 = d3_timer_queue;
+
+ while (t1) {
+ elapsed = now - t1.then;
+ if (!t1.delay) t1.flush = t1.callback(elapsed);
+ t1 = t1.next;
+ }
+
+ d3_timer_flush();
+};
+
+// Flush after callbacks, to avoid concurrent queue modification.
+function d3_timer_flush() {
+ var t0 = null,
+ t1 = d3_timer_queue,
+ then = Infinity;
+ while (t1) {
+ if (t1.flush) {
+ t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next;
+ } else {
+ then = Math.min(then, t1.then + t1.delay);
+ t1 = (t0 = t1).next;
+ }
+ }
+ return then;
+}
+
+var d3_timer_frame = window.requestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.oRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || function(callback) { setTimeout(callback, 17); };
+d3.transform = function(string) {
+ d3_transformG.setAttribute("transform", string);
+ var t = d3_transformG.transform.baseVal.consolidate();
+ return new d3_transform(t ? t.matrix : d3_transformIdentity);
+};
+
+// Compute x-scale and normalize the first row.
+// Compute shear and make second row orthogonal to first.
+// Compute y-scale and normalize the second row.
+// Finally, compute the rotation.
+function d3_transform(m) {
+ var r0 = [m.a, m.b],
+ r1 = [m.c, m.d],
+ kx = d3_transformNormalize(r0),
+ kz = d3_transformDot(r0, r1),
+ ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;
+ if (r0[0] * r1[1] < r1[0] * r0[1]) {
+ r0[0] *= -1;
+ r0[1] *= -1;
+ kx *= -1;
+ kz *= -1;
+ }
+ this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_transformDegrees;
+ this.translate = [m.e, m.f];
+ this.scale = [kx, ky];
+ this.skew = ky ? Math.atan2(kz, ky) * d3_transformDegrees : 0;
+};
+
+d3_transform.prototype.toString = function() {
+ return "translate(" + this.translate
+ + ")rotate(" + this.rotate
+ + ")skewX(" + this.skew
+ + ")scale(" + this.scale
+ + ")";
+};
+
+function d3_transformDot(a, b) {
+ return a[0] * b[0] + a[1] * b[1];
+}
+
+function d3_transformNormalize(a) {
+ var k = Math.sqrt(d3_transformDot(a, a));
+ if (k) {
+ a[0] /= k;
+ a[1] /= k;
+ }
+ return k;
+}
+
+function d3_transformCombine(a, b, k) {
+ a[0] += k * b[0];
+ a[1] += k * b[1];
+ return a;
+}
+
+var d3_transformG = document.createElementNS(d3.ns.prefix.svg, "g"),
+ d3_transformIdentity = {a: 1, b: 0, c: 0, d: 1, e: 0, f: 0},
+ d3_transformDegrees = 180 / Math.PI;
+function d3_noop() {}
+d3.scale = {};
+
+function d3_scaleExtent(domain) {
+ var start = domain[0], stop = domain[domain.length - 1];
+ return start < stop ? [start, stop] : [stop, start];
+}
+
+function d3_scaleRange(scale) {
+ return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());
+}
+function d3_scale_nice(domain, nice) {
+ var i0 = 0,
+ i1 = domain.length - 1,
+ x0 = domain[i0],
+ x1 = domain[i1],
+ dx;
+
+ if (x1 < x0) {
+ dx = i0; i0 = i1; i1 = dx;
+ dx = x0; x0 = x1; x1 = dx;
+ }
+
+ if (dx = x1 - x0) {
+ nice = nice(dx);
+ domain[i0] = nice.floor(x0);
+ domain[i1] = nice.ceil(x1);
+ }
+
+ return domain;
+}
+
+function d3_scale_niceDefault() {
+ return Math;
+}
+d3.scale.linear = function() {
+ return d3_scale_linear([0, 1], [0, 1], d3.interpolate, false);
+};
+
+function d3_scale_linear(domain, range, interpolate, clamp) {
+ var output,
+ input;
+
+ function rescale() {
+ var linear = domain.length == 2 ? d3_scale_bilinear : d3_scale_polylinear,
+ uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;
+ output = linear(domain, range, uninterpolate, interpolate);
+ input = linear(range, domain, uninterpolate, d3.interpolate);
+ return scale;
+ }
+
+ function scale(x) {
+ return output(x);
+ }
+
+ // Note: requires range is coercible to number!
+ scale.invert = function(y) {
+ return input(y);
+ };
+
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ domain = x.map(Number);
+ return rescale();
+ };
+
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ return rescale();
+ };
+
+ scale.rangeRound = function(x) {
+ return scale.range(x).interpolate(d3.interpolateRound);
+ };
+
+ scale.clamp = function(x) {
+ if (!arguments.length) return clamp;
+ clamp = x;
+ return rescale();
+ };
+
+ scale.interpolate = function(x) {
+ if (!arguments.length) return interpolate;
+ interpolate = x;
+ return rescale();
+ };
+
+ scale.ticks = function(m) {
+ return d3_scale_linearTicks(domain, m);
+ };
+
+ scale.tickFormat = function(m) {
+ return d3_scale_linearTickFormat(domain, m);
+ };
+
+ scale.nice = function() {
+ d3_scale_nice(domain, d3_scale_linearNice);
+ return rescale();
+ };
+
+ scale.copy = function() {
+ return d3_scale_linear(domain, range, interpolate, clamp);
+ };
+
+ return rescale();
+};
+
+function d3_scale_linearRebind(scale, linear) {
+ return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
+}
+
+function d3_scale_linearNice(dx) {
+ dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1);
+ return {
+ floor: function(x) { return Math.floor(x / dx) * dx; },
+ ceil: function(x) { return Math.ceil(x / dx) * dx; }
+ };
+}
+
+// TODO Dates? Ugh.
+function d3_scale_linearTickRange(domain, m) {
+ var extent = d3_scaleExtent(domain),
+ span = extent[1] - extent[0],
+ step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)),
+ err = m / span * step;
+
+ // Filter ticks to get closer to the desired count.
+ if (err <= .15) step *= 10;
+ else if (err <= .35) step *= 5;
+ else if (err <= .75) step *= 2;
+
+ // Round start and stop values to step interval.
+ extent[0] = Math.ceil(extent[0] / step) * step;
+ extent[1] = Math.floor(extent[1] / step) * step + step * .5; // inclusive
+ extent[2] = step;
+ return extent;
+}
+
+function d3_scale_linearTicks(domain, m) {
+ return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));
+}
+
+function d3_scale_linearTickFormat(domain, m) {
+ return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f");
+}
+function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {
+ var u = uninterpolate(domain[0], domain[1]),
+ i = interpolate(range[0], range[1]);
+ return function(x) {
+ return i(u(x));
+ };
+}
+function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
+ var u = [],
+ i = [],
+ j = 0,
+ n = domain.length;
+
+ while (++j < n) {
+ u.push(uninterpolate(domain[j - 1], domain[j]));
+ i.push(interpolate(range[j - 1], range[j]));
+ }
+
+ return function(x) {
+ var j = d3.bisect(domain, x, 1, domain.length - 1) - 1;
+ return i[j](u[j](x));
+ };
+}
+d3.scale.log = function() {
+ return d3_scale_log(d3.scale.linear(), d3_scale_logp);
+};
+
+function d3_scale_log(linear, log) {
+ var pow = log.pow;
+
+ function scale(x) {
+ return linear(log(x));
+ }
+
+ scale.invert = function(x) {
+ return pow(linear.invert(x));
+ };
+
+ scale.domain = function(x) {
+ if (!arguments.length) return linear.domain().map(pow);
+ log = x[0] < 0 ? d3_scale_logn : d3_scale_logp;
+ pow = log.pow;
+ linear.domain(x.map(log));
+ return scale;
+ };
+
+ scale.nice = function() {
+ linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault));
+ return scale;
+ };
+
+ scale.ticks = function() {
+ var extent = d3_scaleExtent(linear.domain()),
+ ticks = [];
+ if (extent.every(isFinite)) {
+ var i = Math.floor(extent[0]),
+ j = Math.ceil(extent[1]),
+ u = pow(extent[0]),
+ v = pow(extent[1]);
+ if (log === d3_scale_logn) {
+ ticks.push(pow(i));
+ for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k);
+ } else {
+ for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k);
+ ticks.push(pow(i));
+ }
+ for (i = 0; ticks[i] < u; i++) {} // strip small values
+ for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values
+ ticks = ticks.slice(i, j);
+ }
+ return ticks;
+ };
+
+ scale.tickFormat = function(n, format) {
+ if (arguments.length < 2) format = d3_scale_logFormat;
+ if (arguments.length < 1) return format;
+ var k = n / scale.ticks().length,
+ f = log === d3_scale_logn ? (e = -1e-12, Math.floor) : (e = 1e-12, Math.ceil),
+ e;
+ return function(d) {
+ return d / pow(f(log(d) + e)) < k ? format(d) : "";
+ };
+ };
+
+ scale.copy = function() {
+ return d3_scale_log(linear.copy(), log);
+ };
+
+ return d3_scale_linearRebind(scale, linear);
+};
+
+var d3_scale_logFormat = d3.format(".0e");
+
+function d3_scale_logp(x) {
+ return Math.log(x) / Math.LN10;
+}
+
+function d3_scale_logn(x) {
+ return -Math.log(-x) / Math.LN10;
+}
+
+d3_scale_logp.pow = function(x) {
+ return Math.pow(10, x);
+};
+
+d3_scale_logn.pow = function(x) {
+ return -Math.pow(10, -x);
+};
+d3.scale.pow = function() {
+ return d3_scale_pow(d3.scale.linear(), 1);
+};
+
+function d3_scale_pow(linear, exponent) {
+ var powp = d3_scale_powPow(exponent),
+ powb = d3_scale_powPow(1 / exponent);
+
+ function scale(x) {
+ return linear(powp(x));
+ }
+
+ scale.invert = function(x) {
+ return powb(linear.invert(x));
+ };
+
+ scale.domain = function(x) {
+ if (!arguments.length) return linear.domain().map(powb);
+ linear.domain(x.map(powp));
+ return scale;
+ };
+
+ scale.ticks = function(m) {
+ return d3_scale_linearTicks(scale.domain(), m);
+ };
+
+ scale.tickFormat = function(m) {
+ return d3_scale_linearTickFormat(scale.domain(), m);
+ };
+
+ scale.nice = function() {
+ return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice));
+ };
+
+ scale.exponent = function(x) {
+ if (!arguments.length) return exponent;
+ var domain = scale.domain();
+ powp = d3_scale_powPow(exponent = x);
+ powb = d3_scale_powPow(1 / exponent);
+ return scale.domain(domain);
+ };
+
+ scale.copy = function() {
+ return d3_scale_pow(linear.copy(), exponent);
+ };
+
+ return d3_scale_linearRebind(scale, linear);
+};
+
+function d3_scale_powPow(e) {
+ return function(x) {
+ return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);
+ };
+}
+d3.scale.sqrt = function() {
+ return d3.scale.pow().exponent(.5);
+};
+d3.scale.ordinal = function() {
+ return d3_scale_ordinal([], {t: "range", x: []});
+};
+
+function d3_scale_ordinal(domain, ranger) {
+ var index,
+ range,
+ rangeBand;
+
+ function scale(x) {
+ return range[((index[x] || (index[x] = domain.push(x))) - 1) % range.length];
+ }
+
+ function steps(start, step) {
+ return d3.range(domain.length).map(function(i) { return start + step * i; });
+ }
+
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ domain = [];
+ index = {};
+ var i = -1, n = x.length, xi;
+ while (++i < n) if (!index[xi = x[i]]) index[xi] = domain.push(xi);
+ return scale[ranger.t](ranger.x, ranger.p);
+ };
+
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ rangeBand = 0;
+ ranger = {t: "range", x: x};
+ return scale;
+ };
+
+ scale.rangePoints = function(x, padding) {
+ if (arguments.length < 2) padding = 0;
+ var start = x[0],
+ stop = x[1],
+ step = (stop - start) / (domain.length - 1 + padding);
+ range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);
+ rangeBand = 0;
+ ranger = {t: "rangePoints", x: x, p: padding};
+ return scale;
+ };
+
+ scale.rangeBands = function(x, padding) {
+ if (arguments.length < 2) padding = 0;
+ var start = x[0],
+ stop = x[1],
+ step = (stop - start) / (domain.length + padding);
+ range = steps(start + step * padding, step);
+ rangeBand = step * (1 - padding);
+ ranger = {t: "rangeBands", x: x, p: padding};
+ return scale;
+ };
+
+ scale.rangeRoundBands = function(x, padding) {
+ if (arguments.length < 2) padding = 0;
+ var start = x[0],
+ stop = x[1],
+ step = Math.floor((stop - start) / (domain.length + padding));
+ range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);
+ rangeBand = Math.round(step * (1 - padding));
+ ranger = {t: "rangeRoundBands", x: x, p: padding};
+ return scale;
+ };
+
+ scale.rangeBand = function() {
+ return rangeBand;
+ };
+
+ scale.rangeExtent = function() {
+ return ranger.x;
+ };
+
+ scale.copy = function() {
+ return d3_scale_ordinal(domain, ranger);
+ };
+
+ return scale.domain(domain);
+};
+/*
+ * This product includes color specifications and designs developed by Cynthia
+ * Brewer (http://colorbrewer.org/). See lib/colorbrewer for more information.
+ */
+
+d3.scale.category10 = function() {
+ return d3.scale.ordinal().range(d3_category10);
+};
+
+d3.scale.category20 = function() {
+ return d3.scale.ordinal().range(d3_category20);
+};
+
+d3.scale.category20b = function() {
+ return d3.scale.ordinal().range(d3_category20b);
+};
+
+d3.scale.category20c = function() {
+ return d3.scale.ordinal().range(d3_category20c);
+};
+
+var d3_category10 = [
+ "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd",
+ "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf"
+];
+
+var d3_category20 = [
+ "#1f77b4", "#aec7e8",
+ "#ff7f0e", "#ffbb78",
+ "#2ca02c", "#98df8a",
+ "#d62728", "#ff9896",
+ "#9467bd", "#c5b0d5",
+ "#8c564b", "#c49c94",
+ "#e377c2", "#f7b6d2",
+ "#7f7f7f", "#c7c7c7",
+ "#bcbd22", "#dbdb8d",
+ "#17becf", "#9edae5"
+];
+
+var d3_category20b = [
+ "#393b79", "#5254a3", "#6b6ecf", "#9c9ede",
+ "#637939", "#8ca252", "#b5cf6b", "#cedb9c",
+ "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94",
+ "#843c39", "#ad494a", "#d6616b", "#e7969c",
+ "#7b4173", "#a55194", "#ce6dbd", "#de9ed6"
+];
+
+var d3_category20c = [
+ "#3182bd", "#6baed6", "#9ecae1", "#c6dbef",
+ "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2",
+ "#31a354", "#74c476", "#a1d99b", "#c7e9c0",
+ "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb",
+ "#636363", "#969696", "#bdbdbd", "#d9d9d9"
+];
+d3.scale.quantile = function() {
+ return d3_scale_quantile([], []);
+};
+
+function d3_scale_quantile(domain, range) {
+ var thresholds;
+
+ function rescale() {
+ var k = 0,
+ n = domain.length,
+ q = range.length;
+ thresholds = [];
+ while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);
+ return scale;
+ }
+
+ function scale(x) {
+ if (isNaN(x = +x)) return NaN;
+ return range[d3.bisect(thresholds, x)];
+ }
+
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ domain = x.filter(function(d) { return !isNaN(d); }).sort(d3.ascending);
+ return rescale();
+ };
+
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ return rescale();
+ };
+
+ scale.quantiles = function() {
+ return thresholds;
+ };
+
+ scale.copy = function() {
+ return d3_scale_quantile(domain, range); // copy on write!
+ };
+
+ return rescale();
+};
+d3.scale.quantize = function() {
+ return d3_scale_quantize(0, 1, [0, 1]);
+};
+
+function d3_scale_quantize(x0, x1, range) {
+ var kx, i;
+
+ function scale(x) {
+ return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];
+ }
+
+ function rescale() {
+ kx = range.length / (x1 - x0);
+ i = range.length - 1;
+ return scale;
+ }
+
+ scale.domain = function(x) {
+ if (!arguments.length) return [x0, x1];
+ x0 = +x[0];
+ x1 = +x[x.length - 1];
+ return rescale();
+ };
+
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ return rescale();
+ };
+
+ scale.copy = function() {
+ return d3_scale_quantize(x0, x1, range); // copy on write
+ };
+
+ return rescale();
+};
+d3.svg = {};
+d3.svg.arc = function() {
+ var innerRadius = d3_svg_arcInnerRadius,
+ outerRadius = d3_svg_arcOuterRadius,
+ startAngle = d3_svg_arcStartAngle,
+ endAngle = d3_svg_arcEndAngle;
+
+ function arc() {
+ var r0 = innerRadius.apply(this, arguments),
+ r1 = outerRadius.apply(this, arguments),
+ a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset,
+ a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset,
+ da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0),
+ df = da < Math.PI ? "0" : "1",
+ c0 = Math.cos(a0),
+ s0 = Math.sin(a0),
+ c1 = Math.cos(a1),
+ s1 = Math.sin(a1);
+ return da >= d3_svg_arcMax
+ ? (r0
+ ? "M0," + r1
+ + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1)
+ + "A" + r1 + "," + r1 + " 0 1,1 0," + r1
+ + "M0," + r0
+ + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0)
+ + "A" + r0 + "," + r0 + " 0 1,0 0," + r0
+ + "Z"
+ : "M0," + r1
+ + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1)
+ + "A" + r1 + "," + r1 + " 0 1,1 0," + r1
+ + "Z")
+ : (r0
+ ? "M" + r1 * c0 + "," + r1 * s0
+ + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1
+ + "L" + r0 * c1 + "," + r0 * s1
+ + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0
+ + "Z"
+ : "M" + r1 * c0 + "," + r1 * s0
+ + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1
+ + "L0,0"
+ + "Z");
+ }
+
+ arc.innerRadius = function(v) {
+ if (!arguments.length) return innerRadius;
+ innerRadius = d3.functor(v);
+ return arc;
+ };
+
+ arc.outerRadius = function(v) {
+ if (!arguments.length) return outerRadius;
+ outerRadius = d3.functor(v);
+ return arc;
+ };
+
+ arc.startAngle = function(v) {
+ if (!arguments.length) return startAngle;
+ startAngle = d3.functor(v);
+ return arc;
+ };
+
+ arc.endAngle = function(v) {
+ if (!arguments.length) return endAngle;
+ endAngle = d3.functor(v);
+ return arc;
+ };
+
+ arc.centroid = function() {
+ var r = (innerRadius.apply(this, arguments)
+ + outerRadius.apply(this, arguments)) / 2,
+ a = (startAngle.apply(this, arguments)
+ + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset;
+ return [Math.cos(a) * r, Math.sin(a) * r];
+ };
+
+ return arc;
+};
+
+var d3_svg_arcOffset = -Math.PI / 2,
+ d3_svg_arcMax = 2 * Math.PI - 1e-6;
+
+function d3_svg_arcInnerRadius(d) {
+ return d.innerRadius;
+}
+
+function d3_svg_arcOuterRadius(d) {
+ return d.outerRadius;
+}
+
+function d3_svg_arcStartAngle(d) {
+ return d.startAngle;
+}
+
+function d3_svg_arcEndAngle(d) {
+ return d.endAngle;
+}
+function d3_svg_line(projection) {
+ var x = d3_svg_lineX,
+ y = d3_svg_lineY,
+ interpolate = "linear",
+ interpolator = d3_svg_lineInterpolators[interpolate],
+ tension = .7;
+
+ function line(d) {
+ return d.length < 1 ? null : "M" + interpolator(projection(d3_svg_linePoints(this, d, x, y)), tension);
+ }
+
+ line.x = function(v) {
+ if (!arguments.length) return x;
+ x = v;
+ return line;
+ };
+
+ line.y = function(v) {
+ if (!arguments.length) return y;
+ y = v;
+ return line;
+ };
+
+ line.interpolate = function(v) {
+ if (!arguments.length) return interpolate;
+ interpolator = d3_svg_lineInterpolators[interpolate = v];
+ return line;
+ };
+
+ line.tension = function(v) {
+ if (!arguments.length) return tension;
+ tension = v;
+ return line;
+ };
+
+ return line;
+}
+
+d3.svg.line = function() {
+ return d3_svg_line(Object);
+};
+
+// Converts the specified array of data into an array of points
+// (x-y tuples), by evaluating the specified `x` and `y` functions on each
+// data point. The `this` context of the evaluated functions is the specified
+// "self" object; each function is passed the current datum and index.
+function d3_svg_linePoints(self, d, x, y) {
+ var points = [],
+ i = -1,
+ n = d.length,
+ fx = typeof x === "function",
+ fy = typeof y === "function",
+ value;
+ if (fx && fy) {
+ while (++i < n) points.push([
+ x.call(self, value = d[i], i),
+ y.call(self, value, i)
+ ]);
+ } else if (fx) {
+ while (++i < n) points.push([x.call(self, d[i], i), y]);
+ } else if (fy) {
+ while (++i < n) points.push([x, y.call(self, d[i], i)]);
+ } else {
+ while (++i < n) points.push([x, y]);
+ }
+ return points;
+}
+
+// The default `x` property, which references d[0].
+function d3_svg_lineX(d) {
+ return d[0];
+}
+
+// The default `y` property, which references d[1].
+function d3_svg_lineY(d) {
+ return d[1];
+}
+
+// The various interpolators supported by the `line` class.
+var d3_svg_lineInterpolators = {
+ "linear": d3_svg_lineLinear,
+ "step-before": d3_svg_lineStepBefore,
+ "step-after": d3_svg_lineStepAfter,
+ "basis": d3_svg_lineBasis,
+ "basis-open": d3_svg_lineBasisOpen,
+ "basis-closed": d3_svg_lineBasisClosed,
+ "bundle": d3_svg_lineBundle,
+ "cardinal": d3_svg_lineCardinal,
+ "cardinal-open": d3_svg_lineCardinalOpen,
+ "cardinal-closed": d3_svg_lineCardinalClosed,
+ "monotone": d3_svg_lineMonotone
+};
+
+// Linear interpolation; generates "L" commands.
+function d3_svg_lineLinear(points) {
+ var i = 0,
+ n = points.length,
+ p = points[0],
+ path = [p[0], ",", p[1]];
+ while (++i < n) path.push("L", (p = points[i])[0], ",", p[1]);
+ return path.join("");
+}
+
+// Step interpolation; generates "H" and "V" commands.
+function d3_svg_lineStepBefore(points) {
+ var i = 0,
+ n = points.length,
+ p = points[0],
+ path = [p[0], ",", p[1]];
+ while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]);
+ return path.join("");
+}
+
+// Step interpolation; generates "H" and "V" commands.
+function d3_svg_lineStepAfter(points) {
+ var i = 0,
+ n = points.length,
+ p = points[0],
+ path = [p[0], ",", p[1]];
+ while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]);
+ return path.join("");
+}
+
+// Open cardinal spline interpolation; generates "C" commands.
+function d3_svg_lineCardinalOpen(points, tension) {
+ return points.length < 4
+ ? d3_svg_lineLinear(points)
+ : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1),
+ d3_svg_lineCardinalTangents(points, tension));
+}
+
+// Closed cardinal spline interpolation; generates "C" commands.
+function d3_svg_lineCardinalClosed(points, tension) {
+ return points.length < 3
+ ? d3_svg_lineLinear(points)
+ : points[0] + d3_svg_lineHermite((points.push(points[0]), points),
+ d3_svg_lineCardinalTangents([points[points.length - 2]]
+ .concat(points, [points[1]]), tension));
+}
+
+// Cardinal spline interpolation; generates "C" commands.
+function d3_svg_lineCardinal(points, tension, closed) {
+ return points.length < 3
+ ? d3_svg_lineLinear(points)
+ : points[0] + d3_svg_lineHermite(points,
+ d3_svg_lineCardinalTangents(points, tension));
+}
+
+// Hermite spline construction; generates "C" commands.
+function d3_svg_lineHermite(points, tangents) {
+ if (tangents.length < 1
+ || (points.length != tangents.length
+ && points.length != tangents.length + 2)) {
+ return d3_svg_lineLinear(points);
+ }
+
+ var quad = points.length != tangents.length,
+ path = "",
+ p0 = points[0],
+ p = points[1],
+ t0 = tangents[0],
+ t = t0,
+ pi = 1;
+
+ if (quad) {
+ path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3)
+ + "," + p[0] + "," + p[1];
+ p0 = points[1];
+ pi = 2;
+ }
+
+ if (tangents.length > 1) {
+ t = tangents[1];
+ p = points[pi];
+ pi++;
+ path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1])
+ + "," + (p[0] - t[0]) + "," + (p[1] - t[1])
+ + "," + p[0] + "," + p[1];
+ for (var i = 2; i < tangents.length; i++, pi++) {
+ p = points[pi];
+ t = tangents[i];
+ path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1])
+ + "," + p[0] + "," + p[1];
+ }
+ }
+
+ if (quad) {
+ var lp = points[pi];
+ path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3)
+ + "," + lp[0] + "," + lp[1];
+ }
+
+ return path;
+}
+
+// Generates tangents for a cardinal spline.
+function d3_svg_lineCardinalTangents(points, tension) {
+ var tangents = [],
+ a = (1 - tension) / 2,
+ p0,
+ p1 = points[0],
+ p2 = points[1],
+ i = 1,
+ n = points.length;
+ while (++i < n) {
+ p0 = p1;
+ p1 = p2;
+ p2 = points[i];
+ tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]);
+ }
+ return tangents;
+}
+
+// B-spline interpolation; generates "C" commands.
+function d3_svg_lineBasis(points) {
+ if (points.length < 3) return d3_svg_lineLinear(points);
+ var i = 1,
+ n = points.length,
+ pi = points[0],
+ x0 = pi[0],
+ y0 = pi[1],
+ px = [x0, x0, x0, (pi = points[1])[0]],
+ py = [y0, y0, y0, pi[1]],
+ path = [x0, ",", y0];
+ d3_svg_lineBasisBezier(path, px, py);
+ while (++i < n) {
+ pi = points[i];
+ px.shift(); px.push(pi[0]);
+ py.shift(); py.push(pi[1]);
+ d3_svg_lineBasisBezier(path, px, py);
+ }
+ i = -1;
+ while (++i < 2) {
+ px.shift(); px.push(pi[0]);
+ py.shift(); py.push(pi[1]);
+ d3_svg_lineBasisBezier(path, px, py);
+ }
+ return path.join("");
+}
+
+// Open B-spline interpolation; generates "C" commands.
+function d3_svg_lineBasisOpen(points) {
+ if (points.length < 4) return d3_svg_lineLinear(points);
+ var path = [],
+ i = -1,
+ n = points.length,
+ pi,
+ px = [0],
+ py = [0];
+ while (++i < 3) {
+ pi = points[i];
+ px.push(pi[0]);
+ py.push(pi[1]);
+ }
+ path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px)
+ + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));
+ --i; while (++i < n) {
+ pi = points[i];
+ px.shift(); px.push(pi[0]);
+ py.shift(); py.push(pi[1]);
+ d3_svg_lineBasisBezier(path, px, py);
+ }
+ return path.join("");
+}
+
+// Closed B-spline interpolation; generates "C" commands.
+function d3_svg_lineBasisClosed(points) {
+ var path,
+ i = -1,
+ n = points.length,
+ m = n + 4,
+ pi,
+ px = [],
+ py = [];
+ while (++i < 4) {
+ pi = points[i % n];
+ px.push(pi[0]);
+ py.push(pi[1]);
+ }
+ path = [
+ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",",
+ d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)
+ ];
+ --i; while (++i < m) {
+ pi = points[i % n];
+ px.shift(); px.push(pi[0]);
+ py.shift(); py.push(pi[1]);
+ d3_svg_lineBasisBezier(path, px, py);
+ }
+ return path.join("");
+}
+
+function d3_svg_lineBundle(points, tension) {
+ var n = points.length - 1,
+ x0 = points[0][0],
+ y0 = points[0][1],
+ dx = points[n][0] - x0,
+ dy = points[n][1] - y0,
+ i = -1,
+ p,
+ t;
+ while (++i <= n) {
+ p = points[i];
+ t = i / n;
+ p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);
+ p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);
+ }
+ return d3_svg_lineBasis(points);
+}
+
+// Returns the dot product of the given four-element vectors.
+function d3_svg_lineDot4(a, b) {
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
+}
+
+// Matrix to transform basis (b-spline) control points to bezier
+// control points. Derived from FvD 11.2.8.
+var d3_svg_lineBasisBezier1 = [0, 2/3, 1/3, 0],
+ d3_svg_lineBasisBezier2 = [0, 1/3, 2/3, 0],
+ d3_svg_lineBasisBezier3 = [0, 1/6, 2/3, 1/6];
+
+// Pushes a "C" Bézier curve onto the specified path array, given the
+// two specified four-element arrays which define the control points.
+function d3_svg_lineBasisBezier(path, x, y) {
+ path.push(
+ "C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x),
+ ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y),
+ ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x),
+ ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y),
+ ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x),
+ ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));
+}
+
+// Computes the slope from points p0 to p1.
+function d3_svg_lineSlope(p0, p1) {
+ return (p1[1] - p0[1]) / (p1[0] - p0[0]);
+}
+
+// Compute three-point differences for the given points.
+// http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference
+function d3_svg_lineFiniteDifferences(points) {
+ var i = 0,
+ j = points.length - 1,
+ m = [],
+ p0 = points[0],
+ p1 = points[1],
+ d = m[0] = d3_svg_lineSlope(p0, p1);
+ while (++i < j) {
+ m[i] = d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]));
+ }
+ m[i] = d;
+ return m;
+}
+
+// Interpolates the given points using Fritsch-Carlson Monotone cubic Hermite
+// interpolation. Returns an array of tangent vectors. For details, see
+// http://en.wikipedia.org/wiki/Monotone_cubic_interpolation
+function d3_svg_lineMonotoneTangents(points) {
+ var tangents = [],
+ d,
+ a,
+ b,
+ s,
+ m = d3_svg_lineFiniteDifferences(points),
+ i = -1,
+ j = points.length - 1;
+
+ // The first two steps are done by computing finite-differences:
+ // 1. Compute the slopes of the secant lines between successive points.
+ // 2. Initialize the tangents at every point as the average of the secants.
+
+ // Then, for each segment…
+ while (++i < j) {
+ d = d3_svg_lineSlope(points[i], points[i + 1]);
+
+ // 3. If two successive yk = y{k + 1} are equal (i.e., d is zero), then set
+ // mk = m{k + 1} = 0 as the spline connecting these points must be flat to
+ // preserve monotonicity. Ignore step 4 and 5 for those k.
+
+ if (Math.abs(d) < 1e-6) {
+ m[i] = m[i + 1] = 0;
+ } else {
+ // 4. Let ak = mk / dk and bk = m{k + 1} / dk.
+ a = m[i] / d;
+ b = m[i + 1] / d;
+
+ // 5. Prevent overshoot and ensure monotonicity by restricting the
+ // magnitude of vector <ak, bk> to a circle of radius 3.
+ s = a * a + b * b;
+ if (s > 9) {
+ s = d * 3 / Math.sqrt(s);
+ m[i] = s * a;
+ m[i + 1] = s * b;
+ }
+ }
+ }
+
+ // Compute the normalized tangent vector from the slopes. Note that if x is
+ // not monotonic, it's possible that the slope will be infinite, so we protect
+ // against NaN by setting the coordinate to zero.
+ i = -1; while (++i <= j) {
+ s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0])
+ / (6 * (1 + m[i] * m[i]));
+ tangents.push([s || 0, m[i] * s || 0]);
+ }
+
+ return tangents;
+}
+
+function d3_svg_lineMonotone(points) {
+ return points.length < 3
+ ? d3_svg_lineLinear(points)
+ : points[0] +
+ d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));
+}
+d3.svg.line.radial = function() {
+ var line = d3_svg_line(d3_svg_lineRadial);
+ line.radius = line.x, delete line.x;
+ line.angle = line.y, delete line.y;
+ return line;
+};
+
+function d3_svg_lineRadial(points) {
+ var point,
+ i = -1,
+ n = points.length,
+ r,
+ a;
+ while (++i < n) {
+ point = points[i];
+ r = point[0];
+ a = point[1] + d3_svg_arcOffset;
+ point[0] = r * Math.cos(a);
+ point[1] = r * Math.sin(a);
+ }
+ return points;
+}
+function d3_svg_area(projection) {
+ var x0 = d3_svg_lineX,
+ x1 = d3_svg_lineX,
+ y0 = 0,
+ y1 = d3_svg_lineY,
+ interpolate,
+ i0,
+ i1,
+ tension = .7;
+
+ function area(d) {
+ if (d.length < 1) return null;
+ var points0 = d3_svg_linePoints(this, d, x0, y0),
+ points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1);
+ return "M" + i0(projection(points1), tension)
+ + "L" + i1(projection(points0.reverse()), tension)
+ + "Z";
+ }
+
+ area.x = function(x) {
+ if (!arguments.length) return x1;
+ x0 = x1 = x;
+ return area;
+ };
+
+ area.x0 = function(x) {
+ if (!arguments.length) return x0;
+ x0 = x;
+ return area;
+ };
+
+ area.x1 = function(x) {
+ if (!arguments.length) return x1;
+ x1 = x;
+ return area;
+ };
+
+ area.y = function(y) {
+ if (!arguments.length) return y1;
+ y0 = y1 = y;
+ return area;
+ };
+
+ area.y0 = function(y) {
+ if (!arguments.length) return y0;
+ y0 = y;
+ return area;
+ };
+
+ area.y1 = function(y) {
+ if (!arguments.length) return y1;
+ y1 = y;
+ return area;
+ };
+
+ area.interpolate = function(x) {
+ if (!arguments.length) return interpolate;
+ i0 = d3_svg_lineInterpolators[interpolate = x];
+ i1 = i0.reverse || i0;
+ return area;
+ };
+
+ area.tension = function(x) {
+ if (!arguments.length) return tension;
+ tension = x;
+ return area;
+ };
+
+ return area.interpolate("linear");
+}
+
+d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;
+d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;
+
+d3.svg.area = function() {
+ return d3_svg_area(Object);
+};
+
+function d3_svg_areaX(points) {
+ return function(d, i) {
+ return points[i][0];
+ };
+}
+
+function d3_svg_areaY(points) {
+ return function(d, i) {
+ return points[i][1];
+ };
+}
+d3.svg.area.radial = function() {
+ var area = d3_svg_area(d3_svg_lineRadial);
+ area.radius = area.x, delete area.x;
+ area.innerRadius = area.x0, delete area.x0;
+ area.outerRadius = area.x1, delete area.x1;
+ area.angle = area.y, delete area.y;
+ area.startAngle = area.y0, delete area.y0;
+ area.endAngle = area.y1, delete area.y1;
+ return area;
+};
+d3.svg.chord = function() {
+ var source = d3_svg_chordSource,
+ target = d3_svg_chordTarget,
+ radius = d3_svg_chordRadius,
+ startAngle = d3_svg_arcStartAngle,
+ endAngle = d3_svg_arcEndAngle;
+
+ // TODO Allow control point to be customized.
+
+ function chord(d, i) {
+ var s = subgroup(this, source, d, i),
+ t = subgroup(this, target, d, i);
+ return "M" + s.p0
+ + arc(s.r, s.p1) + (equals(s, t)
+ ? curve(s.r, s.p1, s.r, s.p0)
+ : curve(s.r, s.p1, t.r, t.p0)
+ + arc(t.r, t.p1)
+ + curve(t.r, t.p1, s.r, s.p0))
+ + "Z";
+ }
+
+ function subgroup(self, f, d, i) {
+ var subgroup = f.call(self, d, i),
+ r = radius.call(self, subgroup, i),
+ a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset,
+ a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset;
+ return {
+ r: r,
+ a0: a0,
+ a1: a1,
+ p0: [r * Math.cos(a0), r * Math.sin(a0)],
+ p1: [r * Math.cos(a1), r * Math.sin(a1)]
+ };
+ }
+
+ function equals(a, b) {
+ return a.a0 == b.a0 && a.a1 == b.a1;
+ }
+
+ function arc(r, p) {
+ return "A" + r + "," + r + " 0 0,1 " + p;
+ }
+
+ function curve(r0, p0, r1, p1) {
+ return "Q 0,0 " + p1;
+ }
+
+ chord.radius = function(v) {
+ if (!arguments.length) return radius;
+ radius = d3.functor(v);
+ return chord;
+ };
+
+ chord.source = function(v) {
+ if (!arguments.length) return source;
+ source = d3.functor(v);
+ return chord;
+ };
+
+ chord.target = function(v) {
+ if (!arguments.length) return target;
+ target = d3.functor(v);
+ return chord;
+ };
+
+ chord.startAngle = function(v) {
+ if (!arguments.length) return startAngle;
+ startAngle = d3.functor(v);
+ return chord;
+ };
+
+ chord.endAngle = function(v) {
+ if (!arguments.length) return endAngle;
+ endAngle = d3.functor(v);
+ return chord;
+ };
+
+ return chord;
+};
+
+function d3_svg_chordSource(d) {
+ return d.source;
+}
+
+function d3_svg_chordTarget(d) {
+ return d.target;
+}
+
+function d3_svg_chordRadius(d) {
+ return d.radius;
+}
+
+function d3_svg_chordStartAngle(d) {
+ return d.startAngle;
+}
+
+function d3_svg_chordEndAngle(d) {
+ return d.endAngle;
+}
+d3.svg.diagonal = function() {
+ var source = d3_svg_chordSource,
+ target = d3_svg_chordTarget,
+ projection = d3_svg_diagonalProjection;
+
+ function diagonal(d, i) {
+ var p0 = source.call(this, d, i),
+ p3 = target.call(this, d, i),
+ m = (p0.y + p3.y) / 2,
+ p = [p0, {x: p0.x, y: m}, {x: p3.x, y: m}, p3];
+ p = p.map(projection);
+ return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3];
+ }
+
+ diagonal.source = function(x) {
+ if (!arguments.length) return source;
+ source = d3.functor(x);
+ return diagonal;
+ };
+
+ diagonal.target = function(x) {
+ if (!arguments.length) return target;
+ target = d3.functor(x);
+ return diagonal;
+ };
+
+ diagonal.projection = function(x) {
+ if (!arguments.length) return projection;
+ projection = x;
+ return diagonal;
+ };
+
+ return diagonal;
+};
+
+function d3_svg_diagonalProjection(d) {
+ return [d.x, d.y];
+}
+d3.svg.diagonal.radial = function() {
+ var diagonal = d3.svg.diagonal(),
+ projection = d3_svg_diagonalProjection,
+ projection_ = diagonal.projection;
+
+ diagonal.projection = function(x) {
+ return arguments.length
+ ? projection_(d3_svg_diagonalRadialProjection(projection = x))
+ : projection;
+ };
+
+ return diagonal;
+};
+
+function d3_svg_diagonalRadialProjection(projection) {
+ return function() {
+ var d = projection.apply(this, arguments),
+ r = d[0],
+ a = d[1] + d3_svg_arcOffset;
+ return [r * Math.cos(a), r * Math.sin(a)];
+ };
+}
+d3.svg.mouse = function(container) {
+ return d3_svg_mousePoint(container, d3.event);
+};
+
+// https://bugs.webkit.org/show_bug.cgi?id=44083
+var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0;
+
+function d3_svg_mousePoint(container, e) {
+ var point = (container.ownerSVGElement || container).createSVGPoint();
+ if ((d3_mouse_bug44083 < 0) && (window.scrollX || window.scrollY)) {
+ var svg = d3.select(document.body)
+ .append("svg")
+ .style("position", "absolute")
+ .style("top", 0)
+ .style("left", 0);
+ var ctm = svg[0][0].getScreenCTM();
+ d3_mouse_bug44083 = !(ctm.f || ctm.e);
+ svg.remove();
+ }
+ if (d3_mouse_bug44083) {
+ point.x = e.pageX;
+ point.y = e.pageY;
+ } else {
+ point.x = e.clientX;
+ point.y = e.clientY;
+ }
+ point = point.matrixTransform(container.getScreenCTM().inverse());
+ return [point.x, point.y];
+};
+d3.svg.touches = function(container, touches) {
+ if (arguments.length < 2) touches = d3.event.touches;
+
+ return touches ? d3_array(touches).map(function(touch) {
+ var point = d3_svg_mousePoint(container, touch);
+ point.identifier = touch.identifier;
+ return point;
+ }) : [];
+};
+d3.svg.symbol = function() {
+ var type = d3_svg_symbolType,
+ size = d3_svg_symbolSize;
+
+ function symbol(d, i) {
+ return (d3_svg_symbols[type.call(this, d, i)]
+ || d3_svg_symbols.circle)
+ (size.call(this, d, i));
+ }
+
+ symbol.type = function(x) {
+ if (!arguments.length) return type;
+ type = d3.functor(x);
+ return symbol;
+ };
+
+ // size of symbol in square pixels
+ symbol.size = function(x) {
+ if (!arguments.length) return size;
+ size = d3.functor(x);
+ return symbol;
+ };
+
+ return symbol;
+};
+
+function d3_svg_symbolSize() {
+ return 64;
+}
+
+function d3_svg_symbolType() {
+ return "circle";
+}
+
+// TODO cross-diagonal?
+var d3_svg_symbols = {
+ "circle": function(size) {
+ var r = Math.sqrt(size / Math.PI);
+ return "M0," + r
+ + "A" + r + "," + r + " 0 1,1 0," + (-r)
+ + "A" + r + "," + r + " 0 1,1 0," + r
+ + "Z";
+ },
+ "cross": function(size) {
+ var r = Math.sqrt(size / 5) / 2;
+ return "M" + -3 * r + "," + -r
+ + "H" + -r
+ + "V" + -3 * r
+ + "H" + r
+ + "V" + -r
+ + "H" + 3 * r
+ + "V" + r
+ + "H" + r
+ + "V" + 3 * r
+ + "H" + -r
+ + "V" + r
+ + "H" + -3 * r
+ + "Z";
+ },
+ "diamond": function(size) {
+ var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)),
+ rx = ry * d3_svg_symbolTan30;
+ return "M0," + -ry
+ + "L" + rx + ",0"
+ + " 0," + ry
+ + " " + -rx + ",0"
+ + "Z";
+ },
+ "square": function(size) {
+ var r = Math.sqrt(size) / 2;
+ return "M" + -r + "," + -r
+ + "L" + r + "," + -r
+ + " " + r + "," + r
+ + " " + -r + "," + r
+ + "Z";
+ },
+ "triangle-down": function(size) {
+ var rx = Math.sqrt(size / d3_svg_symbolSqrt3),
+ ry = rx * d3_svg_symbolSqrt3 / 2;
+ return "M0," + ry
+ + "L" + rx +"," + -ry
+ + " " + -rx + "," + -ry
+ + "Z";
+ },
+ "triangle-up": function(size) {
+ var rx = Math.sqrt(size / d3_svg_symbolSqrt3),
+ ry = rx * d3_svg_symbolSqrt3 / 2;
+ return "M0," + -ry
+ + "L" + rx +"," + ry
+ + " " + -rx + "," + ry
+ + "Z";
+ }
+};
+
+d3.svg.symbolTypes = d3.keys(d3_svg_symbols);
+
+var d3_svg_symbolSqrt3 = Math.sqrt(3),
+ d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180);
+d3.svg.axis = function() {
+ var scale = d3.scale.linear(),
+ orient = "bottom",
+ tickMajorSize = 6,
+ tickMinorSize = 6,
+ tickEndSize = 6,
+ tickPadding = 3,
+ tickArguments_ = [10],
+ tickFormat_,
+ tickSubdivide = 0;
+
+ function axis(selection) {
+ selection.each(function(d, i, j) {
+ var g = d3.select(this);
+
+ // If selection is a transition, create subtransitions.
+ var transition = selection.delay ? function(o) {
+ var id = d3_transitionInheritId;
+ try {
+ d3_transitionInheritId = selection.id;
+ return o.transition()
+ .delay(selection[j][i].delay)
+ .duration(selection[j][i].duration)
+ .ease(selection.ease());
+ } finally {
+ d3_transitionInheritId = id;
+ }
+ } : Object;
+
+ // Ticks, or domain values for ordinal scales.
+ var ticks = scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain(),
+ tickFormat = tickFormat_ == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String) : tickFormat_;
+
+ // Minor ticks.
+ var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide),
+ subtick = g.selectAll(".minor").data(subticks, String),
+ subtickEnter = subtick.enter().insert("line", "g").attr("class", "tick minor").style("opacity", 1e-6),
+ subtickExit = transition(subtick.exit()).style("opacity", 1e-6).remove(),
+ subtickUpdate = transition(subtick).style("opacity", 1);
+
+ // Major ticks.
+ var tick = g.selectAll("g").data(ticks, String),
+ tickEnter = tick.enter().insert("g", "path").style("opacity", 1e-6),
+ tickExit = transition(tick.exit()).style("opacity", 1e-6).remove(),
+ tickUpdate = transition(tick).style("opacity", 1),
+ tickTransform;
+
+ // Domain.
+ var range = d3_scaleRange(scale),
+ path = g.selectAll(".domain").data([0]),
+ pathEnter = path.enter().append("path").attr("class", "domain"),
+ pathUpdate = transition(path);
+
+ // Stash a snapshot of the new scale, and retrieve the old snapshot.
+ var scale1 = scale.copy(),
+ scale0 = this.__chart__ || scale1;
+ this.__chart__ = scale1;
+
+ tickEnter.append("line").attr("class", "tick");
+ tickEnter.append("text");
+ tickUpdate.select("text").text(tickFormat);
+
+ switch (orient) {
+ case "bottom": {
+ tickTransform = d3_svg_axisX;
+ subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize);
+ tickUpdate.select("line").attr("x2", 0).attr("y2", tickMajorSize);
+ tickUpdate.select("text").attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding).attr("dy", ".71em").attr("text-anchor", "middle");
+ pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize);
+ break;
+ }
+ case "top": {
+ tickTransform = d3_svg_axisX;
+ subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize);
+ tickUpdate.select("line").attr("x2", 0).attr("y2", -tickMajorSize);
+ tickUpdate.select("text").attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("dy", "0em").attr("text-anchor", "middle");
+ pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize);
+ break;
+ }
+ case "left": {
+ tickTransform = d3_svg_axisY;
+ subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0);
+ tickUpdate.select("line").attr("x2", -tickMajorSize).attr("y2", 0);
+ tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "end");
+ pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize);
+ break;
+ }
+ case "right": {
+ tickTransform = d3_svg_axisY;
+ subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0);
+ tickUpdate.select("line").attr("x2", tickMajorSize).attr("y2", 0);
+ tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "start");
+ pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize);
+ break;
+ }
+ }
+
+ // For quantitative scales:
+ // - enter new ticks from the old scale
+ // - exit old ticks to the new scale
+ if (scale.ticks) {
+ tickEnter.call(tickTransform, scale0);
+ tickUpdate.call(tickTransform, scale1);
+ tickExit.call(tickTransform, scale1);
+ subtickEnter.call(tickTransform, scale0);
+ subtickUpdate.call(tickTransform, scale1);
+ subtickExit.call(tickTransform, scale1);
+ }
+
+ // For ordinal scales:
+ // - any entering ticks are undefined in the old scale
+ // - any exiting ticks are undefined in the new scale
+ // Therefore, we only need to transition updating ticks.
+ else {
+ var dx = scale1.rangeBand() / 2, x = function(d) { return scale1(d) + dx; };
+ tickEnter.call(tickTransform, x);
+ tickUpdate.call(tickTransform, x);
+ }
+ });
+ }
+
+ axis.scale = function(x) {
+ if (!arguments.length) return scale;
+ scale = x;
+ return axis;
+ };
+
+ axis.orient = function(x) {
+ if (!arguments.length) return orient;
+ orient = x;
+ return axis;
+ };
+
+ axis.ticks = function() {
+ if (!arguments.length) return tickArguments_;
+ tickArguments_ = arguments;
+ return axis;
+ };
+
+ axis.tickFormat = function(x) {
+ if (!arguments.length) return tickFormat_;
+ tickFormat_ = x;
+ return axis;
+ };
+
+ axis.tickSize = function(x, y, z) {
+ if (!arguments.length) return tickMajorSize;
+ var n = arguments.length - 1;
+ tickMajorSize = +x;
+ tickMinorSize = n > 1 ? +y : tickMajorSize;
+ tickEndSize = n > 0 ? +arguments[n] : tickMajorSize;
+ return axis;
+ };
+
+ axis.tickPadding = function(x) {
+ if (!arguments.length) return tickPadding;
+ tickPadding = +x;
+ return axis;
+ };
+
+ axis.tickSubdivide = function(x) {
+ if (!arguments.length) return tickSubdivide;
+ tickSubdivide = +x;
+ return axis;
+ };
+
+ return axis;
+};
+
+function d3_svg_axisX(selection, x) {
+ selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; });
+}
+
+function d3_svg_axisY(selection, y) {
+ selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; });
+}
+
+function d3_svg_axisSubdivide(scale, ticks, m) {
+ subticks = [];
+ if (m && ticks.length > 1) {
+ var extent = d3_scaleExtent(scale.domain()),
+ subticks,
+ i = -1,
+ n = ticks.length,
+ d = (ticks[1] - ticks[0]) / ++m,
+ j,
+ v;
+ while (++i < n) {
+ for (j = m; --j > 0;) {
+ if ((v = +ticks[i] - j * d) >= extent[0]) {
+ subticks.push(v);
+ }
+ }
+ }
+ for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) {
+ subticks.push(v);
+ }
+ }
+ return subticks;
+}
+d3.svg.brush = function() {
+ var event = d3.dispatch("brushstart", "brush", "brushend"),
+ x, // x-scale, optional
+ y, // y-scale, optional
+ extent = [[0, 0], [0, 0]]; // [x0, y0], [x1, y1]
+
+ function brush(g) {
+ var resizes = x && y ? ["n", "e", "s", "w", "nw", "ne", "se", "sw"]
+ : x ? ["e", "w"]
+ : y ? ["n", "s"]
+ : [];
+
+ g.each(function() {
+ var g = d3.select(this).on("mousedown.brush", down),
+ bg = g.selectAll(".background").data([,]),
+ fg = g.selectAll(".extent").data([,]),
+ tz = g.selectAll(".resize").data(resizes, String),
+ e;
+
+ // An invisible, mouseable area for starting a new brush.
+ bg.enter().append("rect")
+ .attr("class", "background")
+ .style("visibility", "hidden")
+ .style("pointer-events", "all")
+ .style("cursor", "crosshair");
+
+ // The visible brush extent; style this as you like!
+ fg.enter().append("rect")
+ .attr("class", "extent")
+ .style("cursor", "move");
+
+ // More invisible rects for resizing the extent.
+ tz.enter().append("rect")
+ .attr("class", function(d) { return "resize " + d; })
+ .attr("width", 6)
+ .attr("height", 6)
+ .style("visibility", "hidden")
+ .style("pointer-events", brush.empty() ? "none" : "all")
+ .style("cursor", function(d) { return d3_svg_brushCursor[d]; });
+
+ // Remove any superfluous resizers.
+ tz.exit().remove();
+
+ // Initialize the background to fill the defined range.
+ // If the range isn't defined, you can post-process.
+ if (x) {
+ e = d3_scaleRange(x);
+ bg.attr("x", e[0]).attr("width", e[1] - e[0]);
+ d3_svg_brushRedrawX(g, extent);
+ }
+ if (y) {
+ e = d3_scaleRange(y);
+ bg.attr("y", e[0]).attr("height", e[1] - e[0]);
+ d3_svg_brushRedrawY(g, extent);
+ }
+ });
+ }
+
+ function down() {
+ var target = d3.select(d3.event.target);
+
+ // Store some global state for the duration of the brush gesture.
+ d3_svg_brush = brush;
+ d3_svg_brushTarget = this;
+ d3_svg_brushExtent = extent;
+ d3_svg_brushOffset = d3.svg.mouse(d3_svg_brushTarget);
+
+ // If the extent was clicked on, drag rather than brush;
+ // store the offset between the mouse and extent origin instead.
+ if (d3_svg_brushDrag = target.classed("extent")) {
+ d3_svg_brushOffset[0] = extent[0][0] - d3_svg_brushOffset[0];
+ d3_svg_brushOffset[1] = extent[0][1] - d3_svg_brushOffset[1];
+ }
+
+ // If a resizer was clicked on, record which side is to be resized.
+ // Also, set the offset to the opposite side.
+ else if (target.classed("resize")) {
+ d3_svg_brushResize = d3.event.target.__data__;
+ d3_svg_brushOffset[0] = extent[+/w$/.test(d3_svg_brushResize)][0];
+ d3_svg_brushOffset[1] = extent[+/^n/.test(d3_svg_brushResize)][1];
+ }
+
+ // If the ALT key is down when starting a brush, the center is at the mouse.
+ else if (d3.event.altKey) {
+ d3_svg_brushCenter = d3_svg_brushOffset.slice();
+ }
+
+ // Restrict which dimensions are resized.
+ d3_svg_brushX = !/^(n|s)$/.test(d3_svg_brushResize) && x;
+ d3_svg_brushY = !/^(e|w)$/.test(d3_svg_brushResize) && y;
+
+ // Notify listeners.
+ d3_svg_brushDispatch = dispatcher(this, arguments);
+ d3_svg_brushDispatch("brushstart");
+ d3_svg_brushMove();
+ d3_eventCancel();
+ }
+
+ function dispatcher(that, argumentz) {
+ return function(type) {
+ var e = d3.event;
+ try {
+ d3.event = {type: type, target: brush};
+ event[type].apply(that, argumentz);
+ } finally {
+ d3.event = e;
+ }
+ };
+ }
+
+ brush.x = function(z) {
+ if (!arguments.length) return x;
+ x = z;
+ return brush;
+ };
+
+ brush.y = function(z) {
+ if (!arguments.length) return y;
+ y = z;
+ return brush;
+ };
+
+ brush.extent = function(z) {
+ var x0, x1, y0, y1, t;
+
+ // Invert the pixel extent to data-space.
+ if (!arguments.length) {
+ if (x) {
+ x0 = extent[0][0], x1 = extent[1][0];
+ if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
+ if (x1 < x0) t = x0, x0 = x1, x1 = t;
+ }
+ if (y) {
+ y0 = extent[0][1], y1 = extent[1][1];
+ if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
+ if (y1 < y0) t = y0, y0 = y1, y1 = t;
+ }
+ return x && y ? [[x0, y0], [x1, y1]] : x ? [x0, x1] : y && [y0, y1];
+ }
+
+ // Scale the data-space extent to pixels.
+ if (x) {
+ x0 = z[0], x1 = z[1];
+ if (y) x0 = x0[0], x1 = x1[0];
+ if (x.invert) x0 = x(x0), x1 = x(x1);
+ if (x1 < x0) t = x0, x0 = x1, x1 = t;
+ extent[0][0] = x0, extent[1][0] = x1;
+ }
+ if (y) {
+ y0 = z[0], y1 = z[1];
+ if (x) y0 = y0[1], y1 = y1[1];
+ if (y.invert) y0 = y(y0), y1 = y(y1);
+ if (y1 < y0) t = y0, y0 = y1, y1 = t;
+ extent[0][1] = y0, extent[1][1] = y1;
+ }
+
+ return brush;
+ };
+
+ brush.clear = function() {
+ extent[0][0] =
+ extent[0][1] =
+ extent[1][0] =
+ extent[1][1] = 0;
+ return brush;
+ };
+
+ brush.empty = function() {
+ return (x && extent[0][0] === extent[1][0])
+ || (y && extent[0][1] === extent[1][1]);
+ };
+
+ d3.select(window)
+ .on("mousemove.brush", d3_svg_brushMove)
+ .on("mouseup.brush", d3_svg_brushUp)
+ .on("keydown.brush", d3_svg_brushKeydown)
+ .on("keyup.brush", d3_svg_brushKeyup);
+
+ return d3.rebind(brush, event, "on");
+};
+
+var d3_svg_brush,
+ d3_svg_brushDispatch,
+ d3_svg_brushTarget,
+ d3_svg_brushX,
+ d3_svg_brushY,
+ d3_svg_brushExtent,
+ d3_svg_brushDrag,
+ d3_svg_brushResize,
+ d3_svg_brushCenter,
+ d3_svg_brushOffset;
+
+function d3_svg_brushRedrawX(g, extent) {
+ g.select(".extent").attr("x", extent[0][0]);
+ g.selectAll(".n,.s,.w,.nw,.sw").attr("x", extent[0][0] - 2);
+ g.selectAll(".e,.ne,.se").attr("x", extent[1][0] - 3);
+ g.selectAll(".extent,.n,.s").attr("width", extent[1][0] - extent[0][0]);
+}
+
+function d3_svg_brushRedrawY(g, extent) {
+ g.select(".extent").attr("y", extent[0][1]);
+ g.selectAll(".n,.e,.w,.nw,.ne").attr("y", extent[0][1] - 3);
+ g.selectAll(".s,.se,.sw").attr("y", extent[1][1] - 4);
+ g.selectAll(".extent,.e,.w").attr("height", extent[1][1] - extent[0][1]);
+}
+
+function d3_svg_brushKeydown() {
+ if (d3.event.keyCode == 32 && d3_svg_brushTarget && !d3_svg_brushDrag) {
+ d3_svg_brushCenter = null;
+ d3_svg_brushOffset[0] -= d3_svg_brushExtent[1][0];
+ d3_svg_brushOffset[1] -= d3_svg_brushExtent[1][1];
+ d3_svg_brushDrag = 2;
+ d3_eventCancel();
+ }
+}
+
+function d3_svg_brushKeyup() {
+ if (d3.event.keyCode == 32 && d3_svg_brushDrag == 2) {
+ d3_svg_brushOffset[0] += d3_svg_brushExtent[1][0];
+ d3_svg_brushOffset[1] += d3_svg_brushExtent[1][1];
+ d3_svg_brushDrag = 0;
+ d3_eventCancel();
+ }
+}
+
+function d3_svg_brushMove() {
+ if (d3_svg_brushOffset) {
+ var mouse = d3.svg.mouse(d3_svg_brushTarget),
+ g = d3.select(d3_svg_brushTarget);
+
+ if (!d3_svg_brushDrag) {
+
+ // If needed, determine the center from the current extent.
+ if (d3.event.altKey) {
+ if (!d3_svg_brushCenter) {
+ d3_svg_brushCenter = [
+ (d3_svg_brushExtent[0][0] + d3_svg_brushExtent[1][0]) / 2,
+ (d3_svg_brushExtent[0][1] + d3_svg_brushExtent[1][1]) / 2
+ ];
+ }
+
+ // Update the offset, for when the ALT key is released.
+ d3_svg_brushOffset[0] = d3_svg_brushExtent[+(mouse[0] < d3_svg_brushCenter[0])][0];
+ d3_svg_brushOffset[1] = d3_svg_brushExtent[+(mouse[1] < d3_svg_brushCenter[1])][1];
+ }
+
+ // When the ALT key is released, we clear the center.
+ else d3_svg_brushCenter = null;
+ }
+
+ // Update the brush extent for each dimension.
+ if (d3_svg_brushX) {
+ d3_svg_brushMove1(mouse, d3_svg_brushX, 0);
+ d3_svg_brushRedrawX(g, d3_svg_brushExtent);
+ }
+ if (d3_svg_brushY) {
+ d3_svg_brushMove1(mouse, d3_svg_brushY, 1);
+ d3_svg_brushRedrawY(g, d3_svg_brushExtent);
+ }
+
+ // Notify listeners.
+ d3_svg_brushDispatch("brush");
+ }
+}
+
+function d3_svg_brushMove1(mouse, scale, i) {
+ var range = d3_scaleRange(scale),
+ r0 = range[0],
+ r1 = range[1],
+ offset = d3_svg_brushOffset[i],
+ size = d3_svg_brushExtent[1][i] - d3_svg_brushExtent[0][i],
+ min,
+ max;
+
+ // When dragging, reduce the range by the extent size and offset.
+ if (d3_svg_brushDrag) {
+ r0 -= offset;
+ r1 -= size + offset;
+ }
+
+ // Clamp the mouse so that the extent fits within the range extent.
+ min = Math.max(r0, Math.min(r1, mouse[i]));
+
+ // Compute the new extent bounds.
+ if (d3_svg_brushDrag) {
+ max = (min += offset) + size;
+ } else {
+
+ // If the ALT key is pressed, then preserve the center of the extent.
+ if (d3_svg_brushCenter) offset = Math.max(r0, Math.min(r1, 2 * d3_svg_brushCenter[i] - min));
+
+ // Compute the min and max of the offset and mouse.
+ if (offset < min) {
+ max = min;
+ min = offset;
+ } else {
+ max = offset;
+ }
+ }
+
+ // Update the stored bounds.
+ d3_svg_brushExtent[0][i] = min;
+ d3_svg_brushExtent[1][i] = max;
+}
+
+function d3_svg_brushUp() {
+ if (d3_svg_brushOffset) {
+ d3_svg_brushMove();
+ d3.select(d3_svg_brushTarget).selectAll(".resize").style("pointer-events", d3_svg_brush.empty() ? "none" : "all");
+ d3_svg_brushDispatch("brushend");
+ d3_svg_brush =
+ d3_svg_brushDispatch =
+ d3_svg_brushTarget =
+ d3_svg_brushX =
+ d3_svg_brushY =
+ d3_svg_brushExtent =
+ d3_svg_brushDrag =
+ d3_svg_brushResize =
+ d3_svg_brushCenter =
+ d3_svg_brushOffset = null;
+ d3_eventCancel();
+ }
+}
+
+var d3_svg_brushCursor = {
+ n: "ns-resize",
+ e: "ew-resize",
+ s: "ns-resize",
+ w: "ew-resize",
+ nw: "nwse-resize",
+ ne: "nesw-resize",
+ se: "nwse-resize",
+ sw: "nesw-resize"
+};
+d3.behavior = {};
+// TODO Track touch points by identifier.
+
+d3.behavior.drag = function() {
+ var event = d3.dispatch("drag", "dragstart", "dragend"),
+ origin = null;
+
+ function drag() {
+ this
+ .on("mousedown.drag", mousedown)
+ .on("touchstart.drag", mousedown);
+
+ d3.select(window)
+ .on("mousemove.drag", d3_behavior_dragMove)
+ .on("touchmove.drag", d3_behavior_dragMove)
+ .on("mouseup.drag", d3_behavior_dragUp, true)
+ .on("touchend.drag", d3_behavior_dragUp, true)
+ .on("click.drag", d3_behavior_dragClick, true);
+ }
+
+ // snapshot the local context for subsequent dispatch
+ function start() {
+ d3_behavior_dragEvent = event;
+ d3_behavior_dragEventTarget = d3.event.target;
+ d3_behavior_dragTarget = this;
+ d3_behavior_dragArguments = arguments;
+ d3_behavior_dragOrigin = d3_behavior_dragPoint();
+ if (origin) {
+ d3_behavior_dragOffset = origin.apply(d3_behavior_dragTarget, d3_behavior_dragArguments);
+ d3_behavior_dragOffset = [d3_behavior_dragOffset.x - d3_behavior_dragOrigin[0], d3_behavior_dragOffset.y - d3_behavior_dragOrigin[1]];
+ } else {
+ d3_behavior_dragOffset = [0, 0];
+ }
+ d3_behavior_dragMoved = 0;
+ }
+
+ function mousedown() {
+ start.apply(this, arguments);
+ d3_behavior_dragDispatch("dragstart");
+ }
+
+ drag.origin = function(x) {
+ if (!arguments.length) return origin;
+ origin = x;
+ return drag;
+ };
+
+ return d3.rebind(drag, event, "on");
+};
+
+var d3_behavior_dragEvent,
+ d3_behavior_dragEventTarget,
+ d3_behavior_dragTarget,
+ d3_behavior_dragArguments,
+ d3_behavior_dragOffset,
+ d3_behavior_dragOrigin,
+ d3_behavior_dragMoved;
+
+function d3_behavior_dragDispatch(type) {
+ var p = d3_behavior_dragPoint(),
+ o = d3.event,
+ e = d3.event = {type: type};
+
+ if (p) {
+ e.x = p[0] + d3_behavior_dragOffset[0];
+ e.y = p[1] + d3_behavior_dragOffset[1];
+ e.dx = p[0] - d3_behavior_dragOrigin[0];
+ e.dy = p[1] - d3_behavior_dragOrigin[1];
+ d3_behavior_dragMoved |= e.dx | e.dy;
+ d3_behavior_dragOrigin = p;
+ }
+
+ try {
+ d3_behavior_dragEvent[type].apply(d3_behavior_dragTarget, d3_behavior_dragArguments);
+ } finally {
+ d3.event = o;
+ }
+
+ o.stopPropagation();
+ o.preventDefault();
+}
+
+function d3_behavior_dragPoint() {
+ var p = d3_behavior_dragTarget.parentNode,
+ t = d3.event.changedTouches;
+ return p && (t
+ ? d3.svg.touches(p, t)[0]
+ : d3.svg.mouse(p));
+}
+
+function d3_behavior_dragMove() {
+ if (!d3_behavior_dragTarget) return;
+ var parent = d3_behavior_dragTarget.parentNode;
+
+ // O NOES! The drag element was removed from the DOM.
+ if (!parent) return d3_behavior_dragUp();
+
+ d3_behavior_dragDispatch("drag");
+ d3_eventCancel();
+}
+
+function d3_behavior_dragUp() {
+ if (!d3_behavior_dragTarget) return;
+ d3_behavior_dragDispatch("dragend");
+
+ // If the node was moved, prevent the mouseup from propagating.
+ // Also prevent the subsequent click from propagating (e.g., for anchors).
+ if (d3_behavior_dragMoved) {
+ d3_eventCancel();
+ d3_behavior_dragMoved = d3.event.target === d3_behavior_dragEventTarget;
+ }
+
+ d3_behavior_dragEvent =
+ d3_behavior_dragEventTarget =
+ d3_behavior_dragTarget =
+ d3_behavior_dragArguments =
+ d3_behavior_dragOffset =
+ d3_behavior_dragOrigin = null;
+}
+
+function d3_behavior_dragClick() {
+ if (d3_behavior_dragMoved) {
+ d3_eventCancel();
+ d3_behavior_dragMoved = 0;
+ }
+}
+// TODO unbind zoom behavior?
+d3.behavior.zoom = function() {
+ var xyz = [0, 0, 0],
+ event = d3.dispatch("zoom"),
+ extent = d3_behavior_zoomInfiniteExtent;
+
+ function zoom() {
+ this
+ .on("mousedown.zoom", mousedown)
+ .on("mousewheel.zoom", mousewheel)
+ .on("DOMMouseScroll.zoom", mousewheel)
+ .on("dblclick.zoom", dblclick)
+ .on("touchstart.zoom", touchstart);
+
+ d3.select(window)
+ .on("mousemove.zoom", d3_behavior_zoomMousemove)
+ .on("mouseup.zoom", d3_behavior_zoomMouseup)
+ .on("touchmove.zoom", d3_behavior_zoomTouchmove)
+ .on("touchend.zoom", d3_behavior_zoomTouchup)
+ .on("click.zoom", d3_behavior_zoomClick, true);
+ }
+
+ // snapshot the local context for subsequent dispatch
+ function start() {
+ d3_behavior_zoomXyz = xyz;
+ d3_behavior_zoomExtent = extent;
+ d3_behavior_zoomDispatch = event.zoom;
+ d3_behavior_zoomEventTarget = d3.event.target;
+ d3_behavior_zoomTarget = this;
+ d3_behavior_zoomArguments = arguments;
+ }
+
+ function mousedown() {
+ start.apply(this, arguments);
+ d3_behavior_zoomPanning = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget));
+ d3_behavior_zoomMoved = 0;
+ d3.event.preventDefault();
+ window.focus();
+ }
+
+ // store starting mouse location
+ function mousewheel() {
+ start.apply(this, arguments);
+ if (!d3_behavior_zoomZooming) d3_behavior_zoomZooming = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget));
+ d3_behavior_zoomTo(d3_behavior_zoomDelta() + xyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomZooming);
+ }
+
+ function dblclick() {
+ start.apply(this, arguments);
+ var mouse = d3.svg.mouse(d3_behavior_zoomTarget);
+ d3_behavior_zoomTo(d3.event.shiftKey ? Math.ceil(xyz[2] - 1) : Math.floor(xyz[2] + 1), mouse, d3_behavior_zoomLocation(mouse));
+ }
+
+ // doubletap detection
+ function touchstart() {
+ start.apply(this, arguments);
+ var touches = d3_behavior_zoomTouchup(),
+ touch,
+ now = Date.now();
+ if ((touches.length === 1) && (now - d3_behavior_zoomLast < 300)) {
+ d3_behavior_zoomTo(1 + Math.floor(xyz[2]), touch = touches[0], d3_behavior_zoomLocations[touch.identifier]);
+ }
+ d3_behavior_zoomLast = now;
+ }
+
+ zoom.extent = function(x) {
+ if (!arguments.length) return extent;
+ extent = x == null ? d3_behavior_zoomInfiniteExtent : x;
+ return zoom;
+ };
+
+ return d3.rebind(zoom, event, "on");
+};
+
+var d3_behavior_zoomDiv,
+ d3_behavior_zoomPanning,
+ d3_behavior_zoomZooming,
+ d3_behavior_zoomLocations = {}, // identifier -> location
+ d3_behavior_zoomLast = 0,
+ d3_behavior_zoomXyz,
+ d3_behavior_zoomExtent,
+ d3_behavior_zoomDispatch,
+ d3_behavior_zoomEventTarget,
+ d3_behavior_zoomTarget,
+ d3_behavior_zoomArguments,
+ d3_behavior_zoomMoved;
+
+function d3_behavior_zoomLocation(point) {
+ return [
+ point[0] - d3_behavior_zoomXyz[0],
+ point[1] - d3_behavior_zoomXyz[1],
+ d3_behavior_zoomXyz[2]
+ ];
+}
+
+// detect the pixels that would be scrolled by this wheel event
+function d3_behavior_zoomDelta() {
+
+ // mousewheel events are totally broken!
+ // https://bugs.webkit.org/show_bug.cgi?id=40441
+ // not only that, but Chrome and Safari differ in re. to acceleration!
+ if (!d3_behavior_zoomDiv) {
+ d3_behavior_zoomDiv = d3.select("body").append("div")
+ .style("visibility", "hidden")
+ .style("top", 0)
+ .style("height", 0)
+ .style("width", 0)
+ .style("overflow-y", "scroll")
+ .append("div")
+ .style("height", "2000px")
+ .node().parentNode;
+ }
+
+ var e = d3.event, delta;
+ try {
+ d3_behavior_zoomDiv.scrollTop = 1000;
+ d3_behavior_zoomDiv.dispatchEvent(e);
+ delta = 1000 - d3_behavior_zoomDiv.scrollTop;
+ } catch (error) {
+ delta = e.wheelDelta || (-e.detail * 5);
+ }
+
+ return delta * .005;
+}
+
+// Note: Since we don't rotate, it's possible for the touches to become
+// slightly detached from their original positions. Thus, we recompute the
+// touch points on touchend as well as touchstart!
+function d3_behavior_zoomTouchup() {
+ var touches = d3.svg.touches(d3_behavior_zoomTarget),
+ i = -1,
+ n = touches.length,
+ touch;
+ while (++i < n) d3_behavior_zoomLocations[(touch = touches[i]).identifier] = d3_behavior_zoomLocation(touch);
+ return touches;
+}
+
+function d3_behavior_zoomTouchmove() {
+ var touches = d3.svg.touches(d3_behavior_zoomTarget);
+ switch (touches.length) {
+
+ // single-touch pan
+ case 1: {
+ var touch = touches[0];
+ d3_behavior_zoomTo(d3_behavior_zoomXyz[2], touch, d3_behavior_zoomLocations[touch.identifier]);
+ break;
+ }
+
+ // double-touch pan + zoom
+ case 2: {
+ var p0 = touches[0],
+ p1 = touches[1],
+ p2 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2],
+ l0 = d3_behavior_zoomLocations[p0.identifier],
+ l1 = d3_behavior_zoomLocations[p1.identifier],
+ l2 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2, l0[2]];
+ d3_behavior_zoomTo(Math.log(d3.event.scale) / Math.LN2 + l0[2], p2, l2);
+ break;
+ }
+ }
+}
+
+function d3_behavior_zoomMousemove() {
+ d3_behavior_zoomZooming = null;
+ if (d3_behavior_zoomPanning) {
+ d3_behavior_zoomMoved = 1;
+ d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning);
+ }
+}
+
+function d3_behavior_zoomMouseup() {
+ if (d3_behavior_zoomPanning) {
+ if (d3_behavior_zoomMoved) {
+ d3_eventCancel();
+ d3_behavior_zoomMoved = d3_behavior_zoomEventTarget === d3.event.target;
+ }
+
+ d3_behavior_zoomXyz =
+ d3_behavior_zoomExtent =
+ d3_behavior_zoomDispatch =
+ d3_behavior_zoomEventTarget =
+ d3_behavior_zoomTarget =
+ d3_behavior_zoomArguments =
+ d3_behavior_zoomPanning = null;
+ }
+}
+
+function d3_behavior_zoomClick() {
+ if (d3_behavior_zoomMoved) {
+ d3_eventCancel();
+ d3_behavior_zoomMoved = 0;
+ }
+}
+
+function d3_behavior_zoomTo(z, x0, x1) {
+ z = d3_behavior_zoomExtentClamp(z, 2);
+ var j = Math.pow(2, d3_behavior_zoomXyz[2]),
+ k = Math.pow(2, z),
+ K = Math.pow(2, (d3_behavior_zoomXyz[2] = z) - x1[2]),
+ x_ = d3_behavior_zoomXyz[0],
+ y_ = d3_behavior_zoomXyz[1],
+ x = d3_behavior_zoomXyz[0] = d3_behavior_zoomExtentClamp((x0[0] - x1[0] * K), 0, k),
+ y = d3_behavior_zoomXyz[1] = d3_behavior_zoomExtentClamp((x0[1] - x1[1] * K), 1, k),
+ o = d3.event; // Events can be reentrant (e.g., focus).
+
+ d3.event = {
+ scale: k,
+ translate: [x, y],
+ transform: function(sx, sy) {
+ if (sx) transform(sx, x_, x);
+ if (sy) transform(sy, y_, y);
+ }
+ };
+
+ function transform(scale, a, b) {
+ scale.domain(scale.range().map(function(v) { return scale.invert(((v - b) * j) / k + a); }));
+ }
+
+ try {
+ d3_behavior_zoomDispatch.apply(d3_behavior_zoomTarget, d3_behavior_zoomArguments);
+ } finally {
+ d3.event = o;
+ }
+
+ o.preventDefault();
+}
+
+var d3_behavior_zoomInfiniteExtent = [
+ [-Infinity, Infinity],
+ [-Infinity, Infinity],
+ [-Infinity, Infinity]
+];
+
+function d3_behavior_zoomExtentClamp(x, i, k) {
+ var range = d3_behavior_zoomExtent[i],
+ r0 = range[0],
+ r1 = range[1];
+ return arguments.length === 3
+ ? Math.max(r1 * (r1 === Infinity ? -Infinity : 1 / k - 1),
+ Math.min(r0 === -Infinity ? Infinity : r0, x / k)) * k
+ : Math.max(r0, Math.min(r1, x));
+}
+})();
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.layout.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.layout.js
new file mode 100644
index 0000000..30ba791
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.layout.js
@@ -0,0 +1,1891 @@
+(function(){d3.layout = {};
+// Implements hierarchical edge bundling using Holten's algorithm. For each
+// input link, a path is computed that travels through the tree, up the parent
+// hierarchy to the least common ancestor, and then back down to the destination
+// node. Each path is simply an array of nodes.
+d3.layout.bundle = function() {
+ return function(links) {
+ var paths = [],
+ i = -1,
+ n = links.length;
+ while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
+ return paths;
+ };
+};
+
+function d3_layout_bundlePath(link) {
+ var start = link.source,
+ end = link.target,
+ lca = d3_layout_bundleLeastCommonAncestor(start, end),
+ points = [start];
+ while (start !== lca) {
+ start = start.parent;
+ points.push(start);
+ }
+ var k = points.length;
+ while (end !== lca) {
+ points.splice(k, 0, end);
+ end = end.parent;
+ }
+ return points;
+}
+
+function d3_layout_bundleAncestors(node) {
+ var ancestors = [],
+ parent = node.parent;
+ while (parent != null) {
+ ancestors.push(node);
+ node = parent;
+ parent = parent.parent;
+ }
+ ancestors.push(node);
+ return ancestors;
+}
+
+function d3_layout_bundleLeastCommonAncestor(a, b) {
+ if (a === b) return a;
+ var aNodes = d3_layout_bundleAncestors(a),
+ bNodes = d3_layout_bundleAncestors(b),
+ aNode = aNodes.pop(),
+ bNode = bNodes.pop(),
+ sharedNode = null;
+ while (aNode === bNode) {
+ sharedNode = aNode;
+ aNode = aNodes.pop();
+ bNode = bNodes.pop();
+ }
+ return sharedNode;
+}
+d3.layout.chord = function() {
+ var chord = {},
+ chords,
+ groups,
+ matrix,
+ n,
+ padding = 0,
+ sortGroups,
+ sortSubgroups,
+ sortChords;
+
+ function relayout() {
+ var subgroups = {},
+ groupSums = [],
+ groupIndex = d3.range(n),
+ subgroupIndex = [],
+ k,
+ x,
+ x0,
+ i,
+ j;
+
+ chords = [];
+ groups = [];
+
+ // Compute the sum.
+ k = 0, i = -1; while (++i < n) {
+ x = 0, j = -1; while (++j < n) {
+ x += matrix[i][j];
+ }
+ groupSums.push(x);
+ subgroupIndex.push(d3.range(n));
+ k += x;
+ }
+
+ // Sort groups…
+ if (sortGroups) {
+ groupIndex.sort(function(a, b) {
+ return sortGroups(groupSums[a], groupSums[b]);
+ });
+ }
+
+ // Sort subgroups…
+ if (sortSubgroups) {
+ subgroupIndex.forEach(function(d, i) {
+ d.sort(function(a, b) {
+ return sortSubgroups(matrix[i][a], matrix[i][b]);
+ });
+ });
+ }
+
+ // Convert the sum to scaling factor for [0, 2pi].
+ // TODO Allow start and end angle to be specified.
+ // TODO Allow padding to be specified as percentage?
+ k = (2 * Math.PI - padding * n) / k;
+
+ // Compute the start and end angle for each group and subgroup.
+ // Note: Opera has a bug reordering object literal properties!
+ x = 0, i = -1; while (++i < n) {
+ x0 = x, j = -1; while (++j < n) {
+ var di = groupIndex[i],
+ dj = subgroupIndex[di][j],
+ v = matrix[di][dj],
+ a0 = x,
+ a1 = x += v * k;
+ subgroups[di + "-" + dj] = {
+ index: di,
+ subindex: dj,
+ startAngle: a0,
+ endAngle: a1,
+ value: v
+ };
+ }
+ groups.push({
+ index: di,
+ startAngle: x0,
+ endAngle: x,
+ value: (x - x0) / k
+ });
+ x += padding;
+ }
+
+ // Generate chords for each (non-empty) subgroup-subgroup link.
+ i = -1; while (++i < n) {
+ j = i - 1; while (++j < n) {
+ var source = subgroups[i + "-" + j],
+ target = subgroups[j + "-" + i];
+ if (source.value || target.value) {
+ chords.push(source.value < target.value
+ ? {source: target, target: source}
+ : {source: source, target: target});
+ }
+ }
+ }
+
+ if (sortChords) resort();
+ }
+
+ function resort() {
+ chords.sort(function(a, b) {
+ return sortChords(
+ (a.source.value + a.target.value) / 2,
+ (b.source.value + b.target.value) / 2);
+ });
+ }
+
+ chord.matrix = function(x) {
+ if (!arguments.length) return matrix;
+ n = (matrix = x) && matrix.length;
+ chords = groups = null;
+ return chord;
+ };
+
+ chord.padding = function(x) {
+ if (!arguments.length) return padding;
+ padding = x;
+ chords = groups = null;
+ return chord;
+ };
+
+ chord.sortGroups = function(x) {
+ if (!arguments.length) return sortGroups;
+ sortGroups = x;
+ chords = groups = null;
+ return chord;
+ };
+
+ chord.sortSubgroups = function(x) {
+ if (!arguments.length) return sortSubgroups;
+ sortSubgroups = x;
+ chords = null;
+ return chord;
+ };
+
+ chord.sortChords = function(x) {
+ if (!arguments.length) return sortChords;
+ sortChords = x;
+ if (chords) resort();
+ return chord;
+ };
+
+ chord.chords = function() {
+ if (!chords) relayout();
+ return chords;
+ };
+
+ chord.groups = function() {
+ if (!groups) relayout();
+ return groups;
+ };
+
+ return chord;
+};
+// A rudimentary force layout using Gauss-Seidel.
+d3.layout.force = function() {
+ var force = {},
+ event = d3.dispatch("tick"),
+ size = [1, 1],
+ drag,
+ alpha,
+ friction = .9,
+ linkDistance = d3_layout_forceLinkDistance,
+ linkStrength = d3_layout_forceLinkStrength,
+ charge = -30,
+ gravity = .1,
+ theta = .8,
+ interval,
+ nodes = [],
+ links = [],
+ distances,
+ strengths,
+ charges;
+
+ function repulse(node) {
+ return function(quad, x1, y1, x2, y2) {
+ if (quad.point !== node) {
+ var dx = quad.cx - node.x,
+ dy = quad.cy - node.y,
+ dn = 1 / Math.sqrt(dx * dx + dy * dy);
+
+ /* Barnes-Hut criterion. */
+ if ((x2 - x1) * dn < theta) {
+ var k = quad.charge * dn * dn;
+ node.px -= dx * k;
+ node.py -= dy * k;
+ return true;
+ }
+
+ if (quad.point && isFinite(dn)) {
+ var k = quad.pointCharge * dn * dn;
+ node.px -= dx * k;
+ node.py -= dy * k;
+ }
+ }
+ return !quad.charge;
+ };
+ }
+
+ function tick() {
+ var n = nodes.length,
+ m = links.length,
+ q,
+ i, // current index
+ o, // current object
+ s, // current source
+ t, // current target
+ l, // current distance
+ k, // current force
+ x, // x-distance
+ y; // y-distance
+
+ // gauss-seidel relaxation for links
+ for (i = 0; i < m; ++i) {
+ o = links[i];
+ s = o.source;
+ t = o.target;
+ x = t.x - s.x;
+ y = t.y - s.y;
+ if (l = (x * x + y * y)) {
+ l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
+ x *= l;
+ y *= l;
+ t.x -= x * (k = s.weight / (t.weight + s.weight));
+ t.y -= y * k;
+ s.x += x * (k = 1 - k);
+ s.y += y * k;
+ }
+ }
+
+ // apply gravity forces
+ if (k = alpha * gravity) {
+ x = size[0] / 2;
+ y = size[1] / 2;
+ i = -1; if (k) while (++i < n) {
+ o = nodes[i];
+ o.x += (x - o.x) * k;
+ o.y += (y - o.y) * k;
+ }
+ }
+
+ // compute quadtree center of mass and apply charge forces
+ if (charge) {
+ d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);
+ i = -1; while (++i < n) {
+ if (!(o = nodes[i]).fixed) {
+ q.visit(repulse(o));
+ }
+ }
+ }
+
+ // position verlet integration
+ i = -1; while (++i < n) {
+ o = nodes[i];
+ if (o.fixed) {
+ o.x = o.px;
+ o.y = o.py;
+ } else {
+ o.x -= (o.px - (o.px = o.x)) * friction;
+ o.y -= (o.py - (o.py = o.y)) * friction;
+ }
+ }
+
+ event.tick({type: "tick", alpha: alpha});
+
+ // simulated annealing, basically
+ return (alpha *= .99) < .005;
+ }
+
+ force.nodes = function(x) {
+ if (!arguments.length) return nodes;
+ nodes = x;
+ return force;
+ };
+
+ force.links = function(x) {
+ if (!arguments.length) return links;
+ links = x;
+ return force;
+ };
+
+ force.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return force;
+ };
+
+ force.linkDistance = function(x) {
+ if (!arguments.length) return linkDistance;
+ linkDistance = d3.functor(x);
+ return force;
+ };
+
+ // For backwards-compatibility.
+ force.distance = force.linkDistance;
+
+ force.linkStrength = function(x) {
+ if (!arguments.length) return linkStrength;
+ linkStrength = d3.functor(x);
+ return force;
+ };
+
+ force.friction = function(x) {
+ if (!arguments.length) return friction;
+ friction = x;
+ return force;
+ };
+
+ force.charge = function(x) {
+ if (!arguments.length) return charge;
+ charge = typeof x === "function" ? x : +x;
+ return force;
+ };
+
+ force.gravity = function(x) {
+ if (!arguments.length) return gravity;
+ gravity = x;
+ return force;
+ };
+
+ force.theta = function(x) {
+ if (!arguments.length) return theta;
+ theta = x;
+ return force;
+ };
+
+ force.start = function() {
+ var i,
+ j,
+ n = nodes.length,
+ m = links.length,
+ w = size[0],
+ h = size[1],
+ neighbors,
+ o;
+
+ for (i = 0; i < n; ++i) {
+ (o = nodes[i]).index = i;
+ o.weight = 0;
+ }
+
+ distances = [];
+ strengths = [];
+ for (i = 0; i < m; ++i) {
+ o = links[i];
+ if (typeof o.source == "number") o.source = nodes[o.source];
+ if (typeof o.target == "number") o.target = nodes[o.target];
+ distances[i] = linkDistance.call(this, o, i);
+ strengths[i] = linkStrength.call(this, o, i);
+ ++o.source.weight;
+ ++o.target.weight;
+ }
+
+ for (i = 0; i < n; ++i) {
+ o = nodes[i];
+ if (isNaN(o.x)) o.x = position("x", w);
+ if (isNaN(o.y)) o.y = position("y", h);
+ if (isNaN(o.px)) o.px = o.x;
+ if (isNaN(o.py)) o.py = o.y;
+ }
+
+ charges = [];
+ if (typeof charge === "function") {
+ for (i = 0; i < n; ++i) {
+ charges[i] = +charge.call(this, nodes[i], i);
+ }
+ } else {
+ for (i = 0; i < n; ++i) {
+ charges[i] = charge;
+ }
+ }
+
+ // initialize node position based on first neighbor
+ function position(dimension, size) {
+ var neighbors = neighbor(i),
+ j = -1,
+ m = neighbors.length,
+ x;
+ while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x;
+ return Math.random() * size;
+ }
+
+ // initialize neighbors lazily
+ function neighbor() {
+ if (!neighbors) {
+ neighbors = [];
+ for (j = 0; j < n; ++j) {
+ neighbors[j] = [];
+ }
+ for (j = 0; j < m; ++j) {
+ var o = links[j];
+ neighbors[o.source.index].push(o.target);
+ neighbors[o.target.index].push(o.source);
+ }
+ }
+ return neighbors[i];
+ }
+
+ return force.resume();
+ };
+
+ force.resume = function() {
+ alpha = .1;
+ d3.timer(tick);
+ return force;
+ };
+
+ force.stop = function() {
+ alpha = 0;
+ return force;
+ };
+
+ // use `node.call(force.drag)` to make nodes draggable
+ force.drag = function() {
+ if (!drag) drag = d3.behavior.drag()
+ .origin(Object)
+ .on("dragstart", dragstart)
+ .on("drag", d3_layout_forceDrag)
+ .on("dragend", d3_layout_forceDragEnd);
+
+ this.on("mouseover.force", d3_layout_forceDragOver)
+ .on("mouseout.force", d3_layout_forceDragOut)
+ .call(drag);
+ };
+
+ function dragstart(d) {
+ d3_layout_forceDragOver(d3_layout_forceDragNode = d);
+ d3_layout_forceDragForce = force;
+ }
+
+ return d3.rebind(force, event, "on");
+};
+
+var d3_layout_forceDragForce,
+ d3_layout_forceDragNode;
+
+function d3_layout_forceDragOver(d) {
+ d.fixed |= 2;
+}
+
+function d3_layout_forceDragOut(d) {
+ if (d !== d3_layout_forceDragNode) d.fixed &= 1;
+}
+
+function d3_layout_forceDragEnd() {
+ d3_layout_forceDrag();
+ d3_layout_forceDragNode.fixed &= 1;
+ d3_layout_forceDragForce = d3_layout_forceDragNode = null;
+}
+
+function d3_layout_forceDrag() {
+ d3_layout_forceDragNode.px = d3.event.x;
+ d3_layout_forceDragNode.py = d3.event.y;
+ d3_layout_forceDragForce.resume(); // restart annealing
+}
+
+function d3_layout_forceAccumulate(quad, alpha, charges) {
+ var cx = 0,
+ cy = 0;
+ quad.charge = 0;
+ if (!quad.leaf) {
+ var nodes = quad.nodes,
+ n = nodes.length,
+ i = -1,
+ c;
+ while (++i < n) {
+ c = nodes[i];
+ if (c == null) continue;
+ d3_layout_forceAccumulate(c, alpha, charges);
+ quad.charge += c.charge;
+ cx += c.charge * c.cx;
+ cy += c.charge * c.cy;
+ }
+ }
+ if (quad.point) {
+ // jitter internal nodes that are coincident
+ if (!quad.leaf) {
+ quad.point.x += Math.random() - .5;
+ quad.point.y += Math.random() - .5;
+ }
+ var k = alpha * charges[quad.point.index];
+ quad.charge += quad.pointCharge = k;
+ cx += k * quad.point.x;
+ cy += k * quad.point.y;
+ }
+ quad.cx = cx / quad.charge;
+ quad.cy = cy / quad.charge;
+}
+
+function d3_layout_forceLinkDistance(link) {
+ return 20;
+}
+
+function d3_layout_forceLinkStrength(link) {
+ return 1;
+}
+d3.layout.partition = function() {
+ var hierarchy = d3.layout.hierarchy(),
+ size = [1, 1]; // width, height
+
+ function position(node, x, dx, dy) {
+ var children = node.children;
+ node.x = x;
+ node.y = node.depth * dy;
+ node.dx = dx;
+ node.dy = dy;
+ if (children && (n = children.length)) {
+ var i = -1,
+ n,
+ c,
+ d;
+ dx = node.value ? dx / node.value : 0;
+ while (++i < n) {
+ position(c = children[i], x, d = c.value * dx, dy);
+ x += d;
+ }
+ }
+ }
+
+ function depth(node) {
+ var children = node.children,
+ d = 0;
+ if (children && (n = children.length)) {
+ var i = -1,
+ n;
+ while (++i < n) d = Math.max(d, depth(children[i]));
+ }
+ return 1 + d;
+ }
+
+ function partition(d, i) {
+ var nodes = hierarchy.call(this, d, i);
+ position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));
+ return nodes;
+ }
+
+ partition.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return partition;
+ };
+
+ return d3_layout_hierarchyRebind(partition, hierarchy);
+};
+d3.layout.pie = function() {
+ var value = Number,
+ sort = d3_layout_pieSortByValue,
+ startAngle = 0,
+ endAngle = 2 * Math.PI;
+
+ function pie(data, i) {
+
+ // Compute the numeric values for each data element.
+ var values = data.map(function(d, i) { return +value.call(pie, d, i); });
+
+ // Compute the start angle.
+ var a = +(typeof startAngle === "function"
+ ? startAngle.apply(this, arguments)
+ : startAngle);
+
+ // Compute the angular scale factor: from value to radians.
+ var k = ((typeof endAngle === "function"
+ ? endAngle.apply(this, arguments)
+ : endAngle) - startAngle)
+ / d3.sum(values);
+
+ // Optionally sort the data.
+ var index = d3.range(data.length);
+ if (sort != null) index.sort(sort === d3_layout_pieSortByValue
+ ? function(i, j) { return values[j] - values[i]; }
+ : function(i, j) { return sort(data[i], data[j]); });
+
+ // Compute the arcs!
+ var arcs = index.map(function(i) {
+ return {
+ data: data[i],
+ value: d = values[i],
+ startAngle: a,
+ endAngle: a += d * k
+ };
+ });
+
+ // Return the arcs in the original data's order.
+ return data.map(function(d, i) {
+ return arcs[index[i]];
+ });
+ }
+
+ /**
+ * Specifies the value function *x*, which returns a nonnegative numeric value
+ * for each datum. The default value function is `Number`. The value function
+ * is passed two arguments: the current datum and the current index.
+ */
+ pie.value = function(x) {
+ if (!arguments.length) return value;
+ value = x;
+ return pie;
+ };
+
+ /**
+ * Specifies a sort comparison operator *x*. The comparator is passed two data
+ * elements from the data array, a and b; it returns a negative value if a is
+ * less than b, a positive value if a is greater than b, and zero if a equals
+ * b.
+ */
+ pie.sort = function(x) {
+ if (!arguments.length) return sort;
+ sort = x;
+ return pie;
+ };
+
+ /**
+ * Specifies the overall start angle of the pie chart. Defaults to 0. The
+ * start angle can be specified either as a constant or as a function; in the
+ * case of a function, it is evaluated once per array (as opposed to per
+ * element).
+ */
+ pie.startAngle = function(x) {
+ if (!arguments.length) return startAngle;
+ startAngle = x;
+ return pie;
+ };
+
+ /**
+ * Specifies the overall end angle of the pie chart. Defaults to 2π. The
+ * end angle can be specified either as a constant or as a function; in the
+ * case of a function, it is evaluated once per array (as opposed to per
+ * element).
+ */
+ pie.endAngle = function(x) {
+ if (!arguments.length) return endAngle;
+ endAngle = x;
+ return pie;
+ };
+
+ return pie;
+};
+
+var d3_layout_pieSortByValue = {};
+// data is two-dimensional array of x,y; we populate y0
+d3.layout.stack = function() {
+ var values = Object,
+ order = d3_layout_stackOrders["default"],
+ offset = d3_layout_stackOffsets["zero"],
+ out = d3_layout_stackOut,
+ x = d3_layout_stackX,
+ y = d3_layout_stackY;
+
+ function stack(data, index) {
+
+ // Convert series to canonical two-dimensional representation.
+ var series = data.map(function(d, i) {
+ return values.call(stack, d, i);
+ });
+
+ // Convert each series to canonical [[x,y]] representation.
+ var points = series.map(function(d, i) {
+ return d.map(function(v, i) {
+ return [x.call(stack, v, i), y.call(stack, v, i)];
+ });
+ });
+
+ // Compute the order of series, and permute them.
+ var orders = order.call(stack, points, index);
+ series = d3.permute(series, orders);
+ points = d3.permute(points, orders);
+
+ // Compute the baseline…
+ var offsets = offset.call(stack, points, index);
+
+ // And propagate it to other series.
+ var n = series.length,
+ m = series[0].length,
+ i,
+ j,
+ o;
+ for (j = 0; j < m; ++j) {
+ out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);
+ for (i = 1; i < n; ++i) {
+ out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);
+ }
+ }
+
+ return data;
+ }
+
+ stack.values = function(x) {
+ if (!arguments.length) return values;
+ values = x;
+ return stack;
+ };
+
+ stack.order = function(x) {
+ if (!arguments.length) return order;
+ order = typeof x === "function" ? x : d3_layout_stackOrders[x];
+ return stack;
+ };
+
+ stack.offset = function(x) {
+ if (!arguments.length) return offset;
+ offset = typeof x === "function" ? x : d3_layout_stackOffsets[x];
+ return stack;
+ };
+
+ stack.x = function(z) {
+ if (!arguments.length) return x;
+ x = z;
+ return stack;
+ };
+
+ stack.y = function(z) {
+ if (!arguments.length) return y;
+ y = z;
+ return stack;
+ };
+
+ stack.out = function(z) {
+ if (!arguments.length) return out;
+ out = z;
+ return stack;
+ };
+
+ return stack;
+}
+
+function d3_layout_stackX(d) {
+ return d.x;
+}
+
+function d3_layout_stackY(d) {
+ return d.y;
+}
+
+function d3_layout_stackOut(d, y0, y) {
+ d.y0 = y0;
+ d.y = y;
+}
+
+var d3_layout_stackOrders = {
+
+ "inside-out": function(data) {
+ var n = data.length,
+ i,
+ j,
+ max = data.map(d3_layout_stackMaxIndex),
+ sums = data.map(d3_layout_stackReduceSum),
+ index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }),
+ top = 0,
+ bottom = 0,
+ tops = [],
+ bottoms = [];
+ for (i = 0; i < n; ++i) {
+ j = index[i];
+ if (top < bottom) {
+ top += sums[j];
+ tops.push(j);
+ } else {
+ bottom += sums[j];
+ bottoms.push(j);
+ }
+ }
+ return bottoms.reverse().concat(tops);
+ },
+
+ "reverse": function(data) {
+ return d3.range(data.length).reverse();
+ },
+
+ "default": function(data) {
+ return d3.range(data.length);
+ }
+
+};
+
+var d3_layout_stackOffsets = {
+
+ "silhouette": function(data) {
+ var n = data.length,
+ m = data[0].length,
+ sums = [],
+ max = 0,
+ i,
+ j,
+ o,
+ y0 = [];
+ for (j = 0; j < m; ++j) {
+ for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+ if (o > max) max = o;
+ sums.push(o);
+ }
+ for (j = 0; j < m; ++j) {
+ y0[j] = (max - sums[j]) / 2;
+ }
+ return y0;
+ },
+
+ "wiggle": function(data) {
+ var n = data.length,
+ x = data[0],
+ m = x.length,
+ max = 0,
+ i,
+ j,
+ k,
+ s1,
+ s2,
+ s3,
+ dx,
+ o,
+ o0,
+ y0 = [];
+ y0[0] = o = o0 = 0;
+ for (j = 1; j < m; ++j) {
+ for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];
+ for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {
+ for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {
+ s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;
+ }
+ s2 += s3 * data[i][j][1];
+ }
+ y0[j] = o -= s1 ? s2 / s1 * dx : 0;
+ if (o < o0) o0 = o;
+ }
+ for (j = 0; j < m; ++j) y0[j] -= o0;
+ return y0;
+ },
+
+ "expand": function(data) {
+ var n = data.length,
+ m = data[0].length,
+ k = 1 / n,
+ i,
+ j,
+ o,
+ y0 = [];
+ for (j = 0; j < m; ++j) {
+ for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+ if (o) for (i = 0; i < n; i++) data[i][j][1] /= o;
+ else for (i = 0; i < n; i++) data[i][j][1] = k;
+ }
+ for (j = 0; j < m; ++j) y0[j] = 0;
+ return y0;
+ },
+
+ "zero": function(data) {
+ var j = -1,
+ m = data[0].length,
+ y0 = [];
+ while (++j < m) y0[j] = 0;
+ return y0;
+ }
+
+};
+
+function d3_layout_stackMaxIndex(array) {
+ var i = 1,
+ j = 0,
+ v = array[0][1],
+ k,
+ n = array.length;
+ for (; i < n; ++i) {
+ if ((k = array[i][1]) > v) {
+ j = i;
+ v = k;
+ }
+ }
+ return j;
+}
+
+function d3_layout_stackReduceSum(d) {
+ return d.reduce(d3_layout_stackSum, 0);
+}
+
+function d3_layout_stackSum(p, d) {
+ return p + d[1];
+}
+d3.layout.histogram = function() {
+ var frequency = true,
+ valuer = Number,
+ ranger = d3_layout_histogramRange,
+ binner = d3_layout_histogramBinSturges;
+
+ function histogram(data, i) {
+ var bins = [],
+ values = data.map(valuer, this),
+ range = ranger.call(this, values, i),
+ thresholds = binner.call(this, range, values, i),
+ bin,
+ i = -1,
+ n = values.length,
+ m = thresholds.length - 1,
+ k = frequency ? 1 : 1 / n,
+ x;
+
+ // Initialize the bins.
+ while (++i < m) {
+ bin = bins[i] = [];
+ bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);
+ bin.y = 0;
+ }
+
+ // Fill the bins, ignoring values outside the range.
+ i = -1; while(++i < n) {
+ x = values[i];
+ if ((x >= range[0]) && (x <= range[1])) {
+ bin = bins[d3.bisect(thresholds, x, 1, m) - 1];
+ bin.y += k;
+ bin.push(data[i]);
+ }
+ }
+
+ return bins;
+ }
+
+ // Specifies how to extract a value from the associated data. The default
+ // value function is `Number`, which is equivalent to the identity function.
+ histogram.value = function(x) {
+ if (!arguments.length) return valuer;
+ valuer = x;
+ return histogram;
+ };
+
+ // Specifies the range of the histogram. Values outside the specified range
+ // will be ignored. The argument `x` may be specified either as a two-element
+ // array representing the minimum and maximum value of the range, or as a
+ // function that returns the range given the array of values and the current
+ // index `i`. The default range is the extent (minimum and maximum) of the
+ // values.
+ histogram.range = function(x) {
+ if (!arguments.length) return ranger;
+ ranger = d3.functor(x);
+ return histogram;
+ };
+
+ // Specifies how to bin values in the histogram. The argument `x` may be
+ // specified as a number, in which case the range of values will be split
+ // uniformly into the given number of bins. Or, `x` may be an array of
+ // threshold values, defining the bins; the specified array must contain the
+ // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x`
+ // may be a function which is evaluated, being passed the range, the array of
+ // values, and the current index `i`, returning an array of thresholds. The
+ // default bin function will divide the values into uniform bins using
+ // Sturges' formula.
+ histogram.bins = function(x) {
+ if (!arguments.length) return binner;
+ binner = typeof x === "number"
+ ? function(range) { return d3_layout_histogramBinFixed(range, x); }
+ : d3.functor(x);
+ return histogram;
+ };
+
+ // Specifies whether the histogram's `y` value is a count (frequency) or a
+ // probability (density). The default value is true.
+ histogram.frequency = function(x) {
+ if (!arguments.length) return frequency;
+ frequency = !!x;
+ return histogram;
+ };
+
+ return histogram;
+};
+
+function d3_layout_histogramBinSturges(range, values) {
+ return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));
+}
+
+function d3_layout_histogramBinFixed(range, n) {
+ var x = -1,
+ b = +range[0],
+ m = (range[1] - b) / n,
+ f = [];
+ while (++x <= n) f[x] = m * x + b;
+ return f;
+}
+
+function d3_layout_histogramRange(values) {
+ return [d3.min(values), d3.max(values)];
+}
+d3.layout.hierarchy = function() {
+ var sort = d3_layout_hierarchySort,
+ children = d3_layout_hierarchyChildren,
+ value = d3_layout_hierarchyValue;
+
+ // Recursively compute the node depth and value.
+ // Also converts the data representation into a standard hierarchy structure.
+ function recurse(data, depth, nodes) {
+ var childs = children.call(hierarchy, data, depth),
+ node = d3_layout_hierarchyInline ? data : {data: data};
+ node.depth = depth;
+ nodes.push(node);
+ if (childs && (n = childs.length)) {
+ var i = -1,
+ n,
+ c = node.children = [],
+ v = 0,
+ j = depth + 1;
+ while (++i < n) {
+ d = recurse(childs[i], j, nodes);
+ d.parent = node;
+ c.push(d);
+ v += d.value;
+ }
+ if (sort) c.sort(sort);
+ if (value) node.value = v;
+ } else if (value) {
+ node.value = +value.call(hierarchy, data, depth) || 0;
+ }
+ return node;
+ }
+
+ // Recursively re-evaluates the node value.
+ function revalue(node, depth) {
+ var children = node.children,
+ v = 0;
+ if (children && (n = children.length)) {
+ var i = -1,
+ n,
+ j = depth + 1;
+ while (++i < n) v += revalue(children[i], j);
+ } else if (value) {
+ v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0;
+ }
+ if (value) node.value = v;
+ return v;
+ }
+
+ function hierarchy(d) {
+ var nodes = [];
+ recurse(d, 0, nodes);
+ return nodes;
+ }
+
+ hierarchy.sort = function(x) {
+ if (!arguments.length) return sort;
+ sort = x;
+ return hierarchy;
+ };
+
+ hierarchy.children = function(x) {
+ if (!arguments.length) return children;
+ children = x;
+ return hierarchy;
+ };
+
+ hierarchy.value = function(x) {
+ if (!arguments.length) return value;
+ value = x;
+ return hierarchy;
+ };
+
+ // Re-evaluates the `value` property for the specified hierarchy.
+ hierarchy.revalue = function(root) {
+ revalue(root, 0);
+ return root;
+ };
+
+ return hierarchy;
+};
+
+// A method assignment helper for hierarchy subclasses.
+function d3_layout_hierarchyRebind(object, hierarchy) {
+ d3.rebind(object, hierarchy, "sort", "children", "value");
+
+ // Add an alias for links, for convenience.
+ object.links = d3_layout_hierarchyLinks;
+
+ // If the new API is used, enabling inlining.
+ object.nodes = function(d) {
+ d3_layout_hierarchyInline = true;
+ return (object.nodes = object)(d);
+ };
+
+ return object;
+}
+
+function d3_layout_hierarchyChildren(d) {
+ return d.children;
+}
+
+function d3_layout_hierarchyValue(d) {
+ return d.value;
+}
+
+function d3_layout_hierarchySort(a, b) {
+ return b.value - a.value;
+}
+
+// Returns an array source+target objects for the specified nodes.
+function d3_layout_hierarchyLinks(nodes) {
+ return d3.merge(nodes.map(function(parent) {
+ return (parent.children || []).map(function(child) {
+ return {source: parent, target: child};
+ });
+ }));
+}
+
+// For backwards-compatibility, don't enable inlining by default.
+var d3_layout_hierarchyInline = false;
+d3.layout.pack = function() {
+ var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort),
+ size = [1, 1];
+
+ function pack(d, i) {
+ var nodes = hierarchy.call(this, d, i),
+ root = nodes[0];
+
+ // Recursively compute the layout.
+ root.x = 0;
+ root.y = 0;
+ d3_layout_packTree(root);
+
+ // Scale the layout to fit the requested size.
+ var w = size[0],
+ h = size[1],
+ k = 1 / Math.max(2 * root.r / w, 2 * root.r / h);
+ d3_layout_packTransform(root, w / 2, h / 2, k);
+
+ return nodes;
+ }
+
+ pack.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return pack;
+ };
+
+ return d3_layout_hierarchyRebind(pack, hierarchy);
+};
+
+function d3_layout_packSort(a, b) {
+ return a.value - b.value;
+}
+
+function d3_layout_packInsert(a, b) {
+ var c = a._pack_next;
+ a._pack_next = b;
+ b._pack_prev = a;
+ b._pack_next = c;
+ c._pack_prev = b;
+}
+
+function d3_layout_packSplice(a, b) {
+ a._pack_next = b;
+ b._pack_prev = a;
+}
+
+function d3_layout_packIntersects(a, b) {
+ var dx = b.x - a.x,
+ dy = b.y - a.y,
+ dr = a.r + b.r;
+ return (dr * dr - dx * dx - dy * dy) > .001; // within epsilon
+}
+
+function d3_layout_packCircle(nodes) {
+ var xMin = Infinity,
+ xMax = -Infinity,
+ yMin = Infinity,
+ yMax = -Infinity,
+ n = nodes.length,
+ a, b, c, j, k;
+
+ function bound(node) {
+ xMin = Math.min(node.x - node.r, xMin);
+ xMax = Math.max(node.x + node.r, xMax);
+ yMin = Math.min(node.y - node.r, yMin);
+ yMax = Math.max(node.y + node.r, yMax);
+ }
+
+ // Create node links.
+ nodes.forEach(d3_layout_packLink);
+
+ // Create first node.
+ a = nodes[0];
+ a.x = -a.r;
+ a.y = 0;
+ bound(a);
+
+ // Create second node.
+ if (n > 1) {
+ b = nodes[1];
+ b.x = b.r;
+ b.y = 0;
+ bound(b);
+
+ // Create third node and build chain.
+ if (n > 2) {
+ c = nodes[2];
+ d3_layout_packPlace(a, b, c);
+ bound(c);
+ d3_layout_packInsert(a, c);
+ a._pack_prev = c;
+ d3_layout_packInsert(c, b);
+ b = a._pack_next;
+
+ // Now iterate through the rest.
+ for (var i = 3; i < n; i++) {
+ d3_layout_packPlace(a, b, c = nodes[i]);
+
+ // Search for the closest intersection.
+ var isect = 0, s1 = 1, s2 = 1;
+ for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {
+ if (d3_layout_packIntersects(j, c)) {
+ isect = 1;
+ break;
+ }
+ }
+ if (isect == 1) {
+ for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {
+ if (d3_layout_packIntersects(k, c)) {
+ if (s2 < s1) {
+ isect = -1;
+ j = k;
+ }
+ break;
+ }
+ }
+ }
+
+ // Update node chain.
+ if (isect == 0) {
+ d3_layout_packInsert(a, c);
+ b = c;
+ bound(c);
+ } else if (isect > 0) {
+ d3_layout_packSplice(a, j);
+ b = j;
+ i--;
+ } else { // isect < 0
+ d3_layout_packSplice(j, b);
+ a = j;
+ i--;
+ }
+ }
+ }
+ }
+
+ // Re-center the circles and return the encompassing radius.
+ var cx = (xMin + xMax) / 2,
+ cy = (yMin + yMax) / 2,
+ cr = 0;
+ for (var i = 0; i < n; i++) {
+ var node = nodes[i];
+ node.x -= cx;
+ node.y -= cy;
+ cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y));
+ }
+
+ // Remove node links.
+ nodes.forEach(d3_layout_packUnlink);
+
+ return cr;
+}
+
+function d3_layout_packLink(node) {
+ node._pack_next = node._pack_prev = node;
+}
+
+function d3_layout_packUnlink(node) {
+ delete node._pack_next;
+ delete node._pack_prev;
+}
+
+function d3_layout_packTree(node) {
+ var children = node.children;
+ if (children && children.length) {
+ children.forEach(d3_layout_packTree);
+ node.r = d3_layout_packCircle(children);
+ } else {
+ node.r = Math.sqrt(node.value);
+ }
+}
+
+function d3_layout_packTransform(node, x, y, k) {
+ var children = node.children;
+ node.x = (x += k * node.x);
+ node.y = (y += k * node.y);
+ node.r *= k;
+ if (children) {
+ var i = -1, n = children.length;
+ while (++i < n) d3_layout_packTransform(children[i], x, y, k);
+ }
+}
+
+function d3_layout_packPlace(a, b, c) {
+ var db = a.r + c.r,
+ dx = b.x - a.x,
+ dy = b.y - a.y;
+ if (db && (dx || dy)) {
+ var da = b.r + c.r,
+ dc = Math.sqrt(dx * dx + dy * dy),
+ cos = Math.max(-1, Math.min(1, (db * db + dc * dc - da * da) / (2 * db * dc))),
+ theta = Math.acos(cos),
+ x = cos * (db /= dc),
+ y = Math.sin(theta) * db;
+ c.x = a.x + x * dx + y * dy;
+ c.y = a.y + x * dy - y * dx;
+ } else {
+ c.x = a.x + db;
+ c.y = a.y;
+ }
+}
+// Implements a hierarchical layout using the cluster (or dendogram) algorithm.
+d3.layout.cluster = function() {
+ var hierarchy = d3.layout.hierarchy().sort(null).value(null),
+ separation = d3_layout_treeSeparation,
+ size = [1, 1]; // width, height
+
+ function cluster(d, i) {
+ var nodes = hierarchy.call(this, d, i),
+ root = nodes[0],
+ previousNode,
+ x = 0,
+ kx,
+ ky;
+
+ // First walk, computing the initial x & y values.
+ d3_layout_treeVisitAfter(root, function(node) {
+ var children = node.children;
+ if (children && children.length) {
+ node.x = d3_layout_clusterX(children);
+ node.y = d3_layout_clusterY(children);
+ } else {
+ node.x = previousNode ? x += separation(node, previousNode) : 0;
+ node.y = 0;
+ previousNode = node;
+ }
+ });
+
+ // Compute the left-most, right-most, and depth-most nodes for extents.
+ var left = d3_layout_clusterLeft(root),
+ right = d3_layout_clusterRight(root),
+ x0 = left.x - separation(left, right) / 2,
+ x1 = right.x + separation(right, left) / 2;
+
+ // Second walk, normalizing x & y to the desired size.
+ d3_layout_treeVisitAfter(root, function(node) {
+ node.x = (node.x - x0) / (x1 - x0) * size[0];
+ node.y = (1 - node.y / root.y) * size[1];
+ });
+
+ return nodes;
+ }
+
+ cluster.separation = function(x) {
+ if (!arguments.length) return separation;
+ separation = x;
+ return cluster;
+ };
+
+ cluster.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return cluster;
+ };
+
+ return d3_layout_hierarchyRebind(cluster, hierarchy);
+};
+
+function d3_layout_clusterY(children) {
+ return 1 + d3.max(children, function(child) {
+ return child.y;
+ });
+}
+
+function d3_layout_clusterX(children) {
+ return children.reduce(function(x, child) {
+ return x + child.x;
+ }, 0) / children.length;
+}
+
+function d3_layout_clusterLeft(node) {
+ var children = node.children;
+ return children && children.length ? d3_layout_clusterLeft(children[0]) : node;
+}
+
+function d3_layout_clusterRight(node) {
+ var children = node.children, n;
+ return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;
+}
+// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
+d3.layout.tree = function() {
+ var hierarchy = d3.layout.hierarchy().sort(null).value(null),
+ separation = d3_layout_treeSeparation,
+ size = [1, 1]; // width, height
+
+ function tree(d, i) {
+ var nodes = hierarchy.call(this, d, i),
+ root = nodes[0];
+
+ function firstWalk(node, previousSibling) {
+ var children = node.children,
+ layout = node._tree;
+ if (children && (n = children.length)) {
+ var n,
+ firstChild = children[0],
+ previousChild,
+ ancestor = firstChild,
+ child,
+ i = -1;
+ while (++i < n) {
+ child = children[i];
+ firstWalk(child, previousChild);
+ ancestor = apportion(child, previousChild, ancestor);
+ previousChild = child;
+ }
+ d3_layout_treeShift(node);
+ var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim);
+ if (previousSibling) {
+ layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
+ layout.mod = layout.prelim - midpoint;
+ } else {
+ layout.prelim = midpoint;
+ }
+ } else {
+ if (previousSibling) {
+ layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
+ }
+ }
+ }
+
+ function secondWalk(node, x) {
+ node.x = node._tree.prelim + x;
+ var children = node.children;
+ if (children && (n = children.length)) {
+ var i = -1,
+ n;
+ x += node._tree.mod;
+ while (++i < n) {
+ secondWalk(children[i], x);
+ }
+ }
+ }
+
+ function apportion(node, previousSibling, ancestor) {
+ if (previousSibling) {
+ var vip = node,
+ vop = node,
+ vim = previousSibling,
+ vom = node.parent.children[0],
+ sip = vip._tree.mod,
+ sop = vop._tree.mod,
+ sim = vim._tree.mod,
+ som = vom._tree.mod,
+ shift;
+ while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {
+ vom = d3_layout_treeLeft(vom);
+ vop = d3_layout_treeRight(vop);
+ vop._tree.ancestor = node;
+ shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip);
+ if (shift > 0) {
+ d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift);
+ sip += shift;
+ sop += shift;
+ }
+ sim += vim._tree.mod;
+ sip += vip._tree.mod;
+ som += vom._tree.mod;
+ sop += vop._tree.mod;
+ }
+ if (vim && !d3_layout_treeRight(vop)) {
+ vop._tree.thread = vim;
+ vop._tree.mod += sim - sop;
+ }
+ if (vip && !d3_layout_treeLeft(vom)) {
+ vom._tree.thread = vip;
+ vom._tree.mod += sip - som;
+ ancestor = node;
+ }
+ }
+ return ancestor;
+ }
+
+ // Initialize temporary layout variables.
+ d3_layout_treeVisitAfter(root, function(node, previousSibling) {
+ node._tree = {
+ ancestor: node,
+ prelim: 0,
+ mod: 0,
+ change: 0,
+ shift: 0,
+ number: previousSibling ? previousSibling._tree.number + 1 : 0
+ };
+ });
+
+ // Compute the layout using Buchheim et al.'s algorithm.
+ firstWalk(root);
+ secondWalk(root, -root._tree.prelim);
+
+ // Compute the left-most, right-most, and depth-most nodes for extents.
+ var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost),
+ right = d3_layout_treeSearch(root, d3_layout_treeRightmost),
+ deep = d3_layout_treeSearch(root, d3_layout_treeDeepest),
+ x0 = left.x - separation(left, right) / 2,
+ x1 = right.x + separation(right, left) / 2,
+ y1 = deep.depth || 1;
+
+ // Clear temporary layout variables; transform x and y.
+ d3_layout_treeVisitAfter(root, function(node) {
+ node.x = (node.x - x0) / (x1 - x0) * size[0];
+ node.y = node.depth / y1 * size[1];
+ delete node._tree;
+ });
+
+ return nodes;
+ }
+
+ tree.separation = function(x) {
+ if (!arguments.length) return separation;
+ separation = x;
+ return tree;
+ };
+
+ tree.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return tree;
+ };
+
+ return d3_layout_hierarchyRebind(tree, hierarchy);
+};
+
+function d3_layout_treeSeparation(a, b) {
+ return a.parent == b.parent ? 1 : 2;
+}
+
+// function d3_layout_treeSeparationRadial(a, b) {
+// return (a.parent == b.parent ? 1 : 2) / a.depth;
+// }
+
+function d3_layout_treeLeft(node) {
+ var children = node.children;
+ return children && children.length ? children[0] : node._tree.thread;
+}
+
+function d3_layout_treeRight(node) {
+ var children = node.children,
+ n;
+ return children && (n = children.length) ? children[n - 1] : node._tree.thread;
+}
+
+function d3_layout_treeSearch(node, compare) {
+ var children = node.children;
+ if (children && (n = children.length)) {
+ var child,
+ n,
+ i = -1;
+ while (++i < n) {
+ if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) {
+ node = child;
+ }
+ }
+ }
+ return node;
+}
+
+function d3_layout_treeRightmost(a, b) {
+ return a.x - b.x;
+}
+
+function d3_layout_treeLeftmost(a, b) {
+ return b.x - a.x;
+}
+
+function d3_layout_treeDeepest(a, b) {
+ return a.depth - b.depth;
+}
+
+function d3_layout_treeVisitAfter(node, callback) {
+ function visit(node, previousSibling) {
+ var children = node.children;
+ if (children && (n = children.length)) {
+ var child,
+ previousChild = null,
+ i = -1,
+ n;
+ while (++i < n) {
+ child = children[i];
+ visit(child, previousChild);
+ previousChild = child;
+ }
+ }
+ callback(node, previousSibling);
+ }
+ visit(node, null);
+}
+
+function d3_layout_treeShift(node) {
+ var shift = 0,
+ change = 0,
+ children = node.children,
+ i = children.length,
+ child;
+ while (--i >= 0) {
+ child = children[i]._tree;
+ child.prelim += shift;
+ child.mod += shift;
+ shift += child.shift + (change += child.change);
+ }
+}
+
+function d3_layout_treeMove(ancestor, node, shift) {
+ ancestor = ancestor._tree;
+ node = node._tree;
+ var change = shift / (node.number - ancestor.number);
+ ancestor.change += change;
+ node.change -= change;
+ node.shift += shift;
+ node.prelim += shift;
+ node.mod += shift;
+}
+
+function d3_layout_treeAncestor(vim, node, ancestor) {
+ return vim._tree.ancestor.parent == node.parent
+ ? vim._tree.ancestor
+ : ancestor;
+}
+// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk
+// Modified to support a target aspect ratio by Jeff Heer
+d3.layout.treemap = function() {
+ var hierarchy = d3.layout.hierarchy(),
+ round = Math.round,
+ size = [1, 1], // width, height
+ padding = null,
+ pad = d3_layout_treemapPadNull,
+ sticky = false,
+ stickies,
+ ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio
+
+ // Compute the area for each child based on value & scale.
+ function scale(children, k) {
+ var i = -1,
+ n = children.length,
+ child,
+ area;
+ while (++i < n) {
+ area = (child = children[i]).value * (k < 0 ? 0 : k);
+ child.area = isNaN(area) || area <= 0 ? 0 : area;
+ }
+ }
+
+ // Recursively arranges the specified node's children into squarified rows.
+ function squarify(node) {
+ var children = node.children;
+ if (children && children.length) {
+ var rect = pad(node),
+ row = [],
+ remaining = children.slice(), // copy-on-write
+ child,
+ best = Infinity, // the best row score so far
+ score, // the current row score
+ u = Math.min(rect.dx, rect.dy), // initial orientation
+ n;
+ scale(remaining, rect.dx * rect.dy / node.value);
+ row.area = 0;
+ while ((n = remaining.length) > 0) {
+ row.push(child = remaining[n - 1]);
+ row.area += child.area;
+ if ((score = worst(row, u)) <= best) { // continue with this orientation
+ remaining.pop();
+ best = score;
+ } else { // abort, and try a different orientation
+ row.area -= row.pop().area;
+ position(row, u, rect, false);
+ u = Math.min(rect.dx, rect.dy);
+ row.length = row.area = 0;
+ best = Infinity;
+ }
+ }
+ if (row.length) {
+ position(row, u, rect, true);
+ row.length = row.area = 0;
+ }
+ children.forEach(squarify);
+ }
+ }
+
+ // Recursively resizes the specified node's children into existing rows.
+ // Preserves the existing layout!
+ function stickify(node) {
+ var children = node.children;
+ if (children && children.length) {
+ var rect = pad(node),
+ remaining = children.slice(), // copy-on-write
+ child,
+ row = [];
+ scale(remaining, rect.dx * rect.dy / node.value);
+ row.area = 0;
+ while (child = remaining.pop()) {
+ row.push(child);
+ row.area += child.area;
+ if (child.z != null) {
+ position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);
+ row.length = row.area = 0;
+ }
+ }
+ children.forEach(stickify);
+ }
+ }
+
+ // Computes the score for the specified row, as the worst aspect ratio.
+ function worst(row, u) {
+ var s = row.area,
+ r,
+ rmax = 0,
+ rmin = Infinity,
+ i = -1,
+ n = row.length;
+ while (++i < n) {
+ if (!(r = row[i].area)) continue;
+ if (r < rmin) rmin = r;
+ if (r > rmax) rmax = r;
+ }
+ s *= s;
+ u *= u;
+ return s
+ ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio))
+ : Infinity;
+ }
+
+ // Positions the specified row of nodes. Modifies `rect`.
+ function position(row, u, rect, flush) {
+ var i = -1,
+ n = row.length,
+ x = rect.x,
+ y = rect.y,
+ v = u ? round(row.area / u) : 0,
+ o;
+ if (u == rect.dx) { // horizontal subdivision
+ if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow
+ while (++i < n) {
+ o = row[i];
+ o.x = x;
+ o.y = y;
+ o.dy = v;
+ x += o.dx = v ? round(o.area / v) : 0;
+ }
+ o.z = true;
+ o.dx += rect.x + rect.dx - x; // rounding error
+ rect.y += v;
+ rect.dy -= v;
+ } else { // vertical subdivision
+ if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow
+ while (++i < n) {
+ o = row[i];
+ o.x = x;
+ o.y = y;
+ o.dx = v;
+ y += o.dy = v ? round(o.area / v) : 0;
+ }
+ o.z = false;
+ o.dy += rect.y + rect.dy - y; // rounding error
+ rect.x += v;
+ rect.dx -= v;
+ }
+ }
+
+ function treemap(d) {
+ var nodes = stickies || hierarchy(d),
+ root = nodes[0];
+ root.x = 0;
+ root.y = 0;
+ root.dx = size[0];
+ root.dy = size[1];
+ if (stickies) hierarchy.revalue(root);
+ scale([root], root.dx * root.dy / root.value);
+ (stickies ? stickify : squarify)(root);
+ if (sticky) stickies = nodes;
+ return nodes;
+ }
+
+ treemap.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return treemap;
+ };
+
+ treemap.padding = function(x) {
+ if (!arguments.length) return padding;
+
+ function padFunction(node) {
+ var p = x.call(treemap, node, node.depth);
+ return p == null
+ ? d3_layout_treemapPadNull(node)
+ : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p);
+ }
+
+ function padConstant(node) {
+ return d3_layout_treemapPad(node, x);
+ }
+
+ var type;
+ pad = (padding = x) == null ? d3_layout_treemapPadNull
+ : (type = typeof x) === "function" ? padFunction
+ : type === "number" ? (x = [x, x, x, x], padConstant)
+ : padConstant;
+ return treemap;
+ };
+
+ treemap.round = function(x) {
+ if (!arguments.length) return round != Number;
+ round = x ? Math.round : Number;
+ return treemap;
+ };
+
+ treemap.sticky = function(x) {
+ if (!arguments.length) return sticky;
+ sticky = x;
+ stickies = null;
+ return treemap;
+ };
+
+ treemap.ratio = function(x) {
+ if (!arguments.length) return ratio;
+ ratio = x;
+ return treemap;
+ };
+
+ return d3_layout_hierarchyRebind(treemap, hierarchy);
+};
+
+function d3_layout_treemapPadNull(node) {
+ return {x: node.x, y: node.y, dx: node.dx, dy: node.dy};
+}
+
+function d3_layout_treemapPad(node, padding) {
+ var x = node.x + padding[3],
+ y = node.y + padding[0],
+ dx = node.dx - padding[1] - padding[3],
+ dy = node.dy - padding[0] - padding[2];
+ if (dx < 0) { x += dx / 2; dx = 0; }
+ if (dy < 0) { y += dy / 2; dy = 0; }
+ return {x: x, y: y, dx: dx, dy: dy};
+}
+})();
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.layout.min.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.layout.min.js
new file mode 100644
index 0000000..a6a893e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.layout.min.js
@@ -0,0 +1 @@
+(function(){function a(a){var b=a.source,d=a.target,e=c(b,d),f=[b];while(b!==e)b=b.parent,f.push(b);var g=f.length;while(d!==e)f.splice(g,0,d),d=d.parent;return f}function b(a){var b=[],c=a.parent;while(c!=null)b.push(a),a=c,c=c.parent;return b.push(a),b}function c(a,c){if(a===c)return a;var d=b(a),e=b(c),f=d.pop(),g=e.pop(),h=null;while(f===g)h=f,f=d.pop(),g=e.pop();return h}function g(a){a.fixed|=2}function h(a){a!==f&&(a.fixed&=1)}function i(){j(),f.fixed&=1,e=f=null}function j(){f.px=d3.event.x,f.py=d3.event.y,e.resume()}function k(a,b,c){var d=0,e=0;a.charge=0;if(!a.leaf){var f=a.nodes,g=f.length,h=-1,i;while(++h<g){i=f[h];if(i==null)continue;k(i,b,c),a.charge+=i.charge,d+=i.charge*i.cx,e+=i.charge*i.cy}}if(a.point){a.leaf||(a.point.x+=Math.random()-.5,a.point.y+=Math.random()-.5);var j=b*c[a.point.index];a.charge+=a.pointCharge=j,d+=j*a.point.x,e+=j*a.point.y}a.cx=d/a.charge,a.cy=e/a.charge}function l(a){return 20}function m(a){return 1}function o(a){return a.x}function p(a){return a.y}function q(a,b,c){a.y0=b,a.y=c}function t(a){var b=1,c=0,d=a[0][1],e,f=a.length;for(;b<f;++b)(e=a[b][1])>d&&(c=b,d=e);return c}function u(a){return a.reduce(v,0)}function v(a,b){return a+b[1]}function w(a,b){return x(a,Math.ceil(Math.log(b.length)/Math.LN2+1))}function x(a,b){var c=-1,d=+a[0],e=(a[1]-d)/b,f=[];while(++c<=b)f[c]=e*c+d;return f}function y(a){return[d3.min(a),d3.max(a)]}function z(a,b){return d3.rebind(a,b,"sort","children","value"),a.links=D,a.nodes=function(b){return E=!0,(a.nodes=a)(b)},a}function A(a){return a.children}function B(a){return a.value}function C(a,b){return b.value-a.value}function D(a){return d3.merge(a.map(function(a){return(a.children||[]).map(function(b){return{source:a,target:b}})}))}function F(a,b){return a.value-b.value}function G(a,b){var c=a._pack_next;a._pack_next=b,b._pack_prev=a,b._pack_next=c,c._pack_prev=b}function H(a,b){a._pack_next=b,b._pack_prev=a}function I(a,b){var c=b.x-a.x,d=b.y-a.y,e=a.r+b.r;return e*e-c*c-d*d>.001}function J(a){function l(a){b=Math.min(a.x-a.r,b),c=Math.max(a.x+a.r,c),d=Math.min(a.y-a.r,d),e=Math.max(a.y+a.r,e)}var b=Infinity,c=-Infinity,d=Infinity,e=-Infinity,f=a.length,g,h,i,j,k;a.forEach(K),g=a[0],g.x=-g.r,g.y=0,l(g);if(f>1){h=a[1],h.x=h.r,h.y=0,l(h);if(f>2){i=a[2],O(g,h,i),l(i),G(g,i),g._pack_prev=i,G(i,h),h=g._pack_next;for(var m=3;m<f;m++){O(g,h,i=a[m]);var n=0,o=1,p=1;for(j=h._pack_next;j!==h;j=j._pack_next,o++)if(I(j,i)){n=1;break}if(n==1)for(k=g._pack_prev;k!==j._pack_prev;k=k._pack_prev,p++)if(I(k,i)){p<o&&(n=-1,j=k);break}n==0?(G(g,i),h=i,l(i)):n>0?(H(g,j),h=j,m--):(H(j,h),g=j,m--)}}}var q=(b+c)/2,r=(d+e)/2,s=0;for(var m=0;m<f;m++){var t=a[m];t.x-=q,t.y-=r,s=Math.max(s,t.r+Math.sqrt(t.x*t.x+t.y*t.y))}return a.forEach(L),s}function K(a){a._pack_next=a._pack_prev=a}function L(a){delete a._pack_next,delete a._pack_prev}function M(a){var b=a.children;b&&b.length?(b.forEach(M),a.r=J(b)):a.r=Math.sqrt(a.value)}function N(a,b,c,d){var e=a.children;a.x=b+=d*a.x,a.y=c+=d*a.y,a.r*=d;if(e){var f=-1,g=e.length;while(++f<g)N(e[f],b,c,d)}}function O(a,b,c){var d=a.r+c.r,e=b.x-a.x,f=b.y-a.y;if(d&&(e||f)){var g=b.r+c.r,h=Math.sqrt(e*e+f*f),i=Math.max(-1,Math.min(1,(d*d+h*h-g*g)/(2*d*h))),j=Math.acos(i),k=i*(d/=h),l=Math.sin(j)*d;c.x=a.x+k*e+l*f,c.y=a.y+k*f-l*e}else c.x=a.x+d,c.y=a.y}function P(a){return 1+d3.max(a,function(a){return a.y})}function Q(a){return a.reduce(function(a,b){return a+b.x},0)/a.length}function R(a){var b=a.children;return b&&b.length?R(b[0]):a}function S(a){var b=a.children,c;return b&&(c=b.length)?S(b[c-1]):a}function T(a,b){return a.parent==b.parent?1:2}function U(a){var b=a.children;return b&&b.length?b[0]:a._tree.thread}function V(a){var b=a.children,c;return b&&(c=b.length)?b[c-1]:a._tree.thread}function W(a,b){var c=a.children;if(c&&(e=c.length)){var d,e,f=-1;while(++f<e)b(d=W(c[f],b),a)>0&&(a=d)}return a}function X(a,b){return a.x-b.x}function Y(a,b){return b.x-a.x}function Z(a,b){return a.depth-b.depth}function $(a,b){function c(a,d){var e=a.children;if(e&&(i=e.length)){var f,g=null,h=-1,i;while(++h<i)f=e[h],c(f,g),g=f}b(a,d)}c(a,null)}function _(a){var b=0,c=0,d=a.children,e=d.length,f;while(--e>=0)f=d[e]._tree,f.prelim+=b,f.mod+=b,b+=f.shift+(c+=f.change)}function ba(a,b,c){a=a._tree,b=b._tree;var d=c/(b.number-a.number);a.change+=d,b.change-=d,b.shift+=c,b.prelim+=c,b.mod+=c}function bb(a,b,c){return a._tree.ancestor.parent==b.parent?a._tree.ancestor:c}function bc(a){return{x:a.x,y:a.y,dx:a.dx,dy:a.dy}}function bd(a,b){var c=a.x+b[3],d=a.y+b[0],e=a.dx-b[1]-b[3],f=a.dy-b[0]-b[2];return e<0&&(c+=e/2,e=0),f<0&&(d+=f/2,f=0),{x:c,y:d,dx:e,dy:f}}d3.layout={},d3.layout.bundle=function(){return function(b){var c=[],d=-1,e=b.length;while(++d<e)c.push(a(b[d]));return c}},d3.layout.chord=function(){function j(){var a={},j=[],l=d3.range(e),m=[],n,o,p,q,r;b=[],c=[],n=0,q=-1;while(++q<e){o=0,r=-1;while(++r<e)o+=d[q][r];j.push(o),m.push(d3.range(e)),n+=o}g&&l.sort(function(a,b){return g(j[a],j[b])}),h&&m.forEach(function(a,b){a.sort(function(a,c){return h(d[b][a],d[b][c])})}),n=(2*Math.PI-f*e)/n,o=0,q=-1;while(++q<e){p=o,r=-1;while(++r<e){var s=l[q],t=m[s][r],u=d[s][t],v=o,w=o+=u*n;a[s+"-"+t]={index:s,subindex:t,startAngle:v,endAngle:w,value:u}}c.push({index:s,startAngle:p,endAngle:o,value:(o-p)/n}),o+=f}q=-1;while(++q<e){r=q-1;while(++r<e){var x=a[q+"-"+r],y=a[r+"-"+q];(x.value||y.value)&&b.push(x.value<y.value?{source:y,target:x}:{source:x,target:y})}}i&&k()}function k(){b.sort(function(a,b){return i((a.source.value+a.target.value)/2,(b.source.value+b.target.value)/2)})}var a={},b,c,d,e,f=0,g,h,i;return a.matrix=function(f){return arguments.length?(e=(d=f)&&d.length,b=c=null,a):d},a.padding=function(d){return arguments.length?(f=d,b=c=null,a):f},a.sortGroups=function(d){return arguments.length?(g=d,b=c=null,a):g},a.sortSubgroups=function(c){return arguments.length?(h=c,b=null,a):h},a.sortChords=function(c){return arguments.length?(i=c,b&&k(),a):i},a.chords=function(){return b||j(),b},a.groups=function(){return c||j(),c},a},d3.layout.force=function(){function A(a){return function(b,c,d,e,f){if(b.point!==a){var g=b.cx-a.x,h=b.cy-a.y,i=1/Math.sqrt(g*g+h*h);if((e-c)*i<t){var j=b.charge*i*i;return a.px-=g*j,a.py-=h*j,!0}if(b.point&&isFinite(i)){var j=b.pointCharge*i*i;a.px-=g*j,a.py-=h*j}}return!b.charge}}function B(){var a=v.length,d=w.length,e,f,g,h,i,j,l,m,p;for(f=0;f<d;++f){g=w[f],h=g.source,i=g.target,m=i.x-h.x,p=i.y-h.y;if(j=m*m+p*p)j=n*y[f]*((j=Math.sqrt(j))-x[f])/j,m*=j,p*=j,i.x-=m*(l=h.weight/(i.weight+h.weight)),i.y-=p*l,h.x+=m*(l=1-l),h.y+=p*l}if(l=n*s){m=c[0]/2,p=c[1]/2,f=-1;if(l)while(++f<a)g=v[f],g.x+=(m-g.x)*l,g.y+=(p-g.y)*l}if(r){k(e=d3.geom.quadtree(v),n,z),f=-1;while(++f<a)(g=v[f]).fixed||e.visit(A(g))}f=-1;while(++f<a)g=v[f],g.fixed?(g.x=g.px,g.y=g.py):(g.x-=(g.px-(g.px=g.x))*o,g.y-=(g.py-(g.py=g.y))*o);return b.tick({type:"tick",alpha:n}),(n*=.99)<.005}function C(b){g(f=b),e=a}var a={},b=d3.dispatch("tick"),c=[1,1],d,n,o=.9,p=l,q=m,r=-30,s=.1,t=.8,u,v=[],w=[],x,y,z;return a.nodes=function(b){return arguments.length?(v=b,a):v},a.links=function(b){return arguments.length?(w=b,a):w},a.size=function(b){return arguments.length?(c=b,a):c},a.linkDistance=function(b){return arguments.length?(p=d3.functor(b),a):p},a.distance=a.linkDistance,a.linkStrength=function(b){return arguments.length?(q=d3.functor(b),a):q},a.friction=function(b){return arguments.length?(o=b,a):o},a.charge=function(b){return arguments.length?(r=typeof b=="function"?b:+b,a):r},a.gravity=function(b){return arguments.length?(s=b,a):s},a.theta=function(b){return arguments.length?(t=b,a):t},a.start=function(){function k(a,c){var d=l(b),e=-1,f=d.length,g;while(++e<f)if(!isNaN(g=d[e][a]))return g;return Math.random()*c}function l(){if(!i){i=[];for(d=0;d<e;++d)i[d]=[];for(d=0;d<f;++d){var a=w[d];i[a.source.index].push(a.target),i[a.target.index].push(a.source)}}return i[b]}var b,d,e=v.length,f=w.length,g=c[0],h=c[1],i,j;for(b=0;b<e;++b)(j=v[b]).index=b,j.weight=0;x=[],y=[];for(b=0;b<f;++b)j=w[b],typeof j.source=="number"&&(j.source=v[j.source]),typeof j.target=="number"&&(j.target=v[j.target]),x[b]=p.call(this,j,b),y[b]=q.call(this,j,b),++j.source.weight,++j.target.weight;for(b=0;b<e;++b)j=v[b],isNaN(j.x)&&(j.x=k("x",g)),isNaN(j.y)&&(j.y=k("y",h)),isNaN(j.px)&&(j.px=j.x),isNaN(j.py)&&(j.py=j.y);z=[];if(typeof r=="function")for(b=0;b<e;++b)z[b]=+r.call(this,v[b],b);else for(b=0;b<e;++b)z[b]=r;return a.resume()},a.resume=function(){return n=.1,d3.timer(B),a},a.stop=function(){return n=0,a},a.drag=function(){d||(d=d3.behavior.drag().origin(Object).on("dragstart",C).on("drag",j).on("dragend",i)),this.on("mouseover.force",g).on("mouseout.force",h).call(d)},d3.rebind(a,b,"on")};var e,f;d3.layout.partition=function(){function c(a,b,d,e){var f=a.children;a.x=b,a.y=a.depth*e,a.dx=d,a.dy=e;if(f&&(h=f.length)){var g=-1,h,i,j;d=a.value?d/a.value:0;while(++g<h)c(i=f[g],b,j=i.value*d,e),b+=j}}function d(a){var b=a.children,c=0;if(b&&(f=b.length)){var e=-1,f;while(++e<f)c=Math.max(c,d(b[e]))}return 1+c}function e(e,f){var g=a.call(this,e,f);return c(g[0],0,b[0],b[1]/d(g[0])),g}var a=d3.layout.hierarchy(),b=[1,1];return e.size=function(a){return arguments.length?(b=a,e):b},z(e,a)},d3.layout.pie=function(){function f(g,h){var i=g.map(function(b,c){return+a.call(f,b,c)}),j=+(typeof c=="function"?c.apply(this,arguments):c),k=((typeof e=="function"?e.apply(this,arguments):e)-c)/d3.sum(i),l=d3.range(g.length);b!=null&&l.sort(b===n?function(a,b){return i[b]-i[a]}:function(a,c){return b(g[a],g[c])});var m=l.map(function(a){return{data:g[a],value:d=i[a],startAngle:j,endAngle:j+=d*k}});return g.map(function(a,b){return m[l[b]]})}var a=Number,b=n,c=0,e=2*Math.PI;return f.value=function(b){return arguments.length?(a=b,f):a},f.sort=function(a){return arguments.length?(b=a,f):b},f.startAngle=function(a){return arguments.length?(c=a,f):c},f.endAngle=function(a){return arguments.length?(e=a,f):e},f};var n={};d3.layout.stack=function(){function g(h,i){var j=h.map(function(b,c){return a.call(g,b,c)}),k=j.map(function(a,b){return a.map(function(a,b){return[e.call(g,a,b),f.call(g,a,b)]})}),l=b.call(g,k,i);j=d3.permute(j,l),k=d3.permute(k,l);var m=c.call(g,k,i),n=j.length,o=j[0].length,p,q,r;for(q=0;q<o;++q){d.call(g,j[0][q],r=m[q],k[0][q][1]);for(p=1;p<n;++p)d.call(g,j[p][q],r+=k[p-1][q][1],k[p][q][1])}return h}var a=Object,b=r["default"],c=s.zero,d=q,e=o,f=p;return g.values=function(b){return arguments.length?(a=b,g):a},g.order=function(a){return arguments.length?(b=typeof a=="function"?a:r[a],g):b},g.offset=function(a){return arguments.length?(c=typeof a=="function"?a:s[a],g):c},g.x=function(a){return arguments.length?(e=a,g):e},g.y=function(a){return arguments.length?(f=a,g):f},g.out=function(a){return arguments.length?(d=a,g):d},g};var r={"inside-out":function(a){var b=a.length,c,d,e=a.map(t),f=a.map(u),g=d3.range(b).sort(function(a,b){return e[a]-e[b]}),h=0,i=0,j=[],k=[];for(c=0;c<b;++c)d=g[c],h<i?(h+=f[d],j.push(d)):(i+=f[d],k.push(d));return k.reverse().concat(j)},reverse:function(a){return d3.range(a.length).reverse()},"default":function(a){return d3.range(a.length)}},s={silhouette:function(a){var b=a.length,c=a[0].length,d=[],e=0,f,g,h,i=[];for(g=0;g<c;++g){for(f=0,h=0;f<b;f++)h+=a[f][g][1];h>e&&(e=h),d.push(h)}for(g=0;g<c;++g)i[g]=(e-d[g])/2;return i},wiggle:function(a){var b=a.length,c=a[0],d=c.length,e=0,f,g,h,i,j,k,l,m,n,o=[];o[0]=m=n=0;for(g=1;g<d;++g){for(f=0,i=0;f<b;++f)i+=a[f][g][1];for(f=0,j=0,l=c[g][0]-c[g-1][0];f<b;++f){for(h=0,k=(a[f][g][1]-a[f][g-1][1])/(2*l);h<f;++h)k+=(a[h][g][1]-a[h][g-1][1])/l;j+=k*a[f][g][1]}o[g]=m-=i?j/i*l:0,m<n&&(n=m)}for(g=0;g<d;++g)o[g]-=n;return o},expand:function(a){var b=a.length,c=a[0].length,d=1/b,e,f,g,h=[];for(f=0;f<c;++f){for(e=0,g=0;e<b;e++)g+=a[e][f][1];if(g)for(e=0;e<b;e++)a[e][f][1]/=g;else for(e=0;e<b;e++)a[e][f][1]=d}for(f=0;f<c;++f)h[f]=0;return h},zero:function(a){var b=-1,c=a[0].length,d=[];while(++b<c)d[b]=0;return d}};d3.layout.histogram=function(){function e(e,f){var g=[],h=e.map(b,this),i=c.call(this,h,f),j=d.call(this,i,h,f),k,f=-1,l=h.length,m=j.length-1,n=a?1:1/l,o;while(++f<m)k=g[f]=[],k.dx=j[f+1]-(k.x=j[f]),k.y=0;f=-1;while(++f<l)o=h[f],o>=i[0]&&o<=i[1]&&(k=g[d3.bisect(j,o,1,m)-1],k.y+=n,k.push(e[f]));return g}var a=!0,b=Number,c=y,d=w;return e.value=function(a){return arguments.length?(b=a,e):b},e.range=function(a){return arguments.length?(c=d3.functor(a),e):c},e.bins=function(a){return arguments.length?(d=typeof a=="number"?function(b){return x(b,a)}:d3.functor(a),e):d},e.frequency=function(b){return arguments.length?(a=!!b,e):a},e},d3.layout.hierarchy=function(){function e(f,h,i){var j=b.call(g,f,h),k=E?f:{data:f};k.depth=h,i.push(k);if(j&&(m=j.length)){var l=-1,m,n=k.children=[],o=0,p=h+1;while(++l<m)d=e(j[l],p,i),d.parent=k,n.push(d),o+=d.value;a&&n.sort(a),c&&(k.value=o)}else c&&(k.value=+c.call(g,f,h)||0);return k}function f(a,b){var d=a.children,e=0;if(d&&(i=d.length)){var h=-1,i,j=b+1;while(++h<i)e+=f(d[h],j)}else c&&(e=+c.call(g,E?a:a.data,b)||0);return c&&(a.value=e),e}function g(a){var b=[];return e(a,0,b),b}var a=C,b=A,c=B;return g.sort=function(b){return arguments.length?(a=b,g):a},g.children=function(a){return arguments.length?(b=a,g):b},g.value=function(a){return arguments.length?(c=a,g):c},g.revalue=function(a){return f(a,0),a},g};var E=!1;d3.layout.pack=function(){function c(c,d){var e=a.call(this,c,d),f=e[0];f.x=0,f.y=0,M(f);var g=b[0],h=b[1],i=1/Math.max(2*f.r/g,2*f.r/h);return N(f,g/2,h/2,i),e}var a=d3.layout.hierarchy().sort(F),b=[1,1];return c.size=function(a){return arguments.length?(b=a,c):b},z(c,a)},d3.layout.cluster=function(){function d(d,e){var f=a.call(this,d,e),g=f[0],h,i=0,j,k;$(g,function(a){var c=a.children;c&&c.length?(a.x=Q(c),a.y=P(c)):(a.x=h?i+=b(a,h):0,a.y=0,h=a)});var l=R(g),m=S(g),n=l.x-b(l,m)/2,o=m.x+b(m,l)/2;return $(g,function(a){a.x=(a.x-n)/(o-n)*c[0],a.y=(1-a.y/g.y)*c[1]}),f}var a=d3.layout.hierarchy().sort(null).value(null),b=T,c=[1,1];return d.separation=function(a){return arguments.length?(b=a,d):b},d.size=function(a){return arguments.length?(c=a,d):c},z(d,a)},d3.layout.tree=function(){function d(d,e){function h(a,c){var d=a.children,e=a._tree;if(d&&(f=d.length)){var f,g=d[0],i,k=g,l,m=-1;while(++m<f)l=d[m],h(l,i),k=j(l,i,k),i=l;_(a);var n=.5*(g._tree.prelim+l._tree.prelim);c?(e.prelim=c._tree.prelim+b(a,c),e.mod=e.prelim-n):e.prelim=n}else c&&(e.prelim=c._tree.prelim+b(a,c))}function i(a,b){a.x=a._tree.prelim+b;var c=a.children;if(c&&(e=c.length)){var d=-1,e;b+=a._tree.mod;while(++d<e)i(c[d],b)}}function j(a,c,d){if(c){var e=a,f=a,g=c,h=a.parent.children[0],i=e._tree.mod,j=f._tree.mod,k=g._tree.mod,l=h._tree.mod,m;while(g=V(g),e=U(e),g&&e)h=U(h),f=V(f),f._tree.ancestor=a,m=g._tree.prelim+k-e._tree.prelim-i+b(g,e),m>0&&(ba(bb(g,a,d),a,m),i+=m,j+=m),k+=g._tree.mod,i+=e._tree.mod,l+=h._tree.mod,j+=f._tree.mod;g&&!V(f)&&(f._tree.thread=g,f._tree.mod+=k-j),e&&!U(h)&&(h._tree.thread=e,h._tree.mod+=i-l,d=a)}return d}var f=a.call(this,d,e),g=f[0];$(g,function(a,b){a._tree={ancestor:a,prelim:0,mod:0,change:0,shift:0,number:b?b._tree.number+1:0}}),h(g),i(g,-g._tree.prelim);var k=W(g,Y),l=W(g,X),m=W(g,Z),n=k.x-b(k,l)/2,o=l.x+b(l,k)/2,p=m.depth||1;return $(g,function(a){a.x=(a.x-n)/(o-n)*c[0],a.y=a.depth/p*c[1],delete a._tree}),f}var a=d3.layout.hierarchy().sort(null).value(null),b=T,c=[1,1];return d.separation=function(a){return arguments.length?(b=a,d):b},d.size=function(a){return arguments.length?(c=a,d):c},z(d,a)},d3.layout.treemap=function(){function i(a,b){var c=-1,d=a.length,e,f;while(++c<d)f=(e=a[c]).value*(b<0?0:b),e.area=isNaN(f)||f<=0?0:f}function j(a){var b=a.children;if(b&&b.length){var c=e(a),d=[],f=b.slice(),g,h=Infinity,k,n=Math.min(c.dx,c.dy),o;i(f,c.dx*c.dy/a.value),d.area=0;while((o=f.length)>0)d.push(g=f[o-1]),d.area+=g.area,(k=l(d,n))<=h?(f.pop(),h=k):(d.area-=d.pop().area,m(d,n,c,!1),n=Math.min(c.dx,c.dy),d.length=d.area=0,h=Infinity);d.length&&(m(d,n,c,!0),d.length=d.area=0),b.forEach(j)}}function k(a){var b=a.children;if(b&&b.length){var c=e(a),d=b.slice(),f,g=[];i(d,c.dx*c.dy/a.value),g.area=0;while(f=d.pop())g.push(f),g.area+=f.area,f.z!=null&&(m(g,f.z?c.dx:c.dy,c,!d.length),g.length=g.area=0);b.forEach(k)}}function l(a,b){var c=a.area,d,e=0,f=Infinity,g=-1,i=a.length;while(++g<i){if(!(d=a[g].area))continue;d<f&&(f=d),d>e&&(e=d)}return c*=c,b*=b,c?Math.max(b*e*h/c,c/(b*f*h)):Infinity}function m(a,c,d,e){var f=-1,g=a.length,h=d.x,i=d.y,j=c?b(a.area/c):0,k;if(c==d.dx){if(e||j>d.dy)j=j?d.dy:0;while(++f<g)k=a[f],k.x=h,k.y=i,k.dy=j,h+=k.dx=j?b(k.area/j):0;k.z=!0,k.dx+=d.x+d.dx-h,d.y+=j,d.dy-=j}else{if(e||j>d.dx)j=j?d.dx:0;while(++f<g)k=a[f],k.x=h,k.y=i,k.dx=j,i+=k.dy=j?b(k.area/j):0;k.z=!1,k.dy+=d.y+d.dy-i,d.x+=j,d.dx-=j}}function n(b){var d=g||a(b),e=d[0];return e.x=0,e.y=0,e.dx=c[0],e.dy=c[1],g&&a.revalue(e),i([e],e.dx*e.dy/e.value),(g?k:j)(e),f&&(g=d),d}var a=d3.layout.hierarchy(),b=Math.round,c=[1,1],d=null,e=bc,f=!1,g,h=.5*(1+Math.sqrt(5));return n.size=function(a){return arguments.length?(c=a,n):c},n.padding=function(a){function b(b){var c=a.call(n,b,b.depth);return c==null?bc(b):bd(b,typeof c=="number"?[c,c,c,c]:c)}function c(b){return bd(b,a)}if(!arguments.length)return d;var f;return e=(d=a)==null?bc:(f=typeof a)==="function"?b:f==="number"?(a=[a,a,a,a],c):c,n},n.round=function(a){return arguments.length?(b=a?Math.round:Number,n):b!=Number},n.sticky=function(a){return arguments.length?(f=a,g=null,n):f},n.ratio=function(a){return arguments.length?(h=a,n):h},z(n,a)}})(); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.min.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.min.js
new file mode 100644
index 0000000..c6e12d4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.min.js
@@ -0,0 +1,2 @@
+(function(){function e(a){var b=-1,c=a.length,d=[];while(++b<c)d.push(a[b]);return d}function f(a){return Array.prototype.slice.call(a)}function i(){return this}function j(a,b,c){return function(){var d=c.apply(b,arguments);return arguments.length?a:d}}function k(a){return a!=null&&!isNaN(a)}function l(a){return a.length}function m(a){return a==null}function n(a){return a.replace(/(^\s+)|(\s+$)/g,"").replace(/\s+/g," ")}function q(){}function r(){function c(){var b=a,c=-1,d=b.length,e;while(++c<d)(e=b[c].on)&&e.apply(this,arguments)}var a=[],b={};return c.on=function(d,e){var f,g;if(arguments.length<2)return(f=b[d])&&f.on;if(f=b[d])f.on=null,a=a.slice(0,g=a.indexOf(f)).concat(a.slice(g+1)),delete b[d];return e&&a.push(b[d]={on:e}),c},c}function u(a,b){return b-(a?1+Math.floor(Math.log(a+Math.pow(10,1+Math.floor(Math.log(a)/Math.LN10)-b))/Math.LN10):1)}function v(a){return a+""}function w(a){var b=a.lastIndexOf("."),c=b>=0?a.substring(b):(b=a.length,""),d=[];while(b>0)d.push(a.substring(b-=3,b+3));return d.reverse().join(",")+c}function y(a,b){return{scale:Math.pow(10,(8-b)*3),symbol:a}}function D(a){return function(b){return b<=0?0:b>=1?1:a(b)}}function E(a){return function(b){return 1-a(1-b)}}function F(a){return function(b){return.5*(b<.5?a(2*b):2-a(2-2*b))}}function G(a){return a}function H(a){return function(b){return Math.pow(b,a)}}function I(a){return 1-Math.cos(a*Math.PI/2)}function J(a){return Math.pow(2,10*(a-1))}function K(a){return 1-Math.sqrt(1-a*a)}function L(a,b){var c;return arguments.length<2&&(b=.45),arguments.length<1?(a=1,c=b/4):c=b/(2*Math.PI)*Math.asin(1/a),function(d){return 1+a*Math.pow(2,10*-d)*Math.sin((d-c)*2*Math.PI/b)}}function M(a){return a||(a=1.70158),function(b){return b*b*((a+1)*b-a)}}function N(a){return a<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+.9375:7.5625*(a-=2.625/2.75)*a+.984375}function O(){d3.event.stopPropagation(),d3.event.preventDefault()}function Q(a){return a=="transform"?d3.interpolateTransform:d3.interpolate}function R(a,b){return b=b-(a=+a)?1/(b-a):0,function(c){return(c-a)*b}}function S(a,b){return b=b-(a=+a)?1/(b-a):0,function(c){return Math.max(0,Math.min(1,(c-a)*b))}}function T(a,b,c){return new U(a,b,c)}function U(a,b,c){this.r=a,this.g=b,this.b=c}function V(a){return a<16?"0"+Math.max(0,a).toString(16):Math.min(255,a).toString(16)}function W(a,b,c){var d=0,e=0,f=0,g,h,i;g=/([a-z]+)\((.*)\)/i.exec(a);if(g){h=g[2].split(",");switch(g[1]){case"hsl":return c(parseFloat(h[0]),parseFloat(h[1])/100,parseFloat(h[2])/100);case"rgb":return b(Y(h[0]),Y(h[1]),Y(h[2]))}}return(i=Z[a])?b(i.r,i.g,i.b):(a!=null&&a.charAt(0)==="#"&&(a.length===4?(d=a.charAt(1),d+=d,e=a.charAt(2),e+=e,f=a.charAt(3),f+=f):a.length===7&&(d=a.substring(1,3),e=a.substring(3,5),f=a.substring(5,7)),d=parseInt(d,16),e=parseInt(e,16),f=parseInt(f,16)),b(d,e,f))}function X(a,b,c){var d=Math.min(a/=255,b/=255,c/=255),e=Math.max(a,b,c),f=e-d,g,h,i=(e+d)/2;return f?(h=i<.5?f/(e+d):f/(2-e-d),a==e?g=(b-c)/f+(b<c?6:0):b==e?g=(c-a)/f+2:g=(a-b)/f+4,g*=60):h=g=0,_(g,h,i)}function Y(a){var b=parseFloat(a);return a.charAt(a.length-1)==="%"?Math.round(b*2.55):b}function _(a,b,c){return new ba(a,b,c)}function ba(a,b,c){this.h=a,this.s=b,this.l=c}function bb(a,b,c){function f(a){return a>360?a-=360:a<0&&(a+=360),a<60?d+(e-d)*a/60:a<180?e:a<240?d+(e-d)*(240-a)/60:d}function g(a){return Math.round(f(a)*255)}var d,e;return a%=360,a<0&&(a+=360),b=b<0?0:b>1?1:b,c=c<0?0:c>1?1:c,e=c<=.5?c*(1+b):c+b-c*b,d=2*c-e,T(g(a+120),g(a),g(a-120))}function bc(a){return h(a,bi),a}function bj(a){return function(){return bd(a,this)}}function bk(a){return function(){return be(a,this)}}function bm(a,b){function f(){if(b=this.classList)return b.add(a);var b=this.className,d=b.baseVal!=null,e=d?b.baseVal:b;c.lastIndex=0,c.test(e)||(e=n(e+" "+a),d?b.baseVal=e:this.className=e)}function g(){if(b=this.classList)return b.remove(a);var b=this.className,d=b.baseVal!=null,e=d?b.baseVal:b;e=n(e.replace(c," ")),d?b.baseVal=e:this.className=e}function h(){(b.apply(this,arguments)?f:g).call(this)}var c=new RegExp("(^|\\s+)"+d3.requote(a)+"(\\s+|$)","g");if(arguments.length<2){var d=this.node();if(e=d.classList)return e.contains(a);var e=d.className;return c.lastIndex=0,c.test(e.baseVal!=null?e.baseVal:e)}return this.each(typeof b=="function"?h:b?f:g)}function bn(a){return{__data__:a}}function bo(a){return function(){return bh(this,a)}}function bp(a){return arguments.length||(a=d3.ascending),function(b,c){return a(b&&b.__data__,c&&c.__data__)}}function br(a){return h(a,bs),a}function bt(a,b,c){h(a,bx);var d={},e=d3.dispatch("start","end"),f=bA;return a.id=b,a.time=c,a.tween=function(b,c){return arguments.length<2?d[b]:(c==null?delete d[b]:d[b]=c,a)},a.ease=function(b){return arguments.length?(f=typeof b=="function"?b:d3.ease.apply(d3,arguments),a):f},a.each=function(b,c){return arguments.length<2?bB.call(a,b):(e.on(b,c),a)},d3.timer(function(g){return a.each(function(h,i,j){function p(a){if(o.active>b)return r();o.active=b;for(var f in d)(f=d[f].call(l,h,i))&&k.push(f);return e.start.call(l,h,i),q(a)||d3.timer(q,0,c),1}function q(a){if(o.active!==b)return r();var c=(a-m)/n,d=f(c),g=k.length;while(g>0)k[--g].call(l,d);if(c>=1)return r(),bz=b,e.end.call(l,h,i),bz=0,1}function r(){return--o.count||delete l.__transition__,1}var k=[],l=this,m=a[j][i].delay,n=a[j][i].duration,o=l.__transition__||(l.__transition__={active:0,count:0});++o.count,m<=g?p(g):d3.timer(p,m,c)}),1},0,c),a}function bv(a,b,c){return c!=""&&bu}function bw(a,b){function d(a,d,e){var f=b.call(this,a,d);return f==null?e!=""&&bu:e!=f&&c(e,f)}function e(a,d,e){return e!=b&&c(e,b)}var c=Q(a);return typeof b=="function"?d:b==null?bv:(b+="",e)}function bB(a){for(var b=0,c=this.length;b<c;b++)for(var d=this[b],e=0,f=d.length;e<f;e++){var g=d[e];g&&a.call(g=g.node,g.__data__,e,b)}return this}function bF(){var a,b=Date.now(),c=bC;while(c)a=b-c.then,a>=c.delay&&(c.flush=c.callback(a)),c=c.next;var d=bG()-b;d>24?(isFinite(d)&&(clearTimeout(bE),bE=setTimeout(bF,d)),bD=0):(bD=1,bH(bF))}function bG(){var a=null,b=bC,c=Infinity;while(b)b.flush?b=a?a.next=b.next:bC=b.next:(c=Math.min(c,b.then+b.delay),b=(a=b).next);return c}function bI(a){var b=[a.a,a.b],c=[a.c,a.d],d=bK(b),e=bJ(b,c),f=bK(bL(c,b,-e))||0;b[0]*c[1]<c[0]*b[1]&&(b[0]*=-1,b[1]*=-1,d*=-1,e*=-1),this.rotate=(d?Math.atan2(b[1],b[0]):Math.atan2(-c[0],c[1]))*bO,this.translate=[a.e,a.f],this.scale=[d,f],this.skew=f?Math.atan2(e,f)*bO:0}function bJ(a,b){return a[0]*b[0]+a[1]*b[1]}function bK(a){var b=Math.sqrt(bJ(a,a));return b&&(a[0]/=b,a[1]/=b),b}function bL(a,b,c){return a[0]+=c*b[0],a[1]+=c*b[1],a}function bP(){}function bQ(a){var b=a[0],c=a[a.length-1];return b<c?[b,c]:[c,b]}function bR(a){return a.rangeExtent?a.rangeExtent():bQ(a.range())}function bS(a,b){var c=0,d=a.length-1,e=a[c],f=a[d],g;f<e&&(g=c,c=d,d=g,g=e,e=f,f=g);if(g=f-e)b=b(g),a[c]=b.floor(e),a[d]=b.ceil(f);return a}function bT(){return Math}function bU(a,b,c,d){function g(){var g=a.length==2?b$:b_,i=d?S:R;return e=g(a,b,i,c),f=g(b,a,i,d3.interpolate),h}function h(a){return e(a)}var e,f;return h.invert=function(a){return f(a)},h.domain=function(b){return arguments.length?(a=b.map(Number),g()):a},h.range=function(a){return arguments.length?(b=a,g()):b},h.rangeRound=function(a){return h.range(a).interpolate(d3.interpolateRound)},h.clamp=function(a){return arguments.length?(d=a,g()):d},h.interpolate=function(a){return arguments.length?(c=a,g()):c},h.ticks=function(b){return bY(a,b)},h.tickFormat=function(b){return bZ(a,b)},h.nice=function(){return bS(a,bW),g()},h.copy=function(){return bU(a,b,c,d)},g()}function bV(a,b){return d3.rebind(a,b,"range","rangeRound","interpolate","clamp")}function bW(a){return a=Math.pow(10,Math.round(Math.log(a)/Math.LN10)-1),{floor:function(b){return Math.floor(b/a)*a},ceil:function(b){return Math.ceil(b/a)*a}}}function bX(a,b){var c=bQ(a),d=c[1]-c[0],e=Math.pow(10,Math.floor(Math.log(d/b)/Math.LN10)),f=b/d*e;return f<=.15?e*=10:f<=.35?e*=5:f<=.75&&(e*=2),c[0]=Math.ceil(c[0]/e)*e,c[1]=Math.floor(c[1]/e)*e+e*.5,c[2]=e,c}function bY(a,b){return d3.range.apply(d3,bX(a,b))}function bZ(a,b){return d3.format(",."+Math.max(0,-Math.floor(Math.log(bX(a,b)[2])/Math.LN10+.01))+"f")}function b$(a,b,c,d){var e=c(a[0],a[1]),f=d(b[0],b[1]);return function(a){return f(e(a))}}function b_(a,b,c,d){var e=[],f=[],g=0,h=a.length;while(++g<h)e.push(c(a[g-1],a[g])),f.push(d(b[g-1],b[g]));return function(b){var c=d3.bisect(a,b,1,a.length-1)-1;return f[c](e[c](b))}}function ca(a,b){function d(c){return a(b(c))}var c=b.pow;return d.invert=function(b){return c(a.invert(b))},d.domain=function(e){return arguments.length?(b=e[0]<0?cd:cc,c=b.pow,a.domain(e.map(b)),d):a.domain().map(c)},d.nice=function(){return a.domain(bS(a.domain(),bT)),d},d.ticks=function(){var d=bQ(a.domain()),e=[];if(d.every(isFinite)){var f=Math.floor(d[0]),g=Math.ceil(d[1]),h=c(d[0]),i=c(d[1]);if(b===cd){e.push(c(f));for(;f++<g;)for(var j=9;j>0;j--)e.push(c(f)*j)}else{for(;f<g;f++)for(var j=1;j<10;j++)e.push(c(f)*j);e.push(c(f))}for(f=0;e[f]<h;f++);for(g=e.length;e[g-1]>i;g--);e=e.slice(f,g)}return e},d.tickFormat=function(a,e){arguments.length<2&&(e=cb);if(arguments.length<1)return e;var f=a/d.ticks().length,g=b===cd?(h=-1e-12,Math.floor):(h=1e-12,Math.ceil),h;return function(a){return a/c(g(b(a)+h))<f?e(a):""}},d.copy=function(){return ca(a.copy(),b)},bV(d,a)}function cc(a){return Math.log(a)/Math.LN10}function cd(a){return-Math.log(-a)/Math.LN10}function ce(a,b){function e(b){return a(c(b))}var c=cf(b),d=cf(1/b);return e.invert=function(b){return d(a.invert(b))},e.domain=function(b){return arguments.length?(a.domain(b.map(c)),e):a.domain().map(d)},e.ticks=function(a){return bY(e.domain(),a)},e.tickFormat=function(a){return bZ(e.domain(),a)},e.nice=function(){return e.domain(bS(e.domain(),bW))},e.exponent=function(a){if(!arguments.length)return b;var f=e.domain();return c=cf(b=a),d=cf(1/b),e.domain(f)},e.copy=function(){return ce(a.copy(),b)},bV(e,a)}function cf(a){return function(b){return b<0?-Math.pow(-b,a):Math.pow(b,a)}}function cg(a,b){function f(b){return d[((c[b]||(c[b]=a.push(b)))-1)%d.length]}function g(b,c){return d3.range(a.length).map(function(a){return b+c*a})}var c,d,e;return f.domain=function(d){if(!arguments.length)return a;a=[],c={};var e=-1,g=d.length,h;while(++e<g)c[h=d[e]]||(c[h]=a.push(h));return f[b.t](b.x,b.p)},f.range=function(a){return arguments.length?(d=a,e=0,b={t:"range",x:a},f):d},f.rangePoints=function(c,h){arguments.length<2&&(h=0);var i=c[0],j=c[1],k=(j-i)/(a.length-1+h);return d=g(a.length<2?(i+j)/2:i+k*h/2,k),e=0,b={t:"rangePoints",x:c,p:h},f},f.rangeBands=function(c,h){arguments.length<2&&(h=0);var i=c[0],j=c[1],k=(j-i)/(a.length+h);return d=g(i+k*h,k),e=k*(1-h),b={t:"rangeBands",x:c,p:h},f},f.rangeRoundBands=function(c,h){arguments.length<2&&(h=0);var i=c[0],j=c[1],k=Math.floor((j-i)/(a.length+h));return d=g(i+Math.round((j-i-(a.length-h)*k)/2),k),e=Math.round(k*(1-h)),b={t:"rangeRoundBands",x:c,p:h},f},f.rangeBand=function(){return e},f.rangeExtent=function(){return b.x},f.copy=function(){return cg(a,b)},f.domain(a)}function cl(a,b){function d(){var d=0,f=a.length,g=b.length;c=[];while(++d<g)c[d-1]=d3.quantile(a,d/g);return e}function e(a){return isNaN(a=+a)?NaN:b[d3.bisect(c,a)]}var c;return e.domain=function(b){return arguments.length?(a=b.filter(function(a){return!isNaN(a)}).sort(d3.ascending),d()):a},e.range=function(a){return arguments.length?(b=a,d()):b},e.quantiles=function(){return c},e.copy=function(){return cl(a,b)},d()}function cm(a,b,c){function f(b){return c[Math.max(0,Math.min(e,Math.floor(d*(b-a))))]}function g(){return d=c.length/(b-a),e=c.length-1,f}var d,e;return f.domain=function(c){return arguments.length?(a=+c[0],b=+c[c.length-1],g()):[a,b]},f.range=function(a){return arguments.length?(c=a,g()):c},f.copy=function(){return cm(a,b,c)},g()}function cp(a){return a.innerRadius}function cq(a){return a.outerRadius}function cr(a){return a.startAngle}function cs(a){return a.endAngle}function ct(a){function g(d){return d.length<1?null:"M"+e(a(cu(this,d,b,c)),f)}var b=cv,c=cw,d="linear",e=cx[d],f=.7;return g.x=function(a){return arguments.length?(b=a,g):b},g.y=function(a){return arguments.length?(c=a,g):c},g.interpolate=function(a){return arguments.length?(e=cx[d=a],g):d},g.tension=function(a){return arguments.length?(f=a,g):f},g}function cu(a,b,c,d){var e=[],f=-1,g=b.length,h=typeof c=="function",i=typeof d=="function",j;if(h&&i)while(++f<g)e.push([c.call(a,j=b[f],f),d.call(a,j,f)]);else if(h)while(++f<g)e.push([c.call(a,b[f],f),d]);else if(i)while(++f<g)e.push([c,d.call(a,b[f],f)]);else while(++f<g)e.push([c,d]);return e}function cv(a){return a[0]}function cw(a){return a[1]}function cy(a){var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];while(++b<c)e.push("L",(d=a[b])[0],",",d[1]);return e.join("")}function cz(a){var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];while(++b<c)e.push("V",(d=a[b])[1],"H",d[0]);return e.join("")}function cA(a){var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];while(++b<c)e.push("H",(d=a[b])[0],"V",d[1]);return e.join("")}function cB(a,b){return a.length<4?cy(a):a[1]+cE(a.slice(1,a.length-1),cF(a,b))}function cC(a,b){return a.length<3?cy(a):a[0]+cE((a.push(a[0]),a),cF([a[a.length-2]].concat(a,[a[1]]),b))}function cD(a,b,c){return a.length<3?cy(a):a[0]+cE(a,cF(a,b))}function cE(a,b){if(b.length<1||a.length!=b.length&&a.length!=b.length+2)return cy(a);var c=a.length!=b.length,d="",e=a[0],f=a[1],g=b[0],h=g,i=1;c&&(d+="Q"+(f[0]-g[0]*2/3)+","+(f[1]-g[1]*2/3)+","+f[0]+","+f[1],e=a[1],i=2);if(b.length>1){h=b[1],f=a[i],i++,d+="C"+(e[0]+g[0])+","+(e[1]+g[1])+","+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1];for(var j=2;j<b.length;j++,i++)f=a[i],h=b[j],d+="S"+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1]}if(c){var k=a[i];d+="Q"+(f[0]+h[0]*2/3)+","+(f[1]+h[1]*2/3)+","+k[0]+","+k[1]}return d}function cF(a,b){var c=[],d=(1-b)/2,e,f=a[0],g=a[1],h=1,i=a.length;while(++h<i)e=f,f=g,g=a[h],c.push([d*(g[0]-e[0]),d*(g[1]-e[1])]);return c}function cG(a){if(a.length<3)return cy(a);var b=1,c=a.length,d=a[0],e=d[0],f=d[1],g=[e,e,e,(d=a[1])[0]],h=[f,f,f,d[1]],i=[e,",",f];cO(i,g,h);while(++b<c)d=a[b],g.shift(),g.push(d[0]),h.shift(),h.push(d[1]),cO(i,g,h);b=-1;while(++b<2)g.shift(),g.push(d[0]),h.shift(),h.push(d[1]),cO(i,g,h);return i.join("")}function cH(a){if(a.length<4)return cy(a);var b=[],c=-1,d=a.length,e,f=[0],g=[0];while(++c<3)e=a[c],f.push(e[0]),g.push(e[1]);b.push(cK(cN,f)+","+cK(cN,g)),--c;while(++c<d)e=a[c],f.shift(),f.push(e[0]),g.shift(),g.push(e[1]),cO(b,f,g);return b.join("")}function cI(a){var b,c=-1,d=a.length,e=d+4,f,g=[],h=[];while(++c<4)f=a[c%d],g.push(f[0]),h.push(f[1]);b=[cK(cN,g),",",cK(cN,h)],--c;while(++c<e)f=a[c%d],g.shift(),g.push(f[0]),h.shift(),h.push(f[1]),cO(b,g,h);return b.join("")}function cJ(a,b){var c=a.length-1,d=a[0][0],e=a[0][1],f=a[c][0]-d,g=a[c][1]-e,h=-1,i,j;while(++h<=c)i=a[h],j=h/c,i[0]=b*i[0]+(1-b)*(d+j*f),i[1]=b*i[1]+(1-b)*(e+j*g);return cG(a)}function cK(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]}function cO(a,b,c){a.push("C",cK(cL,b),",",cK(cL,c),",",cK(cM,b),",",cK(cM,c),",",cK(cN,b),",",cK(cN,c))}function cP(a,b){return(b[1]-a[1])/(b[0]-a[0])}function cQ(a){var b=0,c=a.length-1,d=[],e=a[0],f=a[1],g=d[0]=cP(e,f);while(++b<c)d[b]=g+(g=cP(e=f,f=a[b+1]));return d[b]=g,d}function cR(a){var b=[],c,d,e,f,g=cQ(a),h=-1,i=a.length-1;while(++h<i)c=cP(a[h],a[h+1]),Math.abs(c)<1e-6?g[h]=g[h+1]=0:(d=g[h]/c,e=g[h+1]/c,f=d*d+e*e,f>9&&(f=c*3/Math.sqrt(f),g[h]=f*d,g[h+1]=f*e));h=-1;while(++h<=i)f=(a[Math.min(i,h+1)][0]-a[Math.max(0,h-1)][0])/(6*(1+g[h]*g[h])),b.push([f||0,g[h]*f||0]);return b}function cS(a){return a.length<3?cy(a):a[0]+cE(a,cR(a))}function cT(a){var b,c=-1,d=a.length,e,f;while(++c<d)b=a[c],e=b[0],f=b[1]+cn,b[0]=e*Math.cos(f),b[1]=e*Math.sin(f);return a}function cU(a){function j(f){if(f.length<1)return null;var j=cu(this,f,b,d),k=cu(this,f,b===c?cV(j):c,d===e?cW(j):e);return"M"+g(a(k),i)+"L"+h(a(j.reverse()),i)+"Z"}var b=cv,c=cv,d=0,e=cw,f,g,h,i=.7;return j.x=function(a){return arguments.length?(b=c=a,j):c},j.x0=function(a){return arguments.length?(b=a,j):b},j.x1=function(a){return arguments.length?(c=a,j):c},j.y=function(a){return arguments.length?(d=e=a,j):e},j.y0=function(a){return arguments.length?(d=a,j):d},j.y1=function(a){return arguments.length?(e=a,j):e},j.interpolate=function(a){return arguments.length?(g=cx[f=a],h=g.reverse||g,j):f},j.tension=function(a){return arguments.length?(i=a,j):i},j.interpolate("linear")}function cV(a){return function(b,c){return a[c][0]}}function cW(a){return function(b,c){return a[c][1]}}function cX(a){return a.source}function cY(a){return a.target}function cZ(a){return a.radius}function c$(a){return a.startAngle}function c_(a){return a.endAngle}function da(a){return[a.x,a.y]}function db(a){return function(){var b=a.apply(this,arguments),c=b[0],d=b[1]+cn;return[c*Math.cos(d),c*Math.sin(d)]}}function dd(a,b){var c=(a.ownerSVGElement||a).createSVGPoint();if(dc<0&&(window.scrollX||window.scrollY)){var d=d3.select(document.body).append("svg").style("position","absolute").style("top",0).style("left",0),e=d[0][0].getScreenCTM();dc=!e.f&&!e.e,d.remove()}return dc?(c.x=b.pageX,c.y=b.pageY):(c.x=b.clientX,c.y=b.clientY),c=c.matrixTransform(a.getScreenCTM().inverse()),[c.x,c.y]}function de(){return 64}function df(){return"circle"}function dj(a,b){a.attr("transform",function(a){return"translate("+b(a)+",0)"})}function dk(a,b){a.attr("transform",function(a){return"translate(0,"+b(a)+")"})}function dl(a,b,c){e=[];if(c&&b.length>1){var d=bQ(a.domain()),e,f=-1,g=b.length,h=(b[1]-b[0])/++c,i,j;while(++f<g)for(i=c;--i>0;)(j=+b[f]-i*h)>=d[0]&&e.push(j);for(--f,i=0;++i<c&&(j=+b[f]+i*h)<d[1];)e.push(j)}return e}function dx(a,b){a.select(".extent").attr("x",b[0][0]),a.selectAll(".n,.s,.w,.nw,.sw").attr("x",b[0][0]-2),a.selectAll(".e,.ne,.se").attr("x",b[1][0]-3),a.selectAll(".extent,.n,.s").attr("width",b[1][0]-b[0][0])}function dy(a,b){a.select(".extent").attr("y",b[0][1]),a.selectAll(".n,.e,.w,.nw,.ne").attr("y",b[0][1]-3),a.selectAll(".s,.se,.sw").attr("y",b[1][1]-4),a.selectAll(".extent,.e,.w").attr("height",b[1][1]-b[0][1])}function dz(){d3.event.keyCode==32&&dp&&!dt&&(dv=null,dw[0]-=ds[1][0],dw[1]-=ds[1][1],dt=2,O())}function dA(){d3.event.keyCode==32&&dt==2&&(dw[0]+=ds[1][0],dw[1]+=ds[1][1],dt=0,O())}function dB(){if(dw){var a=d3.svg.mouse(dp),b=d3.select(dp);dt||(d3.event.altKey?(dv||(dv=[(ds[0][0]+ds[1][0])/2,(ds[0][1]+ds[1][1])/2]),dw[0]=ds[+(a[0]<dv[0])][0],dw[1]=ds[+(a[1]<dv[1])][1]):dv=null),dq&&(dC(a,dq,0),dx(b,ds)),dr&&(dC(a,dr,1),dy(b,ds)),dn("brush")}}function dC(a,b,c){var d=bR(b),e=d[0],f=d[1],g=dw[c],h=ds[1][c]-ds[0][c],i,j;dt&&(e-=g,f-=h+g),i=Math.max(e,Math.min(f,a[c])),dt?j=(i+=g)+h:(dv&&(g=Math.max(e,Math.min(f,2*dv[c]-i))),g<i?(j=i,i=g):j=g),ds[0][c]=i,ds[1][c]=j}function dD(){dw&&(dB(),d3.select(dp).selectAll(".resize").style("pointer-events",dm.empty()?"none":"all"),dn("brushend"),dm=dn=dp=dq=dr=ds=dt=du=dv=dw=null,O())}function dM(a){var b=dN(),c=d3.event,d=d3.event={type:a};b&&(d.x=b[0]+dJ[0],d.y=b[1]+dJ[1],d.dx=b[0]-dK[0],d.dy=b[1]-dK[1],dL|=d.dx|d.dy,dK=b);try{dF[a].apply(dH,dI)}finally{d3.event=c}c.stopPropagation(),c.preventDefault()}function dN(){var a=dH.parentNode,b=d3.event.changedTouches;return a&&(b?d3.svg.touches(a,b)[0]:d3.svg.mouse(a))}function dO(){if(!dH)return;var a=dH.parentNode;if(!a)return dP();dM("drag"),O()}function dP(){if(!dH)return;dM("dragend"),dL&&(O(),dL=d3.event.target===dG),dF=dG=dH=dI=dJ=dK=null}function dQ(){dL&&(O(),dL=0)}function eb(a){return[a[0]-dW[0],a[1]-dW[1],dW[2]]}function ec(){dR||(dR=d3.select("body").append("div").style("visibility","hidden").style("top",0).style("height",0).style("width",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode);var a=d3.event,b;try{dR.scrollTop=1e3,dR.dispatchEvent(a),b=1e3-dR.scrollTop}catch(c){b=a.wheelDelta||-a.detail*5}return b*.005}function ed(){var a=d3.svg.touches(d$),b=-1,c=a.length,d;while(++b<c)dU[(d=a[b]).identifier]=eb(d);return a}function ee(){var a=d3.svg.touches(d$);switch(a.length){case 1:var b=a[0];ei(dW[2],b,dU[b.identifier]);break;case 2:var c=a[0],d=a[1],e=[(c[0]+d[0])/2,(c[1]+d[1])/2],f=dU[c.identifier],g=dU[d.identifier],h=[(f[0]+g[0])/2,(f[1]+g[1])/2,f[2]];ei(Math.log(d3.event.scale)/Math.LN2+f[2],e,h)}}function ef(){dT=null,dS&&(ea=1,ei(dW[2],d3.svg.mouse(d$),dS))}function eg(){dS&&(ea&&(O(),ea=dZ===d3.event.target),dW=dX=dY=dZ=d$=d_=dS=null)}function eh(){ea&&(O(),ea=0)}function ei(a,b,c){function l(a,b,c){a.domain(a.range().map(function(f){return a.invert((f-c)*d/e+b)}))}a=ek(a,2);var d=Math.pow(2,dW[2]),e=Math.pow(2,a),f=Math.pow(2,(dW[2]=a)-c[2]),g=dW[0],h=dW[1],i=dW[0]=ek(b[0]-c[0]*f,0,e),j=dW[1]=ek(b[1]-c[1]*f,1,e),k=d3.event;d3.event={scale:e,translate:[i,j],transform:function(a,b){a&&l(a,g,i),b&&l(b,h,j)}};try{dY.apply(d$,d_)}finally{d3.event=k}k.preventDefault()}function ek(a,b,c){var d=dX[b],e=d[0],f=d[1];return arguments.length===3?Math.max(f*(f===Infinity?-Infinity:1/c-1),Math.min(e===-Infinity?Infinity:e,a/c))*c:Math.max(e,Math.min(f,a))}Date.now||(Date.now=function(){return+(new Date)});try{document.createElement("div").style.setProperty("opacity",0,"")}catch(a){var b=CSSStyleDeclaration.prototype,c=b.setProperty;b.setProperty=function(a,b,d){c.call(this,a,b+"",d)}}d3={version:"2.7.0"};var d=f;try{d(document.documentElement.childNodes)[0].nodeType}catch(g){d=e}var h=[].__proto__?function(a,b){a.__proto__=b}:function(a,b){for(var c in b)a[c]=b[c]};d3.functor=function(a){return typeof a=="function"?a:function(){return a}},d3.rebind=function(a,b){var c=1,d=arguments.length,e;while(++c<d)a[e=arguments[c]]=j(a,b,b[e]);return a},d3.ascending=function(a,b){return a<b?-1:a>b?1:a>=b?0:NaN},d3.descending=function(a,b){return b<a?-1:b>a?1:b>=a?0:NaN},d3.mean=function(a,b){var c=a.length,d,e=0,f=-1,g=0;if(arguments.length===1)while(++f<c)k(d=a[f])&&(e+=(d-e)/++g);else while(++f<c)k(d=b.call(a,a[f],f))&&(e+=(d-e)/++g);return g?e:undefined},d3.median=function(a,b){return arguments.length>1&&(a=a.map(b)),a=a.filter(k),a.length?d3.quantile(a.sort(d3.ascending),.5):undefined},d3.min=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++c<d&&((e=a[c])==null||e!=e))e=undefined;while(++c<d)(f=a[c])!=null&&e>f&&(e=f)}else{while(++c<d&&((e=b.call(a,a[c],c))==null||e!=e))e=undefined;while(++c<d)(f=b.call(a,a[c],c))!=null&&e>f&&(e=f)}return e},d3.max=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++c<d&&((e=a[c])==null||e!=e))e=undefined;while(++c<d)(f=a[c])!=null&&f>e&&(e=f)}else{while(++c<d&&((e=b.call(a,a[c],c))==null||e!=e))e=undefined;while(++c<d)(f=b.call(a,a[c],c))!=null&&f>e&&(e=f)}return e},d3.extent=function(a,b){var c=-1,d=a.length,e,f,g;if(arguments.length===1){while(++c<d&&((e=g=a[c])==null||e!=e))e=g=undefined;while(++c<d)(f=a[c])!=null&&(e>f&&(e=f),g<f&&(g=f))}else{while(++c<d&&((e=g=b.call(a,a[c],c))==null||e!=e))e=undefined;while(++c<d)(f=b.call(a,a[c],c))!=null&&(e>f&&(e=f),g<f&&(g=f))}return[e,g]},d3.random={normal:function(a,b){return arguments.length<2&&(b=1),arguments.length<1&&(a=0),function(){var c,d,e;do c=Math.random()*2-1,d=Math.random()*2-1,e=c*c+d*d;while(!e||e>1);return a+b*c*Math.sqrt(-2*Math.log(e)/e)}}},d3.sum=function(a,b){var c=0,d=a.length,e,f=-1;if(arguments.length===1)while(++f<d)isNaN(e=+a[f])||(c+=e);else while(++f<d)isNaN(e=+b.call(a,a[f],f))||(c+=e);return c},d3.quantile=function(a,b){var c=(a.length-1)*b+1,d=Math.floor(c),e=a[d-1],f=c-d;return f?e+f*(a[d]-e):e},d3.transpose=function(a){return d3.zip.apply(d3,a)},d3.zip=function(){if(!(e=arguments.length))return[];for(var a=-1,b=d3.min(arguments,l),c=new Array(b);++a<b;)for(var d=-1,e,f=c[a]=new Array(e);++d<e;)f[d]=arguments[d][a];return c},d3.bisectLeft=function(a,b,c,d){arguments.length<3&&(c=0),arguments.length<4&&(d=a.length);while(c<d){var e=c+d>>1;a[e]<b?c=e+1:d=e}return c},d3.bisect=d3.bisectRight=function(a,b,c,d){arguments.length<3&&(c=0),arguments.length<4&&(d=a.length);while(c<d){var e=c+d>>1;b<a[e]?d=e:c=e+1}return c},d3.first=function(a,b){var c=0,d=a.length,e=a[0],f;arguments.length===1&&(b=d3.ascending);while(++c<d)b.call(a,e,f=a[c])>0&&(e=f);return e},d3.last=function(a,b){var c=0,d=a.length,e=a[0],f;arguments.length===1&&(b=d3.ascending);while(++c<d)b.call(a,e,f=a[c])<=0&&(e=f);return e},d3.nest=function(){function f(c,g){if(g>=b.length)return e?e.call(a,c):d?c.sort(d):c;var h=-1,i=c.length,j=b[g++],k,l,m={};while(++h<i)(k=j(l=c[h]))in m?m[k].push(l):m[k]=[l];for(k in m)m[k]=f(m[k],g);return m}function g(a,d){if(d>=b.length)return a;var e=[],f=c[d++],h;for(h in a)e.push({key:h,values:g(a[h],d)});return f&&e.sort(function(a,b){return f(a.key,b.key)}),e}var a={},b=[],c=[],d,e;return a.map=function(a){return f(a,0)},a.entries=function(a){return g(f(a,0),0)},a.key=function(c){return b.push(c),a},a.sortKeys=function(d){return c[b.length-1]=d,a},a.sortValues=function(b){return d=b,a},a.rollup=function(b){return e=b,a},a},d3.keys=function(a){var b=[];for(var c in a)b.push(c);return b},d3.values=function(a){var b=[];for(var c in a)b.push(a[c]);return b},d3.entries=function(a){var b=[];for(var c in a)b.push({key:c,value:a[c]});return b},d3.permute=function(a,b){var c=[],d=-1,e=b.length;while(++d<e)c[d]=a[b[d]];return c},d3.merge=function(a){return Array.prototype.concat.apply([],a)},d3.split=function(a,b){var c=[],d=[],e,f=-1,g=a.length;arguments.length<2&&(b=m);while(++f<g)b.call(d,e=a[f],f)?d=[]:(d.length||c.push(d),d.push(e));return c},d3.range=function(a,b,c){arguments.length<3&&(c=1,arguments.length<2&&(b=a,a=0));if((b-a)/c==Infinity)throw new Error("infinite range");var d=[],e=-1,f;if(c<0)while((f=a+c*++e)>b)d.push(f);else while((f=a+c*++e)<b)d.push(f);return d},d3.requote=function(a){return a.replace(o,"\\$&")};var o=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;d3.round=function(a,b){return b?Math.round(a*Math.pow(10,b))*Math.pow(10,-b):Math.round(a)},d3.xhr=function(a,b,c){var d=new XMLHttpRequest;arguments.length<3?c=b:b&&d.overrideMimeType&&d.overrideMimeType(b),d.open("GET",a,!0),d.onreadystatechange=function(){d.readyState===4&&c(d.status<300?d:null)},d.send(null)},d3.text=function(a,b,c){function d(a){c(a&&a.responseText)}arguments.length<3&&(c=b,b=null),d3.xhr(a,b,d)},d3.json=function(a,b){d3.text(a,"application/json",function(a){b(a?JSON.parse(a):null)})},d3.html=function(a,b){d3.text(a,"text/html",function(a){if(a!=null){var c=document.createRange();c.selectNode(document.body),a=c.createContextualFragment(a)}b(a)})},d3.xml=function(a,b,c){function d(a){c(a&&a.responseXML)}arguments.length<3&&(c=b,b=null),d3.xhr(a,b,d)};var p={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};d3.ns={prefix:p,qualify:function(a){var b=a.indexOf(":");return b<0?a in p?{space:p[a],local:a}:a:{space:p[a.substring(0,b)],local:a.substring(b+1)}}},d3.dispatch=function(){var a=new q,b=-1,c=arguments.length;while(++b<c)a[arguments[b]]=r();return a},q.prototype.on=function(a,b){var c=a.indexOf("."),d="";return c>0&&(d=a.substring(c+1),a=a.substring(0,c)),arguments.length<2?this[a].on(d):(this[a].on(d,b),this)},d3.format=function(a){var b=s.exec(a),c=b[1]||" ",d=b[3]||"",e=b[5],f=+b[6],g=b[7],h=b[8],i=b[9],j=1,k="",l=!1;h&&(h=+h.substring(1)),e&&(c="0",g&&(f-=Math.floor((f-1)/4)));switch(i){case"n":g=!0,i="g";break;case"%":j=100,k="%",i="f";break;case"p":j=100,k="%",i="r";break;case"d":l=!0,h=0;break;case"s":j=-1,i="r"}return i=="r"&&!h&&(i="g"),i=t[i]||v,function(a){if(l&&a%1)return"";var b=a<0&&(a=-a)?"−":d;if(j<0){var m=d3.formatPrefix(a,h);a*=m.scale,k=m.symbol}else a*=j;a=i(a,h);if(e){var n=a.length+b.length;n<f&&(a=(new Array(f-n+1)).join(c)+a),g&&(a=w(a)),a=b+a}else{g&&(a=w(a)),a=b+a;var n=a.length;n<f&&(a=(new Array(f-n+1)).join(c)+a)}return a+k}};var s=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,t={g:function(a,b){return a.toPrecision(b)},e:function(a,b){return a.toExponential(b)},f:function(a,b){return a.toFixed(b)},r:function(a,b){return d3.round(a,b=u(a,b)).toFixed(Math.max(0,Math.min(20,b)))}},x=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(y);d3.formatPrefix=function(a,b){var c=0;return a&&(a<0&&(a*=-1),b&&(a=d3.round(a,u(a,b))),c=1+Math.floor(1e-12+Math.log(a)/Math.LN10),c=Math.max(-24,Math.min(24,Math.floor((c<=0?c+1:c-1)/3)*3))),x[8+c/3]};var z=H(2),A=H(3),B={linear:function(){return G},poly:H,quad:function(){return z},cubic:function(){return A},sin:function(){return I},exp:function(){return J},circle:function(){return K},elastic:L,back:M,bounce:function(){return N}},C={"in":function(a){return a},out:E,"in-out":F,"out-in":function(a){return F(E(a))}};d3.ease=function(a){var b=a.indexOf("-"),c=b>=0?a.substring(0,b):a,d=b>=0?a.substring(b+1):"in";return D(C[d](B[c].apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.interpolate=function(a,b){var c=d3.interpolators.length,d;while(--c>=0&&!(d=d3.interpolators[c](a,b)));return d},d3.interpolateNumber=function(a,b){return b-=a,function(c){return a+b*c}},d3.interpolateRound=function(a,b){return b-=a,function(c){return Math.round(a+b*c)}},d3.interpolateString=function(a,b){var c,d,e,f=0,g=0,h=[],i=[],j,k;P.lastIndex=0;for(d=0;c=P.exec(b);++d)c.index&&h.push(b.substring(f,g=c.index)),i.push({i:h.length,x:c[0]}),h.push(null),f=P.lastIndex;f<b.length&&h.push(b.substring(f));for(d=0,j=i.length;(c=P.exec(a))&&d<j;++d){k=i[d];if(k.x==c[0]){if(k.i)if(h[k.i+1]==null){h[k.i-1]+=k.x,h.splice(k.i,1);for(e=d+1;e<j;++e)i[e].i--}else{h[k.i-1]+=k.x+h[k.i+1],h.splice(k.i,2);for(e=d+1;e<j;++e)i[e].i-=2}else if(h[k.i+1]==null)h[k.i]=k.x;else{h[k.i]=k.x+h[k.i+1],h.splice(k.i+1,1);for(e=d+1;e<j;++e)i[e].i--}i.splice(d,1),j--,d--}else k.x=d3.interpolateNumber(parseFloat(c[0]),parseFloat(k.x))}while(d<j)k=i.pop(),h[k.i+1]==null?h[k.i]=k.x:(h[k.i]=k.x+h[k.i+1],h.splice(k.i+1,1)),j--;return h.length===1?h[0]==null?i[0].x:function(){return b}:function(a){for(d=0;d<j;++d)h[(k=i[d]).i]=k.x(a);return h.join("")}},d3.interpolateTransform=function(a,b){return d3.interpolateString(d3.transform(a)+"",d3.transform(b)+"")},d3.interpolateRgb=function(a,b){a=d3.rgb(a),b=d3.rgb(b);var c=a.r,d=a.g,e=a.b,f=b.r-c,g=b.g-d,h=b.b-e;return function(a){return"#"+V(Math.round(c+f*a))+V(Math.round(d+g*a))+V(Math.round(e+h*a))}},d3.interpolateHsl=function(a,b){a=d3.hsl(a),b=d3.hsl(b);var c=a.h,d=a.s,e=a.l,f=b.h-c,g=b.s-d,h=b.l-e;return function(a){return bb(c+f*a,d+g*a,e+h*a).toString()}},d3.interpolateArray=function(a,b){var c=[],d=[],e=a.length,f=b.length,g=Math.min(a.length,b.length),h;for(h=0;h<g;++h)c.push(d3.interpolate(a[h],b[h]));for(;h<e;++h)d[h]=a[h];for(;h<f;++h)d[h]=b[h];return function(a){for(h=0;h<g;++h)d[h]=c[h](a);return d}},d3.interpolateObject=function(a,b){var c={},d={},e;for(e in a)e in b?c[e]=Q(e)(a[e],b[e]):d[e]=a[e];for(e in b)e in a||(d[e]=b[e]);return function(a){for(e in c)d[e]=c[e](a);return d}};var P=/[-+]?(?:\d*\.?\d+)(?:[eE][-+]?\d+)?/g;d3.interpolators=[d3.interpolateObject,function(a,b){return b instanceof Array&&d3.interpolateArray(a,b)},function(a,b){return(typeof a=="string"||typeof b=="string")&&d3.interpolateString(a+"",b+"")},function(a,b){return(typeof b=="string"?b in Z||/^(#|rgb\(|hsl\()/.test(b):b instanceof U||b instanceof ba)&&d3.interpolateRgb(a,b)},function(a,b){return!isNaN(a=+a)&&!isNaN(b=+b)&&d3.interpolateNumber(a,b)}],d3.rgb=function(a,b,c){return arguments.length===1?a instanceof U?T(a.r,a.g,a.b):W(""+a,T,bb):T(~~a,~~b,~~c)},U.prototype.brighter=function(a){a=Math.pow(.7,arguments.length?a:1);var b=this.r,c=this.g,d=this.b,e=30;return!b&&!c&&!d?T(e,e,e):(b&&b<e&&(b=e),c&&c<e&&(c=e),d&&d<e&&(d=e),T(Math.min(255,Math.floor(b/a)),Math.min(255,Math.floor(c/a)),Math.min(255,Math.floor(d/a))))},U.prototype.darker=function(a){return a=Math.pow(.7,arguments.length?a:1),T(Math.floor(a*this.r),Math.floor(a*this.g),Math.floor(a*this.b))},U.prototype.hsl=function(){return X(this.r,this.g,this.b)},U.prototype.toString=function(){return"#"+V(this.r)+V(this.g)+V(this.b)};var Z={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f"
+,darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};for(var $ in Z)Z[$]=W(Z[$],T,bb);d3.hsl=function(a,b,c){return arguments.length===1?a instanceof ba?_(a.h,a.s,a.l):W(""+a,X,_):_(+a,+b,+c)},ba.prototype.brighter=function(a){return a=Math.pow(.7,arguments.length?a:1),_(this.h,this.s,this.l/a)},ba.prototype.darker=function(a){return a=Math.pow(.7,arguments.length?a:1),_(this.h,this.s,a*this.l)},ba.prototype.rgb=function(){return bb(this.h,this.s,this.l)},ba.prototype.toString=function(){return this.rgb().toString()};var bd=function(a,b){return b.querySelector(a)},be=function(a,b){return b.querySelectorAll(a)},bf=document.documentElement,bg=bf.matchesSelector||bf.webkitMatchesSelector||bf.mozMatchesSelector||bf.msMatchesSelector||bf.oMatchesSelector,bh=function(a,b){return bg.call(a,b)};typeof Sizzle=="function"&&(bd=function(a,b){return Sizzle(a,b)[0]},be=function(a,b){return Sizzle.uniqueSort(Sizzle(a,b))},bh=Sizzle.matchesSelector);var bi=[];d3.selection=function(){return bq},d3.selection.prototype=bi,bi.select=function(a){var b=[],c,d,e,f;typeof a!="function"&&(a=bj(a));for(var g=-1,h=this.length;++g<h;){b.push(c=[]),c.parentNode=(e=this[g]).parentNode;for(var i=-1,j=e.length;++i<j;)(f=e[i])?(c.push(d=a.call(f,f.__data__,i)),d&&"__data__"in f&&(d.__data__=f.__data__)):c.push(null)}return bc(b)},bi.selectAll=function(a){var b=[],c,e;typeof a!="function"&&(a=bk(a));for(var f=-1,g=this.length;++f<g;)for(var h=this[f],i=-1,j=h.length;++i<j;)if(e=h[i])b.push(c=d(a.call(e,e.__data__,i))),c.parentNode=e;return bc(b)},bi.attr=function(a,b){function d(){this.removeAttribute(a)}function e(){this.removeAttributeNS(a.space,a.local)}function f(){this.setAttribute(a,b)}function g(){this.setAttributeNS(a.space,a.local,b)}function h(){var c=b.apply(this,arguments);c==null?this.removeAttribute(a):this.setAttribute(a,c)}function i(){var c=b.apply(this,arguments);c==null?this.removeAttributeNS(a.space,a.local):this.setAttributeNS(a.space,a.local,c)}a=d3.ns.qualify(a);if(arguments.length<2){var c=this.node();return a.local?c.getAttributeNS(a.space,a.local):c.getAttribute(a)}return this.each(b==null?a.local?e:d:typeof b=="function"?a.local?i:h:a.local?g:f)},bi.classed=function(a,b){var c=a.split(bl),d=c.length,e=-1;if(arguments.length>1){while(++e<d)bm.call(this,c[e],b);return this}while(++e<d)if(!bm.call(this,c[e]))return!1;return!0};var bl=/\s+/g;bi.style=function(a,b,c){function d(){this.style.removeProperty(a)}function e(){this.style.setProperty(a,b,c)}function f(){var d=b.apply(this,arguments);d==null?this.style.removeProperty(a):this.style.setProperty(a,d,c)}return arguments.length<3&&(c=""),arguments.length<2?window.getComputedStyle(this.node(),null).getPropertyValue(a):this.each(b==null?d:typeof b=="function"?f:e)},bi.property=function(a,b){function c(){delete this[a]}function d(){this[a]=b}function e(){var c=b.apply(this,arguments);c==null?delete this[a]:this[a]=c}return arguments.length<2?this.node()[a]:this.each(b==null?c:typeof b=="function"?e:d)},bi.text=function(a){return arguments.length<1?this.node().textContent:this.each(typeof a=="function"?function(){this.textContent=a.apply(this,arguments)}:function(){this.textContent=a})},bi.html=function(a){return arguments.length<1?this.node().innerHTML:this.each(typeof a=="function"?function(){this.innerHTML=a.apply(this,arguments)}:function(){this.innerHTML=a})},bi.append=function(a){function b(){return this.appendChild(document.createElementNS(this.namespaceURI,a))}function c(){return this.appendChild(document.createElementNS(a.space,a.local))}return a=d3.ns.qualify(a),this.select(a.local?c:b)},bi.insert=function(a,b){function c(){return this.insertBefore(document.createElementNS(this.namespaceURI,a),bd(b,this))}function d(){return this.insertBefore(document.createElementNS(a.space,a.local),bd(b,this))}return a=d3.ns.qualify(a),this.select(a.local?d:c)},bi.remove=function(){return this.each(function(){var a=this.parentNode;a&&a.removeChild(this)})},bi.data=function(a,b){function f(a,f){var g,h=a.length,i=f.length,j=Math.min(h,i),k=Math.max(h,i),l=[],m=[],n=[],o,p;if(b){var q={},r=[],s,t=f.length;for(g=-1;++g<h;)s=b.call(o=a[g],o.__data__,g),s in q?n[t++]=o:q[s]=o,r.push(s);for(g=-1;++g<i;)o=q[s=b.call(f,p=f[g],g)],o?(o.__data__=p,l[g]=o,m[g]=n[g]=null):(m[g]=bn(p),l[g]=n[g]=null),delete q[s];for(g=-1;++g<h;)r[g]in q&&(n[g]=a[g])}else{for(g=-1;++g<j;)o=a[g],p=f[g],o?(o.__data__=p,l[g]=o,m[g]=n[g]=null):(m[g]=bn(p),l[g]=n[g]=null);for(;g<i;++g)m[g]=bn(f[g]),l[g]=n[g]=null;for(;g<k;++g)n[g]=a[g],m[g]=l[g]=null}m.update=l,m.parentNode=l.parentNode=n.parentNode=a.parentNode,c.push(m),d.push(l),e.push(n)}var c=[],d=[],e=[],g=-1,h=this.length,i;if(typeof a=="function")while(++g<h)f(i=this[g],a.call(i,i.parentNode.__data__,g));else while(++g<h)f(i=this[g],a);var j=bc(d);return j.enter=function(){return br(c)},j.exit=function(){return bc(e)},j},bi.filter=function(a){var b=[],c,d,e;typeof a!="function"&&(a=bo(a));for(var f=0,g=this.length;f<g;f++){b.push(c=[]),c.parentNode=(d=this[f]).parentNode;for(var h=0,i=d.length;h<i;h++)(e=d[h])&&a.call(e,e.__data__,h)&&c.push(e)}return bc(b)},bi.map=function(a){return this.each(function(){this.__data__=a.apply(this,arguments)})},bi.order=function(){for(var a=-1,b=this.length;++a<b;)for(var c=this[a],d=c.length-1,e=c[d],f;--d>=0;)if(f=c[d])e&&e.parentNode.insertBefore(f,e),e=f;return this},bi.sort=function(a){a=bp.apply(this,arguments);for(var b=-1,c=this.length;++b<c;)this[b].sort(a);return this.order()},bi.on=function(a,b,c){arguments.length<3&&(c=!1);var d="__on"+a,e=a.indexOf(".");return e>0&&(a=a.substring(0,e)),arguments.length<2?(e=this.node()[d])&&e._:this.each(function(e,f){function h(a){var c=d3.event;d3.event=a;try{b.call(g,g.__data__,f)}finally{d3.event=c}}var g=this;g[d]&&g.removeEventListener(a,g[d],c),b&&g.addEventListener(a,g[d]=h,c),h._=b})},bi.each=function(a){for(var b=-1,c=this.length;++b<c;)for(var d=this[b],e=-1,f=d.length;++e<f;){var g=d[e];g&&a.call(g,g.__data__,e,b)}return this},bi.call=function(a){return a.apply(this,(arguments[0]=this,arguments)),this},bi.empty=function(){return!this.node()},bi.node=function(a){for(var b=0,c=this.length;b<c;b++)for(var d=this[b],e=0,f=d.length;e<f;e++){var g=d[e];if(g)return g}return null},bi.transition=function(){var a=[],b,c;for(var d=-1,e=this.length;++d<e;){a.push(b=[]);for(var f=this[d],g=-1,h=f.length;++g<h;)b.push((c=f[g])?{node:c,delay:0,duration:250}:null)}return bt(a,bz||++by,Date.now())};var bq=bc([[document]]);bq[0].parentNode=bf,d3.select=function(a){return typeof a=="string"?bq.select(a):bc([[a]])},d3.selectAll=function(a){return typeof a=="string"?bq.selectAll(a):bc([d(a)])};var bs=[];bs.append=bi.append,bs.insert=bi.insert,bs.empty=bi.empty,bs.node=bi.node,bs.select=function(a){var b=[],c,d,e,f,g;for(var h=-1,i=this.length;++h<i;){e=(f=this[h]).update,b.push(c=[]),c.parentNode=f.parentNode;for(var j=-1,k=f.length;++j<k;)(g=f[j])?(c.push(e[j]=d=a.call(f.parentNode,g.__data__,j)),d.__data__=g.__data__):c.push(null)}return bc(b)};var bu={},bx=[],by=0,bz=0,bA=d3.ease("cubic-in-out");bx.call=bi.call,d3.transition=function(){return bq.transition()},d3.transition.prototype=bx,bx.select=function(a){var b=[],c,d,e;typeof a!="function"&&(a=bj(a));for(var f=-1,g=this.length;++f<g;){b.push(c=[]);for(var h=this[f],i=-1,j=h.length;++i<j;)(e=h[i])&&(d=a.call(e.node,e.node.__data__,i))?("__data__"in e.node&&(d.__data__=e.node.__data__),c.push({node:d,delay:e.delay,duration:e.duration})):c.push(null)}return bt(b,this.id,this.time).ease(this.ease())},bx.selectAll=function(a){var b=[],c,d,e;typeof a!="function"&&(a=bk(a));for(var f=-1,g=this.length;++f<g;)for(var h=this[f],i=-1,j=h.length;++i<j;)if(e=h[i]){d=a.call(e.node,e.node.__data__,i),b.push(c=[]);for(var k=-1,l=d.length;++k<l;)c.push({node:d[k],delay:e.delay,duration:e.duration})}return bt(b,this.id,this.time).ease(this.ease())},bx.attr=function(a,b){return this.attrTween(a,bw(a,b))},bx.attrTween=function(a,b){function d(a,d){var e=b.call(this,a,d,this.getAttribute(c));return e===bu?(this.removeAttribute(c),null):e&&function(a){this.setAttribute(c,e(a))}}function e(a,d){var e=b.call(this,a,d,this.getAttributeNS(c.space,c.local));return e===bu?(this.removeAttributeNS(c.space,c.local),null):e&&function(a){this.setAttributeNS(c.space,c.local,e(a))}}var c=d3.ns.qualify(a);return this.tween("attr."+a,c.local?e:d)},bx.style=function(a,b,c){return arguments.length<3&&(c=""),this.styleTween(a,bw(a,b),c)},bx.styleTween=function(a,b,c){return arguments.length<3&&(c=""),this.tween("style."+a,function(d,e){var f=b.call(this,d,e,window.getComputedStyle(this,null).getPropertyValue(a));return f===bu?(this.style.removeProperty(a),null):f&&function(b){this.style.setProperty(a,f(b),c)}})},bx.text=function(a){return this.tween("text",function(b,c){this.textContent=typeof a=="function"?a.call(this,b,c):a})},bx.remove=function(){return this.each("end",function(){var a;!this.__transition__&&(a=this.parentNode)&&a.removeChild(this)})},bx.delay=function(a){var b=this;return b.each(typeof a=="function"?function(c,d,e){b[e][d].delay=+a.apply(this,arguments)}:(a=+a,function(c,d,e){b[e][d].delay=a}))},bx.duration=function(a){var b=this;return b.each(typeof a=="function"?function(c,d,e){b[e][d].duration=+a.apply(this,arguments)}:(a=+a,function(c,d,e){b[e][d].duration=a}))},bx.transition=function(){return this.select(i)};var bC=null,bD,bE;d3.timer=function(a,b,c){var d=!1,e,f=bC;if(arguments.length<3){if(arguments.length<2)b=0;else if(!isFinite(b))return;c=Date.now()}while(f){if(f.callback===a){f.then=c,f.delay=b,d=!0;break}e=f,f=f.next}d||(bC={callback:a,then:c,delay:b,next:bC}),bD||(bE=clearTimeout(bE),bD=1,bH(bF))},d3.timer.flush=function(){var a,b=Date.now(),c=bC;while(c)a=b-c.then,c.delay||(c.flush=c.callback(a)),c=c.next;bG()};var bH=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,17)};d3.transform=function(a){bM.setAttribute("transform",a);var b=bM.transform.baseVal.consolidate();return new bI(b?b.matrix:bN)},bI.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var bM=document.createElementNS(d3.ns.prefix.svg,"g"),bN={a:1,b:0,c:0,d:1,e:0,f:0},bO=180/Math.PI;d3.scale={},d3.scale.linear=function(){return bU([0,1],[0,1],d3.interpolate,!1)},d3.scale.log=function(){return ca(d3.scale.linear(),cc)};var cb=d3.format(".0e");cc.pow=function(a){return Math.pow(10,a)},cd.pow=function(a){return-Math.pow(10,-a)},d3.scale.pow=function(){return ce(d3.scale.linear(),1)},d3.scale.sqrt=function(){return d3.scale.pow().exponent(.5)},d3.scale.ordinal=function(){return cg([],{t:"range",x:[]})},d3.scale.category10=function(){return d3.scale.ordinal().range(ch)},d3.scale.category20=function(){return d3.scale.ordinal().range(ci)},d3.scale.category20b=function(){return d3.scale.ordinal().range(cj)},d3.scale.category20c=function(){return d3.scale.ordinal().range(ck)};var ch=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],ci=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],cj=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],ck=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];d3.scale.quantile=function(){return cl([],[])},d3.scale.quantize=function(){return cm(0,1,[0,1])},d3.svg={},d3.svg.arc=function(){function e(){var e=a.apply(this,arguments),f=b.apply(this,arguments),g=c.apply(this,arguments)+cn,h=d.apply(this,arguments)+cn,i=(h<g&&(i=g,g=h,h=i),h-g),j=i<Math.PI?"0":"1",k=Math.cos(g),l=Math.sin(g),m=Math.cos(h),n=Math.sin(h);return i>=co?e?"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"M0,"+e+"A"+e+","+e+" 0 1,0 0,"+ -e+"A"+e+","+e+" 0 1,0 0,"+e+"Z":"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"Z":e?"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L"+e*m+","+e*n+"A"+e+","+e+" 0 "+j+",0 "+e*k+","+e*l+"Z":"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L0,0"+"Z"}var a=cp,b=cq,c=cr,d=cs;return e.innerRadius=function(b){return arguments.length?(a=d3.functor(b),e):a},e.outerRadius=function(a){return arguments.length?(b=d3.functor(a),e):b},e.startAngle=function(a){return arguments.length?(c=d3.functor(a),e):c},e.endAngle=function(a){return arguments.length?(d=d3.functor(a),e):d},e.centroid=function(){var e=(a.apply(this,arguments)+b.apply(this,arguments))/2,f=(c.apply(this,arguments)+d.apply(this,arguments))/2+cn;return[Math.cos(f)*e,Math.sin(f)*e]},e};var cn=-Math.PI/2,co=2*Math.PI-1e-6;d3.svg.line=function(){return ct(Object)};var cx={linear:cy,"step-before":cz,"step-after":cA,basis:cG,"basis-open":cH,"basis-closed":cI,bundle:cJ,cardinal:cD,"cardinal-open":cB,"cardinal-closed":cC,monotone:cS},cL=[0,2/3,1/3,0],cM=[0,1/3,2/3,0],cN=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var a=ct(cT);return a.radius=a.x,delete a.x,a.angle=a.y,delete a.y,a},cz.reverse=cA,cA.reverse=cz,d3.svg.area=function(){return cU(Object)},d3.svg.area.radial=function(){var a=cU(cT);return a.radius=a.x,delete a.x,a.innerRadius=a.x0,delete a.x0,a.outerRadius=a.x1,delete a.x1,a.angle=a.y,delete a.y,a.startAngle=a.y0,delete a.y0,a.endAngle=a.y1,delete a.y1,a},d3.svg.chord=function(){function f(c,d){var e=g(this,a,c,d),f=g(this,b,c,d);return"M"+e.p0+i(e.r,e.p1)+(h(e,f)?j(e.r,e.p1,e.r,e.p0):j(e.r,e.p1,f.r,f.p0)+i(f.r,f.p1)+j(f.r,f.p1,e.r,e.p0))+"Z"}function g(a,b,f,g){var h=b.call(a,f,g),i=c.call(a,h,g),j=d.call(a,h,g)+cn,k=e.call(a,h,g)+cn;return{r:i,a0:j,a1:k,p0:[i*Math.cos(j),i*Math.sin(j)],p1:[i*Math.cos(k),i*Math.sin(k)]}}function h(a,b){return a.a0==b.a0&&a.a1==b.a1}function i(a,b){return"A"+a+","+a+" 0 0,1 "+b}function j(a,b,c,d){return"Q 0,0 "+d}var a=cX,b=cY,c=cZ,d=cr,e=cs;return f.radius=function(a){return arguments.length?(c=d3.functor(a),f):c},f.source=function(b){return arguments.length?(a=d3.functor(b),f):a},f.target=function(a){return arguments.length?(b=d3.functor(a),f):b},f.startAngle=function(a){return arguments.length?(d=d3.functor(a),f):d},f.endAngle=function(a){return arguments.length?(e=d3.functor(a),f):e},f},d3.svg.diagonal=function(){function d(d,e){var f=a.call(this,d,e),g=b.call(this,d,e),h=(f.y+g.y)/2,i=[f,{x:f.x,y:h},{x:g.x,y:h},g];return i=i.map(c),"M"+i[0]+"C"+i[1]+" "+i[2]+" "+i[3]}var a=cX,b=cY,c=da;return d.source=function(b){return arguments.length?(a=d3.functor(b),d):a},d.target=function(a){return arguments.length?(b=d3.functor(a),d):b},d.projection=function(a){return arguments.length?(c=a,d):c},d},d3.svg.diagonal.radial=function(){var a=d3.svg.diagonal(),b=da,c=a.projection;return a.projection=function(a){return arguments.length?c(db(b=a)):b},a},d3.svg.mouse=function(a){return dd(a,d3.event)};var dc=/WebKit/.test(navigator.userAgent)?-1:0;d3.svg.touches=function(a,b){return arguments.length<2&&(b=d3.event.touches),b?d(b).map(function(b){var c=dd(a,b);return c.identifier=b.identifier,c}):[]},d3.svg.symbol=function(){function c(c,d){return(dg[a.call(this,c,d)]||dg.circle)(b.call(this,c,d))}var a=df,b=de;return c.type=function(b){return arguments.length?(a=d3.functor(b),c):a},c.size=function(a){return arguments.length?(b=d3.functor(a),c):b},c};var dg={circle:function(a){var b=Math.sqrt(a/Math.PI);return"M0,"+b+"A"+b+","+b+" 0 1,1 0,"+ -b+"A"+b+","+b+" 0 1,1 0,"+b+"Z"},cross:function(a){var b=Math.sqrt(a/5)/2;return"M"+ -3*b+","+ -b+"H"+ -b+"V"+ -3*b+"H"+b+"V"+ -b+"H"+3*b+"V"+b+"H"+b+"V"+3*b+"H"+ -b+"V"+b+"H"+ -3*b+"Z"},diamond:function(a){var b=Math.sqrt(a/(2*di)),c=b*di;return"M0,"+ -b+"L"+c+",0"+" 0,"+b+" "+ -c+",0"+"Z"},square:function(a){var b=Math.sqrt(a)/2;return"M"+ -b+","+ -b+"L"+b+","+ -b+" "+b+","+b+" "+ -b+","+b+"Z"},"triangle-down":function(a){var b=Math.sqrt(a/dh),c=b*dh/2;return"M0,"+c+"L"+b+","+ -c+" "+ -b+","+ -c+"Z"},"triangle-up":function(a){var b=Math.sqrt(a/dh),c=b*dh/2;return"M0,"+ -c+"L"+b+","+c+" "+ -b+","+c+"Z"}};d3.svg.symbolTypes=d3.keys(dg);var dh=Math.sqrt(3),di=Math.tan(30*Math.PI/180);d3.svg.axis=function(){function j(j){j.each(function(k,l,m){var n=d3.select(this),o=j.delay?function(a){var b=bz;try{return bz=j.id,a.transition().delay(j[m][l].delay).duration(j[m][l].duration).ease(j.ease())}finally{bz=b}}:Object,p=a.ticks?a.ticks.apply(a,g):a.domain(),q=h==null?a.tickFormat?a.tickFormat.apply(a,g):String:h,r=dl(a,p,i),s=n.selectAll(".minor").data(r,String),t=s.enter().insert("line","g").attr("class","tick minor").style("opacity",1e-6),u=o(s.exit()).style("opacity",1e-6).remove(),v=o(s).style("opacity",1),w=n.selectAll("g").data(p,String),x=w.enter().insert("g","path").style("opacity",1e-6),y=o(w.exit()).style("opacity",1e-6).remove(),z=o(w).style("opacity",1),A,B=bR(a),C=n.selectAll(".domain").data([0]),D=C.enter().append("path").attr("class","domain"),E=o(C),F=a.copy(),G=this.__chart__||F;this.__chart__=F,x.append("line").attr("class","tick"),x.append("text"),z.select("text").text(q);switch(b){case"bottom":A=dj,v.attr("x2",0).attr("y2",d),z.select("line").attr("x2",0).attr("y2",c),z.select("text").attr("x",0).attr("y",Math.max(c,0)+f).attr("dy",".71em").attr("text-anchor","middle"),E.attr("d","M"+B[0]+","+e+"V0H"+B[1]+"V"+e);break;case"top":A=dj,v.attr("x2",0).attr("y2",-d),z.select("line").attr("x2",0).attr("y2",-c),z.select("text").attr("x",0).attr("y",-(Math.max(c,0)+f)).attr("dy","0em").attr("text-anchor","middle"),E.attr("d","M"+B[0]+","+ -e+"V0H"+B[1]+"V"+ -e);break;case"left":A=dk,v.attr("x2",-d).attr("y2",0),z.select("line").attr("x2",-c).attr("y2",0),z.select("text").attr("x",-(Math.max(c,0)+f)).attr("y",0).attr("dy",".32em").attr("text-anchor","end"),E.attr("d","M"+ -e+","+B[0]+"H0V"+B[1]+"H"+ -e);break;case"right":A=dk,v.attr("x2",d).attr("y2",0),z.select("line").attr("x2",c).attr("y2",0),z.select("text").attr("x",Math.max(c,0)+f).attr("y",0).attr("dy",".32em").attr("text-anchor","start"),E.attr("d","M"+e+","+B[0]+"H0V"+B[1]+"H"+e)}if(a.ticks)x.call(A,G),z.call(A,F),y.call(A,F),t.call(A,G),v.call(A,F),u.call(A,F);else{var H=F.rangeBand()/2,I=function(a){return F(a)+H};x.call(A,I),z.call(A,I)}})}var a=d3.scale.linear(),b="bottom",c=6,d=6,e=6,f=3,g=[10],h,i=0;return j.scale=function(b){return arguments.length?(a=b,j):a},j.orient=function(a){return arguments.length?(b=a,j):b},j.ticks=function(){return arguments.length?(g=arguments,j):g},j.tickFormat=function(a){return arguments.length?(h=a,j):h},j.tickSize=function(a,b,f){if(!arguments.length)return c;var g=arguments.length-1;return c=+a,d=g>1?+b:c,e=g>0?+arguments[g]:c,j},j.tickPadding=function(a){return arguments.length?(f=+a,j):f},j.tickSubdivide=function(a){return arguments.length?(i=+a,j):i},j},d3.svg.brush=function(){function e(a){var g=b&&c?["n","e","s","w","nw","ne","se","sw"]:b?["e","w"]:c?["n","s"]:[];a.each(function(){var a=d3.select(this).on("mousedown.brush",f),h=a.selectAll(".background").data([,]),i=a.selectAll(".extent").data([,]),j=a.selectAll(".resize").data(g,String),k;h.enter().append("rect").attr("class","background").style("visibility","hidden").style("pointer-events","all").style("cursor","crosshair"),i.enter().append("rect").attr("class","extent").style("cursor","move"),j.enter().append("rect").attr("class",function(a){return"resize "+a}).attr("width",6).attr("height",6).style("visibility","hidden").style("pointer-events",e.empty()?"none":"all").style("cursor",function(a){return dE[a]}),j.exit().remove(),b&&(k=bR(b),h.attr("x",k[0]).attr("width",k[1]-k[0]),dx(a,d)),c&&(k=bR(c),h.attr("y",k[0]).attr("height",k[1]-k[0]),dy(a,d))})}function f(){var a=d3.select(d3.event.target);dm=e,dp=this,ds=d,dw=d3.svg.mouse(dp),(dt=a.classed("extent"))?(dw[0]=d[0][0]-dw[0],dw[1]=d[0][1]-dw[1]):a.classed("resize")?(du=d3.event.target.__data__,dw[0]=d[+/w$/.test(du)][0],dw[1]=d[+/^n/.test(du)][1]):d3.event.altKey&&(dv=dw.slice()),dq=!/^(n|s)$/.test(du)&&b,dr=!/^(e|w)$/.test(du)&&c,dn=g(this,arguments),dn("brushstart"),dB(),O()}function g(b,c){return function(d){var f=d3.event;try{d3.event={type:d,target:e},a[d].apply(b,c)}finally{d3.event=f}}}var a=d3.dispatch("brushstart","brush","brushend"),b,c,d=[[0,0],[0,0]];return e.x=function(a){return arguments.length?(b=a,e):b},e.y=function(a){return arguments.length?(c=a,e):c},e.extent=function(a){var f,g,h,i,j;return arguments.length?(b&&(f=a[0],g=a[1],c&&(f=f[0],g=g[0]),b.invert&&(f=b(f),g=b(g)),g<f&&(j=f,f=g,g=j),d[0][0]=f,d[1][0]=g),c&&(h=a[0],i=a[1],b&&(h=h[1],i=i[1]),c.invert&&(h=c(h),i=c(i)),i<h&&(j=h,h=i,i=j),d[0][1]=h,d[1][1]=i),e):(b&&(f=d[0][0],g=d[1][0],b.invert&&(f=b.invert(f),g=b.invert(g)),g<f&&(j=f,f=g,g=j)),c&&(h=d[0][1],i=d[1][1],c.invert&&(h=c.invert(h),i=c.invert(i)),i<h&&(j=h,h=i,i=j)),b&&c?[[f,h],[g,i]]:b?[f,g]:c&&[h,i])},e.clear=function(){return d[0][0]=d[0][1]=d[1][0]=d[1][1]=0,e},e.empty=function(){return b&&d[0][0]===d[1][0]||c&&d[0][1]===d[1][1]},d3.select(window).on("mousemove.brush",dB).on("mouseup.brush",dD).on("keydown.brush",dz).on("keyup.brush",dA),d3.rebind(e,a,"on")};var dm,dn,dp,dq,dr,ds,dt,du,dv,dw,dE={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"};d3.behavior={},d3.behavior.drag=function(){function c(){this.on("mousedown.drag",e).on("touchstart.drag",e),d3.select(window).on("mousemove.drag",dO).on("touchmove.drag",dO).on("mouseup.drag",dP,!0).on("touchend.drag",dP,!0).on("click.drag",dQ,!0)}function d(){dF=a,dG=d3.event.target,dH=this,dI=arguments,dK=dN(),b?(dJ=b.apply(dH,dI),dJ=[dJ.x-dK[0],dJ.y-dK[1]]):dJ=[0,0],dL=0}function e(){d.apply(this,arguments),dM("dragstart")}var a=d3.dispatch("drag","dragstart","dragend"),b=null;return c.origin=function(a){return arguments.length?(b=a,c):b},d3.rebind(c,a,"on")};var dF,dG,dH,dI,dJ,dK,dL;d3.behavior.zoom=function(){function d(){this.on("mousedown.zoom",f).on("mousewheel.zoom",g).on("DOMMouseScroll.zoom",g).on("dblclick.zoom",h).on("touchstart.zoom",i),d3.select(window).on("mousemove.zoom",ef).on("mouseup.zoom",eg).on("touchmove.zoom",ee).on("touchend.zoom",ed).on("click.zoom",eh,!0)}function e(){dW=a,dX=c,dY=b.zoom,dZ=d3.event.target,d$=this,d_=arguments}function f(){e.apply(this,arguments),dS=eb(d3.svg.mouse(d$)),ea=0,d3.event.preventDefault(),window.focus()}function g(){e.apply(this,arguments),dT||(dT=eb(d3.svg.mouse(d$))),ei(ec()+a[2],d3.svg.mouse(d$),dT)}function h(){e.apply(this,arguments);var b=d3.svg.mouse(d$);ei(d3.event.shiftKey?Math.ceil(a[2]-1):Math.floor(a[2]+1),b,eb(b))}function i(){e.apply(this,arguments);var b=ed(),c,d=Date.now();b.length===1&&d-dV<300&&ei(1+Math.floor(a[2]),c=b[0],dU[c.identifier]),dV=d}var a=[0,0,0],b=d3.dispatch("zoom"),c=ej;return d.extent=function(a){return arguments.length?(c=a==null?ej:a,d):c},d3.rebind(d,b,"on")};var dR,dS,dT,dU={},dV=0,dW,dX,dY,dZ,d$,d_,ea,ej=[[-Infinity,Infinity],[-Infinity,Infinity],[-Infinity,Infinity]]})(); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.time.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.time.js
new file mode 100644
index 0000000..4c1cda4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.time.js
@@ -0,0 +1,687 @@
+(function(){d3.time = {};
+
+var d3_time = Date;
+d3.time.format = function(template) {
+ var n = template.length;
+
+ function format(date) {
+ var string = [],
+ i = -1,
+ j = 0,
+ c,
+ f;
+ while (++i < n) {
+ if (template.charCodeAt(i) == 37) {
+ string.push(
+ template.substring(j, i),
+ (f = d3_time_formats[c = template.charAt(++i)])
+ ? f(date) : c);
+ j = i + 1;
+ }
+ }
+ string.push(template.substring(j, i));
+ return string.join("");
+ }
+
+ format.parse = function(string) {
+ var date = new d3_time(1900, 0, 1),
+ i = d3_time_parse(date, template, string, 0);
+ if (i != string.length) return null;
+ if (date.hour12) {
+ var hours = date.getHours() % 12;
+ date.setHours(date.hour12pm ? hours + 12 : hours);
+ }
+ delete date.hour12;
+ delete date.hour12pm;
+ return date;
+ };
+
+ format.toString = function() {
+ return template;
+ };
+
+ return format;
+};
+
+function d3_time_parse(date, template, string, j) {
+ var c,
+ p,
+ i = 0,
+ n = template.length,
+ m = string.length;
+ while (i < n) {
+ if (j >= m) return -1;
+ c = template.charCodeAt(i++);
+ if (c == 37) {
+ p = d3_time_parsers[template.charAt(i++)];
+ if (!p || ((j = p(date, string, j)) < 0)) return -1;
+ } else if (c != string.charCodeAt(j++)) {
+ return -1;
+ }
+ }
+ return j;
+}
+
+var d3_time_zfill2 = d3.format("02d"),
+ d3_time_zfill3 = d3.format("03d"),
+ d3_time_zfill4 = d3.format("04d"),
+ d3_time_sfill2 = d3.format("2d");
+
+var d3_time_formats = {
+ a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); },
+ A: function(d) { return d3_time_weekdays[d.getDay()]; },
+ b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); },
+ B: function(d) { return d3_time_months[d.getMonth()]; },
+ c: d3.time.format("%a %b %e %H:%M:%S %Y"),
+ d: function(d) { return d3_time_zfill2(d.getDate()); },
+ e: function(d) { return d3_time_sfill2(d.getDate()); },
+ H: function(d) { return d3_time_zfill2(d.getHours()); },
+ I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); },
+ j: d3_time_dayOfYear,
+ L: function(d) { return d3_time_zfill3(d.getMilliseconds()); },
+ m: function(d) { return d3_time_zfill2(d.getMonth() + 1); },
+ M: function(d) { return d3_time_zfill2(d.getMinutes()); },
+ p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; },
+ S: function(d) { return d3_time_zfill2(d.getSeconds()); },
+ U: d3_time_weekNumberSunday,
+ w: function(d) { return d.getDay(); },
+ W: d3_time_weekNumberMonday,
+ x: d3.time.format("%m/%d/%y"),
+ X: d3.time.format("%H:%M:%S"),
+ y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); },
+ Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); },
+ Z: d3_time_zone,
+ "%": function(d) { return "%"; }
+};
+
+var d3_time_parsers = {
+ a: d3_time_parseWeekdayAbbrev,
+ A: d3_time_parseWeekday,
+ b: d3_time_parseMonthAbbrev,
+ B: d3_time_parseMonth,
+ c: d3_time_parseLocaleFull,
+ d: d3_time_parseDay,
+ e: d3_time_parseDay,
+ H: d3_time_parseHour24,
+ I: d3_time_parseHour12,
+ // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; },
+ L: d3_time_parseMilliseconds,
+ m: d3_time_parseMonthNumber,
+ M: d3_time_parseMinutes,
+ p: d3_time_parseAmPm,
+ S: d3_time_parseSeconds,
+ // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; },
+ // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; },
+ // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; },
+ x: d3_time_parseLocaleDate,
+ X: d3_time_parseLocaleTime,
+ y: d3_time_parseYear,
+ Y: d3_time_parseFullYear
+ // ,
+ // Z: function(d, s, i) { /*TODO time zone */ return i; },
+ // "%": function(d, s, i) { /*TODO literal % */ return i; }
+};
+
+// Note: weekday is validated, but does not set the date.
+function d3_time_parseWeekdayAbbrev(date, string, i) {
+ return string.substring(i, i += 3).toLowerCase() in d3_time_weekdayAbbrevLookup ? i : -1;
+}
+
+var d3_time_weekdayAbbrevLookup = {
+ sun: 3,
+ mon: 3,
+ tue: 3,
+ wed: 3,
+ thu: 3,
+ fri: 3,
+ sat: 3
+};
+
+// Note: weekday is validated, but does not set the date.
+function d3_time_parseWeekday(date, string, i) {
+ d3_time_weekdayRe.lastIndex = 0;
+ var n = d3_time_weekdayRe.exec(string.substring(i, i + 10));
+ return n ? i += n[0].length : -1;
+}
+
+var d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig;
+
+var d3_time_weekdays = [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday"
+];
+
+function d3_time_parseMonthAbbrev(date, string, i) {
+ var n = d3_time_monthAbbrevLookup[string.substring(i, i += 3).toLowerCase()];
+ return n == null ? -1 : (date.setMonth(n), i);
+}
+
+var d3_time_monthAbbrevLookup = {
+ jan: 0,
+ feb: 1,
+ mar: 2,
+ apr: 3,
+ may: 4,
+ jun: 5,
+ jul: 6,
+ aug: 7,
+ sep: 8,
+ oct: 9,
+ nov: 10,
+ dec: 11
+};
+
+function d3_time_parseMonth(date, string, i) {
+ d3_time_monthRe.lastIndex = 0;
+ var n = d3_time_monthRe.exec(string.substring(i, i + 12));
+ return n ? (date.setMonth(d3_time_monthLookup[n[0].toLowerCase()]), i += n[0].length) : -1;
+}
+
+var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig;
+
+var d3_time_monthLookup = {
+ january: 0,
+ february: 1,
+ march: 2,
+ april: 3,
+ may: 4,
+ june: 5,
+ july: 6,
+ august: 7,
+ september: 8,
+ october: 9,
+ november: 10,
+ december: 11
+};
+
+var d3_time_months = [
+ "January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December"
+];
+
+function d3_time_parseLocaleFull(date, string, i) {
+ return d3_time_parse(date, d3_time_formats.c.toString(), string, i);
+}
+
+function d3_time_parseLocaleDate(date, string, i) {
+ return d3_time_parse(date, d3_time_formats.x.toString(), string, i);
+}
+
+function d3_time_parseLocaleTime(date, string, i) {
+ return d3_time_parse(date, d3_time_formats.X.toString(), string, i);
+}
+
+function d3_time_parseFullYear(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.substring(i, i + 4));
+ return n ? (date.setFullYear(n[0]), i += n[0].length) : -1;
+}
+
+function d3_time_parseYear(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+ return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1;
+}
+
+function d3_time_century() {
+ return ~~(new Date().getFullYear() / 1000) * 1000;
+}
+
+function d3_time_parseMonthNumber(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+ return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1;
+}
+
+function d3_time_parseDay(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+ return n ? (date.setDate(+n[0]), i += n[0].length) : -1;
+}
+
+// Note: we don't validate that the hour is in the range [0,23].
+function d3_time_parseHour24(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+ return n ? (date.setHours(+n[0]), i += n[0].length) : -1;
+}
+
+// Note: we don't validate that the hour is in the range [1,12].
+function d3_time_parseHour12(date, string, i) {
+ date.hour12 = true;
+ return d3_time_parseHour24(date, string, i);
+}
+
+function d3_time_parseMinutes(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+ return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1;
+}
+
+function d3_time_parseSeconds(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+ return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1;
+}
+
+function d3_time_parseMilliseconds(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.substring(i, i + 3));
+ return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1;
+}
+
+// Note: we don't look at the next directive.
+var d3_time_numberRe = /\s*\d+/;
+
+function d3_time_parseAmPm(date, string, i) {
+ var n = d3_time_amPmLookup[string.substring(i, i += 2).toLowerCase()];
+ return n == null ? -1 : (date.hour12pm = n, i);
+}
+
+var d3_time_amPmLookup = {
+ am: 0,
+ pm: 1
+};
+
+function d3_time_year(d) {
+ return new d3_time(d.getFullYear(), 0, 1);
+}
+
+function d3_time_daysElapsed(d0, d1) {
+ return ~~((d1 - d0) / 864e5 - (d1.getTimezoneOffset() - d0.getTimezoneOffset()) / 1440);
+}
+
+function d3_time_dayOfYear(d) {
+ return d3_time_zfill3(1 + d3_time_daysElapsed(d3_time_year(d), d));
+}
+
+function d3_time_weekNumberSunday(d) {
+ var d0 = d3_time_year(d);
+ return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + d0.getDay()) / 7));
+}
+
+function d3_time_weekNumberMonday(d) {
+ var d0 = d3_time_year(d);
+ return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + (d0.getDay() + 6) % 7) / 7));
+}
+
+// TODO table of time zone offset names?
+function d3_time_zone(d) {
+ var z = d.getTimezoneOffset(),
+ zs = z > 0 ? "-" : "+",
+ zh = ~~(Math.abs(z) / 60),
+ zm = Math.abs(z) % 60;
+ return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm);
+}
+d3.time.format.utc = function(template) {
+ var local = d3.time.format(template);
+
+ function format(date) {
+ try {
+ d3_time = d3_time_format_utc;
+ var utc = new d3_time();
+ utc._ = date;
+ return local(utc);
+ } finally {
+ d3_time = Date;
+ }
+ }
+
+ format.parse = function(string) {
+ try {
+ d3_time = d3_time_format_utc;
+ var date = local.parse(string);
+ return date && date._;
+ } finally {
+ d3_time = Date;
+ }
+ };
+
+ format.toString = local.toString;
+
+ return format;
+};
+
+function d3_time_format_utc() {
+ this._ = new Date(Date.UTC.apply(this, arguments));
+}
+
+d3_time_format_utc.prototype = {
+ getDate: function() { return this._.getUTCDate(); },
+ getDay: function() { return this._.getUTCDay(); },
+ getFullYear: function() { return this._.getUTCFullYear(); },
+ getHours: function() { return this._.getUTCHours(); },
+ getMilliseconds: function() { return this._.getUTCMilliseconds(); },
+ getMinutes: function() { return this._.getUTCMinutes(); },
+ getMonth: function() { return this._.getUTCMonth(); },
+ getSeconds: function() { return this._.getUTCSeconds(); },
+ getTimezoneOffset: function() { return 0; },
+ valueOf: function() { return this._.getTime(); },
+ setDate: function(x) { this._.setUTCDate(x); },
+ setDay: function(x) { this._.setUTCDay(x); },
+ setFullYear: function(x) { this._.setUTCFullYear(x); },
+ setHours: function(x) { this._.setUTCHours(x); },
+ setMilliseconds: function(x) { this._.setUTCMilliseconds(x); },
+ setMinutes: function(x) { this._.setUTCMinutes(x); },
+ setMonth: function(x) { this._.setUTCMonth(x); },
+ setSeconds: function(x) { this._.setUTCSeconds(x); }
+};
+var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");
+
+d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso;
+
+function d3_time_formatIsoNative(date) {
+ return date.toISOString();
+}
+
+d3_time_formatIsoNative.parse = function(string) {
+ return new Date(string);
+};
+
+d3_time_formatIsoNative.toString = d3_time_formatIso.toString;
+function d3_time_range(floor, step, number) {
+ return function(t0, t1, dt) {
+ var time = floor(t0), times = [];
+ if (time < t0) step(time);
+ if (dt > 1) {
+ while (time < t1) {
+ var date = new Date(+time);
+ if (!(number(date) % dt)) times.push(date);
+ step(time);
+ }
+ } else {
+ while (time < t1) times.push(new Date(+time)), step(time);
+ }
+ return times;
+ };
+}
+d3.time.second = function(date) {
+ return new Date(~~(date / 1e3) * 1e3);
+};
+
+d3.time.second.utc = d3.time.second;
+d3.time.seconds = d3_time_range(d3.time.second, function(date) {
+ date.setTime(date.getTime() + 1e3);
+}, function(date) {
+ return date.getSeconds();
+});
+
+d3.time.seconds.utc = d3.time.seconds;
+d3.time.minute = function(date) {
+ return new Date(~~(date / 6e4) * 6e4);
+};
+
+d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) {
+ return date.getMinutes();
+});
+
+d3.time.minutes.utc = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) {
+ return date.getUTCMinutes();
+});
+
+function d3_time_minutesStep(date) {
+ date.setTime(date.getTime() + 6e4); // assumes no leap seconds
+}
+d3.time.hour = function(date) {
+ var offset = date.getTimezoneOffset() / 60;
+ return new Date((~~(date / 36e5 - offset) + offset) * 36e5);
+};
+
+d3.time.hour.utc = function(date) {
+ return new Date(~~(date / 36e5) * 36e5);
+};
+d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep, function(date) {
+ return date.getHours();
+});
+
+d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep, function(date) {
+ return date.getUTCHours();
+});
+
+function d3_time_hoursStep(date) {
+ date.setTime(date.getTime() + 36e5);
+}
+d3.time.day = function(date) {
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate());
+};
+
+d3.time.day.utc = function(date) {
+ return new Date(~~(date / 864e5) * 864e5);
+};
+d3.time.days = d3_time_range(d3.time.day, function(date) {
+ date.setDate(date.getDate() + 1);
+}, function(date) {
+ return date.getDate() - 1;
+});
+
+d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) {
+ date.setUTCDate(date.getUTCDate() + 1);
+}, function(date) {
+ return date.getUTCDate() - 1;
+});
+d3.time.week = function(date) {
+ (date = d3.time.day(date)).setDate(date.getDate() - date.getDay());
+ return date;
+};
+
+d3.time.week.utc = function(date) {
+ (date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay());
+ return date;
+};
+d3.time.weeks = d3_time_range(d3.time.week, function(date) {
+ date.setDate(date.getDate() + 7);
+}, function(date) {
+ return ~~((date - new Date(date.getFullYear(), 0, 1)) / 6048e5);
+});
+
+d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) {
+ date.setUTCDate(date.getUTCDate() + 7);
+}, function(date) {
+ return ~~((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 6048e5);
+});
+d3.time.month = function(date) {
+ return new Date(date.getFullYear(), date.getMonth(), 1);
+};
+
+d3.time.month.utc = function(date) {
+ return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1));
+};
+d3.time.months = d3_time_range(d3.time.month, function(date) {
+ date.setMonth(date.getMonth() + 1);
+}, function(date) {
+ return date.getMonth();
+});
+
+d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) {
+ date.setUTCMonth(date.getUTCMonth() + 1);
+}, function(date) {
+ return date.getUTCMonth();
+});
+d3.time.year = function(date) {
+ return new Date(date.getFullYear(), 0, 1);
+};
+
+d3.time.year.utc = function(date) {
+ return new Date(Date.UTC(date.getUTCFullYear(), 0, 1));
+};
+d3.time.years = d3_time_range(d3.time.year, function(date) {
+ date.setFullYear(date.getFullYear() + 1);
+}, function(date) {
+ return date.getFullYear();
+});
+
+d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) {
+ date.setUTCFullYear(date.getUTCFullYear() + 1);
+}, function(date) {
+ return date.getUTCFullYear();
+});
+// TODO nice
+function d3_time_scale(linear, methods, format) {
+
+ function scale(x) {
+ return linear(x);
+ }
+
+ scale.invert = function(x) {
+ return d3_time_scaleDate(linear.invert(x));
+ };
+
+ scale.domain = function(x) {
+ if (!arguments.length) return linear.domain().map(d3_time_scaleDate);
+ linear.domain(x);
+ return scale;
+ };
+
+ scale.ticks = function(m, k) {
+ var extent = d3_time_scaleExtent(scale.domain());
+ if (typeof m !== "function") {
+ var span = extent[1] - extent[0],
+ target = span / m,
+ i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1);
+ if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i;
+ m = methods[i];
+ k = m[1];
+ m = m[0];
+ }
+ return m(extent[0], extent[1], k);
+ };
+
+ scale.tickFormat = function() {
+ return format;
+ };
+
+ scale.copy = function() {
+ return d3_time_scale(linear.copy(), methods, format);
+ };
+
+ // TOOD expose d3_scale_linear_rebind?
+ return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
+}
+
+// TODO expose d3_scaleExtent?
+function d3_time_scaleExtent(domain) {
+ var start = domain[0], stop = domain[domain.length - 1];
+ return start < stop ? [start, stop] : [stop, start];
+}
+
+function d3_time_scaleDate(t) {
+ return new Date(t);
+}
+
+function d3_time_scaleFormat(formats) {
+ return function(date) {
+ var i = formats.length - 1, f = formats[i];
+ while (!f[1](date)) f = formats[--i];
+ return f[0](date);
+ };
+}
+
+var d3_time_scaleSteps = [
+ 1e3, // 1-second
+ 5e3, // 5-second
+ 15e3, // 15-second
+ 3e4, // 30-second
+ 6e4, // 1-minute
+ 3e5, // 5-minute
+ 9e5, // 15-minute
+ 18e5, // 30-minute
+ 36e5, // 1-hour
+ 108e5, // 3-hour
+ 216e5, // 6-hour
+ 432e5, // 12-hour
+ 864e5, // 1-day
+ 1728e5, // 2-day
+ 6048e5, // 1-week
+ 1728e6, // 1-month
+ 7776e6, // 3-month
+ 31536e6 // 1-year
+];
+
+var d3_time_scaleLocalMethods = [
+ [d3.time.seconds, 1],
+ [d3.time.seconds, 5],
+ [d3.time.seconds, 15],
+ [d3.time.seconds, 30],
+ [d3.time.minutes, 1],
+ [d3.time.minutes, 5],
+ [d3.time.minutes, 15],
+ [d3.time.minutes, 30],
+ [d3.time.hours, 1],
+ [d3.time.hours, 3],
+ [d3.time.hours, 6],
+ [d3.time.hours, 12],
+ [d3.time.days, 1],
+ [d3.time.days, 2],
+ [d3.time.weeks, 1],
+ [d3.time.months, 1],
+ [d3.time.months, 3],
+ [d3.time.years, 1]
+];
+
+var d3_time_scaleLocalFormats = [
+ [d3.time.format("%Y"), function(d) { return true; }],
+ [d3.time.format("%B"), function(d) { return d.getMonth(); }],
+ [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }],
+ [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }],
+ [d3.time.format("%I %p"), function(d) { return d.getHours(); }],
+ [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }],
+ [d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }]
+];
+
+var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats);
+
+d3.time.scale = function() {
+ return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);
+};
+var d3_time_scaleUTCMethods = [
+ [d3.time.seconds.utc, 1],
+ [d3.time.seconds.utc, 5],
+ [d3.time.seconds.utc, 15],
+ [d3.time.seconds.utc, 30],
+ [d3.time.minutes.utc, 1],
+ [d3.time.minutes.utc, 5],
+ [d3.time.minutes.utc, 15],
+ [d3.time.minutes.utc, 30],
+ [d3.time.hours.utc, 1],
+ [d3.time.hours.utc, 3],
+ [d3.time.hours.utc, 6],
+ [d3.time.hours.utc, 12],
+ [d3.time.days.utc, 1],
+ [d3.time.days.utc, 2],
+ [d3.time.weeks.utc, 1],
+ [d3.time.months.utc, 1],
+ [d3.time.months.utc, 3],
+ [d3.time.years.utc, 1]
+];
+
+var d3_time_scaleUTCFormats = [
+ [d3.time.format.utc("%Y"), function(d) { return true; }],
+ [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }],
+ [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }],
+ [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }],
+ [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }],
+ [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }],
+ [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }]
+];
+
+var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats);
+
+d3.time.scale.utc = function() {
+ return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat);
+};
+})();
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.time.min.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.time.min.js
new file mode 100644
index 0000000..387a50c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/d3.time.min.js
@@ -0,0 +1 @@
+(function(){function b(a,b,c,d){var e,f,g=0,i=b.length,j=c.length;while(g<i){if(d>=j)return-1;e=b.charCodeAt(g++);if(e==37){f=h[b.charAt(g++)];if(!f||(d=f(a,c,d))<0)return-1}else if(e!=c.charCodeAt(d++))return-1}return d}function i(a,b,c){return b.substring(c,c+=3).toLowerCase()in j?c:-1}function k(a,b,c){l.lastIndex=0;var d=l.exec(b.substring(c,c+10));return d?c+=d[0].length:-1}function n(a,b,c){var d=o[b.substring(c,c+=3).toLowerCase()];return d==null?-1:(a.setMonth(d),c)}function p(a,b,c){q.lastIndex=0;var d=q.exec(b.substring(c,c+12));return d?(a.setMonth(r[d[0].toLowerCase()]),c+=d[0].length):-1}function t(a,c,d){return b(a,g.c.toString(),c,d)}function u(a,c,d){return b(a,g.x.toString(),c,d)}function v(a,c,d){return b(a,g.X.toString(),c,d)}function w(a,b,c){G.lastIndex=0;var d=G.exec(b.substring(c,c+4));return d?(a.setFullYear(d[0]),c+=d[0].length):-1}function x(a,b,c){G.lastIndex=0;var d=G.exec(b.substring(c,c+2));return d?(a.setFullYear(y()+ +d[0]),c+=d[0].length):-1}function y(){return~~((new Date).getFullYear()/1e3)*1e3}function z(a,b,c){G.lastIndex=0;var d=G.exec(b.substring(c,c+2));return d?(a.setMonth(d[0]-1),c+=d[0].length):-1}function A(a,b,c){G.lastIndex=0;var d=G.exec(b.substring(c,c+2));return d?(a.setDate(+d[0]),c+=d[0].length):-1}function B(a,b,c){G.lastIndex=0;var d=G.exec(b.substring(c,c+2));return d?(a.setHours(+d[0]),c+=d[0].length):-1}function C(a,b,c){return a.hour12=!0,B(a,b,c)}function D(a,b,c){G.lastIndex=0;var d=G.exec(b.substring(c,c+2));return d?(a.setMinutes(+d[0]),c+=d[0].length):-1}function E(a,b,c){G.lastIndex=0;var d=G.exec(b.substring(c,c+2));return d?(a.setSeconds(+d[0]),c+=d[0].length):-1}function F(a,b,c){G.lastIndex=0;var d=G.exec(b.substring(c,c+3));return d?(a.setMilliseconds(+d[0]),c+=d[0].length):-1}function H(a,b,c){var d=I[b.substring(c,c+=2).toLowerCase()];return d==null?-1:(a.hour12pm=d,c)}function J(b){return new a(b.getFullYear(),0,1)}function K(a,b){return~~((b-a)/864e5-(b.getTimezoneOffset()-a.getTimezoneOffset())/1440)}function L(a){return d(1+K(J(a),a))}function M(a){var b=J(a);return c(~~((K(b,a)+b.getDay())/7))}function N(a){var b=J(a);return c(~~((K(b,a)+(b.getDay()+6)%7)/7))}function O(a){var b=a.getTimezoneOffset(),d=b>0?"-":"+",e=~~(Math.abs(b)/60),f=Math.abs(b)%60;return d+c(e)+c(f)}function P(){this._=new Date(Date.UTC.apply(this,arguments))}function R(a){return a.toISOString()}function S(a,b,c){return function(d,e,f){var g=a(d),h=[];g<d&&b(g);if(f>1)while(g<e){var i=new Date(+g);c(i)%f||h.push(i),b(g)}else while(g<e)h.push(new Date(+g)),b(g);return h}}function T(a){a.setTime(a.getTime()+6e4)}function U(a){a.setTime(a.getTime()+36e5)}function V(a,b,c){function d(b){return a(b)}return d.invert=function(b){return X(a.invert(b))},d.domain=function(b){return arguments.length?(a.domain(b),d):a.domain().map(X)},d.ticks=function(a,c){var e=W(d.domain());if(typeof a!="function"){var f=e[1]-e[0],g=f/a,h=d3.bisect(Z,g,1,Z.length-1);Math.log(g/Z[h-1])<Math.log(Z[h]/g)&&--h,a=b[h],c=a[1],a=a[0]}return a(e[0],e[1],c)},d.tickFormat=function(){return c},d.copy=function(){return V(a.copy(),b,c)},d3.rebind(d,a,"range","rangeRound","interpolate","clamp")}function W(a){var b=a[0],c=a[a.length-1];return b<c?[b,c]:[c,b]}function X(a){return new Date(a)}function Y(a){return function(b){var c=a.length-1,d=a[c];while(!d[1](b))d=a[--c];return d[0](b)}}d3.time={};var a=Date;d3.time.format=function(c){function e(a){var b=[],e=-1,f=0,h,i;while(++e<d)c.charCodeAt(e)==37&&(b.push(c.substring(f,e),(i=g[h=c.charAt(++e)])?i(a):h),f=e+1);return b.push(c.substring(f,e)),b.join("")}var d=c.length;return e.parse=function(d){var e=new a(1900,0,1),f=b(e,c,d,0);if(f!=d.length)return null;if(e.hour12){var g=e.getHours()%12;e.setHours(e.hour12pm?g+12:g)}return delete e.hour12,delete e.hour12pm,e},e.toString=function(){return c},e};var c=d3.format("02d"),d=d3.format("03d"),e=d3.format("04d"),f=d3.format("2d"),g={a:function(a){return m[a.getDay()].substring(0,3)},A:function(a){return m[a.getDay()]},b:function(a){return s[a.getMonth()].substring(0,3)},B:function(a){return s[a.getMonth()]},c:d3.time.format("%a %b %e %H:%M:%S %Y"),d:function(a){return c(a.getDate())},e:function(a){return f(a.getDate())},H:function(a){return c(a.getHours())},I:function(a){return c(a.getHours()%12||12)},j:L,L:function(a){return d(a.getMilliseconds())},m:function(a){return c(a.getMonth()+1)},M:function(a){return c(a.getMinutes())},p:function(a){return a.getHours()>=12?"PM":"AM"},S:function(a){return c(a.getSeconds())},U:M,w:function(a){return a.getDay()},W:N,x:d3.time.format("%m/%d/%y"),X:d3.time.format("%H:%M:%S"),y:function(a){return c(a.getFullYear()%100)},Y:function(a){return e(a.getFullYear()%1e4)},Z:O,"%":function(a){return"%"}},h={a:i,A:k,b:n,B:p,c:t,d:A,e:A,H:B,I:C,L:F,m:z,M:D,p:H,S:E,x:u,X:v,y:x,Y:w},j={sun:3,mon:3,tue:3,wed:3,thu:3,fri:3,sat:3},l=/^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig,m=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],o={jan:0,feb:1,mar:2,apr:3,may:4,jun:5,jul:6,aug:7,sep:8,oct:9,nov:10,dec:11},q=/^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig,r={january:0,february:1,march:2,april:3,may:4,june:5,july:6,august:7,september:8,october:9,november:10,december:11},s=["January","February","March","April","May","June","July","August","September","October","November","December"],G=/\s*\d+/,I={am:0,pm:1};d3.time.format.utc=function(b){function d(b){try{a=P;var d=new a;return d._=b,c(d)}finally{a=Date}}var c=d3.time.format(b);return d.parse=function(b){try{a=P;var d=c.parse(b);return d&&d._}finally{a=Date}},d.toString=c.toString,d},P.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.getTime()},setDate:function(a){this._.setUTCDate(a)},setDay:function(a){this._.setUTCDay(a)},setFullYear:function(a){this._.setUTCFullYear(a)},setHours:function(a){this._.setUTCHours(a)},setMilliseconds:function(a){this._.setUTCMilliseconds(a)},setMinutes:function(a){this._.setUTCMinutes(a)},setMonth:function(a){this._.setUTCMonth(a)},setSeconds:function(a){this._.setUTCSeconds(a)}};var Q=d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");d3.time.format.iso=Date.prototype.toISOString?R:Q,R.parse=function(a){return new Date(a)},R.toString=Q.toString,d3.time.second=function(a){return new Date(~~(a/1e3)*1e3)},d3.time.second.utc=d3.time.second,d3.time.seconds=S(d3.time.second,function(a){a.setTime(a.getTime()+1e3)},function(a){return a.getSeconds()}),d3.time.seconds.utc=d3.time.seconds,d3.time.minute=function(a){return new Date(~~(a/6e4)*6e4)},d3.time.minute.utc=d3.time.minute,d3.time.minutes=S(d3.time.minute,T,function(a){return a.getMinutes()}),d3.time.minutes.utc=S(d3.time.minute,T,function(a){return a.getUTCMinutes()}),d3.time.hour=function(a){var b=a.getTimezoneOffset()/60;return new Date((~~(a/36e5-b)+b)*36e5)},d3.time.hour.utc=function(a){return new Date(~~(a/36e5)*36e5)},d3.time.hours=S(d3.time.hour,U,function(a){return a.getHours()}),d3.time.hours.utc=S(d3.time.hour.utc,U,function(a){return a.getUTCHours()}),d3.time.day=function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},d3.time.day.utc=function(a){return new Date(~~(a/864e5)*864e5)},d3.time.days=S(d3.time.day,function(a){a.setDate(a.getDate()+1)},function(a){return a.getDate()-1}),d3.time.days.utc=S(d3.time.day.utc,function(a){a.setUTCDate(a.getUTCDate()+1)},function(a){return a.getUTCDate()-1}),d3.time.week=function(a){return(a=d3.time.day(a)).setDate(a.getDate()-a.getDay()),a},d3.time.week.utc=function(a){return(a=d3.time.day.utc(a)).setUTCDate(a.getUTCDate()-a.getUTCDay()),a},d3.time.weeks=S(d3.time.week,function(a){a.setDate(a.getDate()+7)},function(a){return~~((a-new Date(a.getFullYear(),0,1))/6048e5)}),d3.time.weeks.utc=S(d3.time.week.utc,function(a){a.setUTCDate(a.getUTCDate()+7)},function(a){return~~((a-Date.UTC(a.getUTCFullYear(),0,1))/6048e5)}),d3.time.month=function(a){return new Date(a.getFullYear(),a.getMonth(),1)},d3.time.month.utc=function(a){return new Date(Date.UTC(a.getUTCFullYear(),a.getUTCMonth(),1))},d3.time.months=S(d3.time.month,function(a){a.setMonth(a.getMonth()+1)},function(a){return a.getMonth()}),d3.time.months.utc=S(d3.time.month.utc,function(a){a.setUTCMonth(a.getUTCMonth()+1)},function(a){return a.getUTCMonth()}),d3.time.year=function(a){return new Date(a.getFullYear(),0,1)},d3.time.year.utc=function(a){return new Date(Date.UTC(a.getUTCFullYear(),0,1))},d3.time.years=S(d3.time.year,function(a){a.setFullYear(a.getFullYear()+1)},function(a){return a.getFullYear()}),d3.time.years.utc=S(d3.time.year.utc,function(a){a.setUTCFullYear(a.getUTCFullYear()+1)},function(a){return a.getUTCFullYear()});var Z=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,1728e6,7776e6,31536e6],$=[[d3.time.seconds,1],[d3.time.seconds,5],[d3.time.seconds,15],[d3.time.seconds,30],[d3.time.minutes,1],[d3.time.minutes,5],[d3.time.minutes,15],[d3.time.minutes,30],[d3.time.hours,1],[d3.time.hours,3],[d3.time.hours,6],[d3.time.hours,12],[d3.time.days,1],[d3.time.days,2],[d3.time.weeks,1],[d3.time.months,1],[d3.time.months,3],[d3.time.years,1]],_=[[d3.time.format("%Y"),function(a){return!0}],[d3.time.format("%B"),function(a){return a.getMonth()}],[d3.time.format("%b %d"),function(a){return a.getDate()!=1}],[d3.time.format("%a %d"),function(a){return a.getDay()&&a.getDate()!=1}],[d3.time.format("%I %p"),function(a){return a.getHours()}],[d3.time.format("%I:%M"),function(a){return a.getMinutes()}],[d3.time.format(":%S"),function(a){return a.getSeconds()||a.getMilliseconds()}]],ba=Y(_);d3.time.scale=function(){return V(d3.scale.linear(),$,ba)};var bb=[[d3.time.seconds.utc,1],[d3.time.seconds.utc,5],[d3.time.seconds.utc,15],[d3.time.seconds.utc,30],[d3.time.minutes.utc,1],[d3.time.minutes.utc,5],[d3.time.minutes.utc,15],[d3.time.minutes.utc,30],[d3.time.hours.utc,1],[d3.time.hours.utc,3],[d3.time.hours.utc,6],[d3.time.hours.utc,12],[d3.time.days.utc,1],[d3.time.days.utc,2],[d3.time.weeks.utc,1],[d3.time.months.utc,1],[d3.time.months.utc,3],[d3.time.years.utc,1]],bc=[[d3.time.format.utc("%Y"),function(a){return!0}],[d3.time.format.utc("%B"),function(a){return a.getUTCMonth()}],[d3.time.format.utc("%b %d"),function(a){return a.getUTCDate()!=1}],[d3.time.format.utc("%a %d"),function(a){return a.getUTCDay()&&a.getUTCDate()!=1}],[d3.time.format.utc("%I %p"),function(a){return a.getUTCHours()}],[d3.time.format.utc("%I:%M"),function(a){return a.getUTCMinutes()}],[d3.time.format.utc(":%S"),function(a){return a.getUTCSeconds()||a.getUTCMilliseconds()}]],bd=Y(bc);d3.time.scale.utc=function(){return V(d3.scale.linear(),bb,bd)}})(); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/egonet.json b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/egonet.json
new file mode 100644
index 0000000..27277a3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/egonet.json
@@ -0,0 +1,1666 @@
+ {"follows":
+ [{"from":189087228, "to":8910992, "reciprocated":false},
+ {"from":189087228, "to":10900412, "reciprocated":false},
+ {"from":189087228, "to":13773232, "reciprocated":true},
+ {"from":189087228, "to":16345873, "reciprocated":false},
+ {"from":189087228, "to":16469978, "reciprocated":true},
+ {"from":189087228, "to":17023762, "reciprocated":false},
+ {"from":189087228, "to":17784346, "reciprocated":false},
+ {"from":189087228, "to":18684157, "reciprocated":true},
+ {"from":189087228, "to":19185849, "reciprocated":true},
+ {"from":189087228, "to":19337079, "reciprocated":false},
+ {"from":189087228, "to":19368326, "reciprocated":false},
+ {"from":189087228, "to":19397172, "reciprocated":false},
+ {"from":189087228, "to":19532509, "reciprocated":false},
+ {"from":189087228, "to":19600064, "reciprocated":true},
+ {"from":189087228, "to":19603042, "reciprocated":true},
+ {"from":189087228, "to":19645267, "reciprocated":false},
+ {"from":189087228, "to":19909207, "reciprocated":false},
+ {"from":189087228, "to":20160673, "reciprocated":true},
+ {"from":189087228, "to":20224126, "reciprocated":false},
+ {"from":189087228, "to":21305960, "reciprocated":false},
+ {"from":189087228, "to":21389079, "reciprocated":false},
+ {"from":189087228, "to":21487384, "reciprocated":false},
+ {"from":189087228, "to":21996235, "reciprocated":false},
+ {"from":189087228, "to":22644877, "reciprocated":false},
+ {"from":189087228, "to":22845401, "reciprocated":false},
+ {"from":189087228, "to":23095072, "reciprocated":true},
+ {"from":189087228, "to":24894570, "reciprocated":true},
+ {"from":189087228, "to":25051012, "reciprocated":false},
+ {"from":189087228, "to":25498891, "reciprocated":false},
+ {"from":189087228, "to":26463542, "reciprocated":false},
+ {"from":189087228, "to":27881243, "reciprocated":true},
+ {"from":189087228, "to":34647948, "reciprocated":false},
+ {"from":189087228, "to":34670493, "reciprocated":false},
+ {"from":189087228, "to":39548147, "reciprocated":false},
+ {"from":189087228, "to":41121344, "reciprocated":false},
+ {"from":189087228, "to":41600546, "reciprocated":false},
+ {"from":189087228, "to":44141829, "reciprocated":false},
+ {"from":189087228, "to":45876960, "reciprocated":false},
+ {"from":189087228, "to":52437557, "reciprocated":false},
+ {"from":189087228, "to":53355611, "reciprocated":true},
+ {"from":189087228, "to":55299403, "reciprocated":true},
+ {"from":189087228, "to":58441079, "reciprocated":false},
+ {"from":189087228, "to":65604105, "reciprocated":false},
+ {"from":189087228, "to":72532264, "reciprocated":false},
+ {"from":189087228, "to":76030185, "reciprocated":true},
+ {"from":189087228, "to":80595484, "reciprocated":false},
+ {"from":189087228, "to":81805825, "reciprocated":false},
+ {"from":189087228, "to":87732913, "reciprocated":true},
+ {"from":189087228, "to":89923671, "reciprocated":false},
+ {"from":189087228, "to":90668561, "reciprocated":true},
+ {"from":189087228, "to":91096410, "reciprocated":true},
+ {"from":189087228, "to":92590714, "reciprocated":false},
+ {"from":189087228, "to":95668712, "reciprocated":true},
+ {"from":189087228, "to":102117784, "reciprocated":false},
+ {"from":189087228, "to":114811890, "reciprocated":true},
+ {"from":189087228, "to":117463781, "reciprocated":false},
+ {"from":189087228, "to":118738344, "reciprocated":false},
+ {"from":189087228, "to":119377322, "reciprocated":false},
+ {"from":189087228, "to":121154835, "reciprocated":true},
+ {"from":189087228, "to":124136910, "reciprocated":false},
+ {"from":189087228, "to":125988502, "reciprocated":false},
+ {"from":189087228, "to":137593665, "reciprocated":true},
+ {"from":189087228, "to":145717740, "reciprocated":true},
+ {"from":189087228, "to":147899791, "reciprocated":true},
+ {"from":189087228, "to":168709838, "reciprocated":false},
+ {"from":189087228, "to":171841885, "reciprocated":false},
+ {"from":189087228, "to":179024836, "reciprocated":false},
+ {"from":189087228, "to":187589516, "reciprocated":false},
+ {"from":189087228, "to":194090195, "reciprocated":true},
+ {"from":189087228, "to":213777599, "reciprocated":false},
+ {"from":189087228, "to":214128115, "reciprocated":false},
+ {"from":189087228, "to":265924188, "reciprocated":true}],
+ "is_followed_by":
+ [{"from":13773232, "to":189087228, "reciprocated":true},
+ {"from":15074749, "to":189087228, "reciprocated":false},
+ {"from":16469978, "to":189087228, "reciprocated":true},
+ {"from":16870211, "to":189087228, "reciprocated":false},
+ {"from":18510305, "to":189087228, "reciprocated":false},
+ {"from":18684157, "to":189087228, "reciprocated":true},
+ {"from":19185849, "to":189087228, "reciprocated":true},
+ {"from":19600064, "to":189087228, "reciprocated":true},
+ {"from":19603042, "to":189087228, "reciprocated":true},
+ {"from":19761627, "to":189087228, "reciprocated":false},
+ {"from":20160673, "to":189087228, "reciprocated":true},
+ {"from":20821862, "to":189087228, "reciprocated":false},
+ {"from":23095072, "to":189087228, "reciprocated":true},
+ {"from":24894570, "to":189087228, "reciprocated":true},
+ {"from":27881243, "to":189087228, "reciprocated":true},
+ {"from":28316188, "to":189087228, "reciprocated":false},
+ {"from":38422315, "to":189087228, "reciprocated":false},
+ {"from":46690889, "to":189087228, "reciprocated":false},
+ {"from":53355611, "to":189087228, "reciprocated":true},
+ {"from":55299403, "to":189087228, "reciprocated":true},
+ {"from":76030185, "to":189087228, "reciprocated":true},
+ {"from":87732913, "to":189087228, "reciprocated":true},
+ {"from":90668561, "to":189087228, "reciprocated":true},
+ {"from":91096410, "to":189087228, "reciprocated":true},
+ {"from":95668712, "to":189087228, "reciprocated":true},
+ {"from":104474762, "to":189087228, "reciprocated":false},
+ {"from":114811890, "to":189087228, "reciprocated":true},
+ {"from":121154835, "to":189087228, "reciprocated":true},
+ {"from":137593665, "to":189087228, "reciprocated":true},
+ {"from":140093607, "to":189087228, "reciprocated":false},
+ {"from":145717740, "to":189087228, "reciprocated":true},
+ {"from":147899791, "to":189087228, "reciprocated":true},
+ {"from":188058388, "to":189087228, "reciprocated":false},
+ {"from":194090195, "to":189087228, "reciprocated":true},
+ {"from":202101504, "to":189087228, "reciprocated":false},
+ {"from":265924188, "to":189087228, "reciprocated":true},
+ {"from":284446250, "to":189087228, "reciprocated":false},
+ {"from":293471631, "to":189087228, "reciprocated":false}],
+ "mentions":
+ [{"from":189087228, "to":284446250, "count":3},
+ {"from":189087228, "to":16469978, "count":21},
+ {"from":189087228, "to":16870211, "count":2},
+ {"from":189087228, "to":17779808, "count":1},
+ {"from":189087228, "to":18684157, "count":6},
+ {"from":189087228, "to":19397172, "count":1},
+ {"from":189087228, "to":19603042, "count":1},
+ {"from":189087228, "to":20821862, "count":1},
+ {"from":189087228, "to":23095072, "count":13},
+ {"from":189087228, "to":95668712, "count":5},
+ {"from":189087228, "to":109563679, "count":2},
+ {"from":189087228, "to":145717740, "count":9},
+ {"from":189087228, "to":147899791, "count":3},
+ {"from":189087228, "to":24894570, "count":5},
+ {"from":189087228, "to":27881243, "count":5},
+ {"from":189087228, "to":38422315, "count":2},
+ {"from":189087228, "to":55299403, "count":1},
+ {"from":189087228, "to":72532264, "count":2}],
+ "is_mentioned_by":
+ [{"from":16469978, "to":189087228, "count":16},
+ {"from":16870211, "to":189087228, "count":4},
+ {"from":17779808, "to":189087228, "count":1},
+ {"from":18684157, "to":189087228, "count":1},
+ {"from":19397172, "to":189087228, "count":1},
+ {"from":19603042, "to":189087228, "count":1},
+ {"from":20821862, "to":189087228, "count":4},
+ {"from":23095072, "to":189087228, "count":5},
+ {"from":95668712, "to":189087228, "count":3},
+ {"from":109563679, "to":189087228, "count":1},
+ {"from":145717740, "to":189087228, "count":1},
+ {"from":147899791, "to":189087228, "count":1},
+ {"from":24894570, "to":189087228, "count":1},
+ {"from":27881243, "to":189087228, "count":5},
+ {"from":38422315, "to":189087228, "count":1},
+ {"from":55299403, "to":189087228, "count":1},
+ {"from":72532264, "to":189087228, "count":6},
+ {"from":284446250, "to":189087228, "count":5}],
+ "node_metadata":
+ [{"rank":8,
+ "follower_count":23,
+ "longitude":-0.0762234,
+ "name":"Albion London",
+ "postcode":"E1 6JJ",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"19909207",
+ "employee_count":null,
+ "latitude":51.524127,
+ "_id":"19909207",
+ "web_url":"http:\/\/www.albionlondon.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1260314698\/Albion_Twitter_logo_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1260314698\/Albion_Twitter_logo_normal.jpg",
+ "screen_name":"albionlondon"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.081349,
+ "name":"Radley Yeldar",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"39548147",
+ "employee_count":null,
+ "latitude":51.525373,
+ "_id":"39548147",
+ "web_url":"http:\/\/www.ry.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1022617685\/ry_symbol_K_master_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1022617685\/ry_symbol_K_master_normal.jpg",
+ "screen_name":"RadleyYeldar"},
+ {"rank":1,
+ "follower_count":38,
+ "longitude":-0.0762234,
+ "name":"Glue Isobar",
+ "postcode":"E1 6JJ",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"21996235",
+ "employee_count":null,
+ "latitude":51.524127,
+ "_id":"21996235",
+ "web_url":"http:\/\/www.glueisobar.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1111529009\/glue-avatar_normal.gif",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1111529009\/glue-avatar_normal.gif",
+ "screen_name":"glueisobar"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.081117,
+ "name":"Inition",
+ "postcode":"EC2A 3LT",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"27881243",
+ "employee_count":null,
+ "latitude":51.5225975,
+ "_id":"27881243",
+ "web_url":"http:\/\/www.inition.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1338466579\/LOGO-ForUsageInSquareSpace_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1338466579\/LOGO-ForUsageInSquareSpace_normal.jpg",
+ "screen_name":"Inition"},
+ {"rank":39,
+ "follower_count":4,
+ "longitude":-0.0858669,
+ "name":"Thin Martian",
+ "postcode":"EC2A 4AW",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"19185849",
+ "employee_count":null,
+ "latitude":51.5255167,
+ "_id":"19185849",
+ "web_url":"http:\/\/www.thinmartian.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1369659488\/tm_logo_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1369659488\/tm_logo_normal.jpg",
+ "screen_name":"thinmartian"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.11383,
+ "name":"Interactive Web Solutions Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"214128115",
+ "employee_count":null,
+ "latitude":51.531952,
+ "_id":"214128115",
+ "web_url":"http:\/\/www.iwebsolutions.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1399828151\/Untitled-3_normal.png",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1399828151\/Untitled-3_normal.png",
+ "screen_name":"iwebtweets"},
+ {"rank":50,
+ "follower_count":3,
+ "longitude":-0.0811414,
+ "name":"Sitelynx",
+ "postcode":"EC2A 3PE",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"72532264",
+ "employee_count":null,
+ "latitude":51.5264737,
+ "_id":"72532264",
+ "web_url":"http:\/\/www.sitelynx.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1031953955\/fa9c1ef3-2404-4da2-b5c2-255556dfb1a7_normal.gif",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1031953955\/fa9c1ef3-2404-4da2-b5c2-255556dfb1a7_normal.gif",
+ "screen_name":"sitelynx"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.07851,
+ "name":"Fresh 01",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"22644877",
+ "employee_count":null,
+ "latitude":51.52637,
+ "_id":"22644877",
+ "web_url":"http:\/\/www.fresh01.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1180034164\/f_normal.gif",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1180034164\/f_normal.gif",
+ "screen_name":"Fresh_01"},
+ {"rank":50,
+ "follower_count":3,
+ "longitude":-0.088483,
+ "name":"Neue Media Limited",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"52437557",
+ "employee_count":null,
+ "latitude":51.528169,
+ "_id":"52437557",
+ "web_url":"http:\/\/neue-media.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/416477239\/default_profile_normal_copy_normal_normal.png",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/416477239\/default_profile_normal_copy_normal_normal.png",
+ "screen_name":"Neue_Media"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.09836,
+ "name":"The Pomegranate Group Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"17784346",
+ "employee_count":null,
+ "latitude":51.522962,
+ "_id":"17784346",
+ "web_url":"http:\/\/www.pomegranate.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1301967134\/Pome-Twitter-1_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1301967134\/Pome-Twitter-1_normal.jpg",
+ "screen_name":"Pomegranate_exp"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.079528,
+ "name":"2Cs Communications Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"119377322",
+ "employee_count":null,
+ "latitude":51.51761,
+ "_id":"119377322",
+ "web_url":"http:\/\/www.2cs.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/729718232\/2Cs_Logo_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/729718232\/2Cs_Logo_normal.jpg",
+ "screen_name":"2CsGroup"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.103497,
+ "name":"Zard Creative Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"21305960",
+ "employee_count":null,
+ "latitude":51.523872,
+ "_id":"21305960",
+ "web_url":"http:\/\/www.zardcreative.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1277842361\/image_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1277842361\/image_normal.jpg",
+ "screen_name":"themightyzard"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.106868,
+ "name":"Catalysis",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"19600064",
+ "employee_count":null,
+ "latitude":51.524268,
+ "_id":"19600064",
+ "web_url":"http:\/\/www.catalysis.co.uk",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1272273199\/icon_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1272273199\/icon_normal.jpg",
+ "screen_name":"Catalysis_Comms"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.080079,
+ "name":"Impero Design",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"121154835",
+ "employee_count":null,
+ "latitude":51.526764,
+ "_id":"121154835",
+ "web_url":"http:\/\/www.imperodesign.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1140103878\/Profile_Picture_of_WeAreImpero_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1140103878\/Profile_Picture_of_WeAreImpero_normal.jpg",
+ "screen_name":"WeAreImpero"},
+ {"rank":27,
+ "follower_count":6,
+ "longitude":-0.098969,
+ "name":"Skills Matter",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"16345873",
+ "employee_count":null,
+ "latitude":51.52459,
+ "_id":"16345873",
+ "web_url":"http:\/\/www.skillsmatter.com",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/91904867\/skills-matter-twitter_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/91904867\/skills-matter-twitter_normal.jpg",
+ "screen_name":"skillsmatter"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.094248,
+ "name":"Sherry Design",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"124136910",
+ "employee_count":null,
+ "latitude":51.526843,
+ "_id":"124136910",
+ "web_url":"http:\/\/www.sherrydesign.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1213767000\/sherry-icon-animated_normal.gif",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/1213767000\/sherry-icon-animated_normal.gif",
+ "screen_name":"sherry_design"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.108137,
+ "name":"Momentum London",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"87732913",
+ "employee_count":null,
+ "latitude":51.527382,
+ "_id":"87732913",
+ "web_url":"http:\/\/www.momentumww.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/749013137\/Twitter_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/749013137\/Twitter_normal.jpg",
+ "screen_name":"MomentumWWide"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.101011,
+ "name":"Kitcatt Nohr Alexander Shaw Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"117463781",
+ "employee_count":null,
+ "latitude":51.521251,
+ "_id":"117463781",
+ "web_url":"http:\/\/www.kitcattnohr.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1304557196\/knd-logo-symbol_for_social_media_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1304557196\/knd-logo-symbol_for_social_media_normal.jpg",
+ "screen_name":"kitcattnohr"},
+ {"rank":27,
+ "follower_count":6,
+ "longitude":-0.072685,
+ "name":"Guided Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"89923671",
+ "employee_count":null,
+ "latitude":51.51854,
+ "_id":"89923671",
+ "web_url":"http:\/\/www.guidedcollective.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/755793638\/Guided_Creds_PPT_v2_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/755793638\/Guided_Creds_PPT_v2_normal.jpg",
+ "screen_name":"_Guided_"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.108073,
+ "name":"Miniclip",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"19397172",
+ "employee_count":null,
+ "latitude":51.520241,
+ "_id":"19397172",
+ "web_url":"http:\/\/miniclip.com",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/446967006\/mc_twitterlogo_trans32_normal.png",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/446967006\/mc_twitterlogo_trans32_normal.png",
+ "screen_name":"MiniclipGames"},
+ {"rank":27,
+ "follower_count":6,
+ "longitude":-0.0722893,
+ "name":"Unruly Media",
+ "postcode":"E1 6QL",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"16469978",
+ "employee_count":null,
+ "latitude":51.5217063,
+ "_id":"16469978",
+ "web_url":"http:\/\/www.unrulymedia.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1360900637\/UnrulyLogoProfilePic_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1360900637\/UnrulyLogoProfilePic_normal.jpg",
+ "screen_name":"unrulymedia"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.09112,
+ "name":"Headshot London Photography",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"44141829",
+ "employee_count":null,
+ "latitude":51.517169,
+ "_id":"44141829",
+ "web_url":"http:\/\/www.headshotlondon.co.uk",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1363570301\/Square_Logo_-_NEW_gradientVS-png_normal.png",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1363570301\/Square_Logo_-_NEW_gradientVS-png_normal.png",
+ "screen_name":"headshotlondon"},
+ {"rank":50,
+ "follower_count":3,
+ "longitude":-0.081994,
+ "name":"VET",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"53355611",
+ "employee_count":null,
+ "latitude":51.527515,
+ "_id":"53355611",
+ "web_url":"http:\/\/www.vet.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/295297749\/VetLogo_blue_on_white_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/295297749\/VetLogo_blue_on_white_normal.jpg",
+ "screen_name":"VEThoxton"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.106868,
+ "name":"Social (Uk)",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"171841885",
+ "employee_count":null,
+ "latitude":51.524268,
+ "_id":"171841885",
+ "web_url":"http:\/\/www.welcometosocial.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1118321543\/Social_Twitter_Logo_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1118321543\/Social_Twitter_Logo_normal.jpg",
+ "screen_name":"welcometosocial"},
+ {"rank":11,
+ "follower_count":17,
+ "longitude":-0.0762234,
+ "name":"Mother",
+ "postcode":"E2 7DD",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"145717740",
+ "employee_count":null,
+ "latitude":51.524127,
+ "_id":"145717740",
+ "web_url":"http:\/\/www.motherlondon.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1415556673\/Mum_for_Jane_003_-_web_normal.JPG",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1415556673\/Mum_for_Jane_003_-_web_normal.JPG",
+ "screen_name":"motherlondon"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.108065,
+ "name":"Purple Creative",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"92590714",
+ "employee_count":null,
+ "latitude":51.522867,
+ "_id":"92590714",
+ "web_url":"http:\/\/www.purplecreative.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/543755256\/purplelogo_twit_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/543755256\/purplelogo_twit_normal.jpg",
+ "screen_name":"purple_creative"},
+ {"rank":27,
+ "follower_count":6,
+ "longitude":-0.076197,
+ "name":"BD Network",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"20224126",
+ "employee_count":null,
+ "latitude":51.524129,
+ "_id":"20224126",
+ "web_url":"http:\/\/thisisbd.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/75966079\/BD-Badge_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/75966079\/BD-Badge_normal.jpg",
+ "screen_name":"thisisbd"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.009725,
+ "name":"Minx Creative",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"20160673",
+ "employee_count":null,
+ "latitude":51.518838,
+ "_id":"20160673",
+ "web_url":"http:\/\/www.minxcreative.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1110431168\/Minx_Creative_Logo_bigger_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1110431168\/Minx_Creative_Logo_bigger_normal.jpg",
+ "screen_name":"MinxCreative"},
+ {"rank":27,
+ "follower_count":6,
+ "longitude":-0.0806713,
+ "name":"Hijack Media",
+ "postcode":"EC2A 3QL",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"125988502",
+ "employee_count":null,
+ "latitude":51.52668180000001,
+ "_id":"125988502",
+ "web_url":"http:\/\/www.hijackmedia.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/772379104\/hijacksticker_normal.png",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/772379104\/hijacksticker_normal.png",
+ "screen_name":"HijackMedia"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.096872,
+ "name":"Underwired UK Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"19645267",
+ "employee_count":null,
+ "latitude":51.53755,
+ "_id":"19645267",
+ "web_url":"http:\/\/www.underwired.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/835079806\/icon1_normal.png",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/835079806\/icon1_normal.png",
+ "screen_name":"underwired"},
+ {"rank":3,
+ "follower_count":30,
+ "longitude":-0.103262,
+ "name":"R\/Ga",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"17023762",
+ "employee_count":null,
+ "latitude":51.523275,
+ "_id":"17023762",
+ "web_url":"http:\/\/www.rga.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/129044572\/RedSquare_normal.gif",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/129044572\/RedSquare_normal.gif",
+ "screen_name":"RGA"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.101413,
+ "name":"Shift Media",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"26463542",
+ "employee_count":null,
+ "latitude":51.52025,
+ "_id":"26463542",
+ "web_url":"http:\/\/www.shift-media.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1105763376\/jade_arrow_normal.png",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1105763376\/jade_arrow_normal.png",
+ "screen_name":"ShiftLearning"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.09272509999999999,
+ "name":"Media With Impact",
+ "postcode":"EC1V 3QT",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"102117784",
+ "employee_count":null,
+ "latitude":51.5259522,
+ "_id":"102117784",
+ "web_url":"http:\/\/www.mediawithimpact.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/611957795\/blacklogo_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/611957795\/blacklogo_normal.jpg",
+ "screen_name":"mwinews"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.079783,
+ "name":"Digital Health Service",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"19368326",
+ "employee_count":null,
+ "latitude":51.53175,
+ "_id":"19368326",
+ "web_url":"www.digitalhealthservice.com",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1010472555\/dhs_logo_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1010472555\/dhs_logo_normal.jpg",
+ "screen_name":"digitalhealth"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.073824,
+ "name":"Romabravo",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"41121344",
+ "employee_count":null,
+ "latitude":51.534908,
+ "_id":"41121344",
+ "web_url":"http:\/\/www.romabravo.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/218908632\/avatar_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/218908632\/avatar_normal.jpg",
+ "screen_name":"romabravo"},
+ {"rank":50,
+ "follower_count":3,
+ "longitude":-0.109852,
+ "name":"The Think Tank",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"91096410",
+ "employee_count":null,
+ "latitude":51.521834,
+ "_id":"91096410",
+ "web_url":"http:\/\/www.thinktank.org.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/671330546\/TwitterPic_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/671330546\/TwitterPic_normal.jpg",
+ "screen_name":"thinktanklondon"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.103878,
+ "name":"The Brand Bucket Company",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"19337079",
+ "employee_count":null,
+ "latitude":51.521279,
+ "_id":"19337079",
+ "web_url":"http:\/\/www.thebrandbucketcompany.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/724007617\/brandbucketfranchise185_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/724007617\/brandbucketfranchise185_normal.jpg",
+ "screen_name":"thebrandbucket"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.0782042,
+ "name":"DN Digital",
+ "postcode":"E2 8AA",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"25498891",
+ "employee_count":null,
+ "latitude":51.5284399,
+ "_id":"25498891",
+ "web_url":"http:\/\/www.dndigital.net\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/980449715\/transparent_justlogo_normal.png",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/980449715\/transparent_justlogo_normal.png",
+ "screen_name":"dndigital"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.080663,
+ "name":"Visual Eyes Media Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"179024836",
+ "employee_count":null,
+ "latitude":51.525919,
+ "_id":"179024836",
+ "web_url":"http:\/\/www.visual-eyes-media.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1104100532\/Twitter_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1104100532\/Twitter_normal.jpg",
+ "screen_name":"VisualEyesMedia"},
+ {"rank":5,
+ "follower_count":28,
+ "longitude":-0.0715103,
+ "name":"Lost Boys international",
+ "postcode":"E1 6RU",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"24894570",
+ "employee_count":null,
+ "latitude":51.5217205,
+ "_id":"24894570",
+ "web_url":"http:\/\/www.lbi.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1078914095\/big_london_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1078914095\/big_london_normal.jpg",
+ "screen_name":"LBiLondon"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.100533,
+ "name":"YARG Limited",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"90668561",
+ "employee_count":null,
+ "latitude":51.524076,
+ "_id":"90668561",
+ "web_url":"http:\/\/www.yarg.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/979742771\/YARG_Twitter_Banner72x72_normal.png",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/979742771\/YARG_Twitter_Banner72x72_normal.png",
+ "screen_name":"YARGLTD"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.0762234,
+ "name":"Balloon Dog",
+ "postcode":"E1 6JJ",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"104474762",
+ "employee_count":null,
+ "latitude":51.524127,
+ "_id":"104474762",
+ "web_url":"http:\/\/www.balloondog.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1220838294\/bd_poses_twitter_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1220838294\/bd_poses_twitter_normal.jpg",
+ "screen_name":"balloon_dog"},
+ {"rank":7,
+ "follower_count":24,
+ "longitude":-0.081422,
+ "name":"Moving Brands Limited",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"10900412",
+ "employee_count":null,
+ "latitude":51.526363,
+ "_id":"10900412",
+ "web_url":"http:\/\/www.movingbrands.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1208456909\/MB-Symbol-100px_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/1208456909\/MB-Symbol-100px_normal.jpg",
+ "screen_name":"movingbrands"},
+ {"rank":23,
+ "follower_count":7,
+ "longitude":-0.080847,
+ "name":"Caffeinehit",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"8910992",
+ "employee_count":null,
+ "latitude":51.526003,
+ "_id":"8910992",
+ "web_url":"http:\/\/www.caffeinehit.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1312241553\/me_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1312241553\/me_normal.jpg",
+ "screen_name":"caffeinehit"},
+ {"rank":27,
+ "follower_count":6,
+ "longitude":-0.0764021,
+ "name":"Less Rain",
+ "postcode":"E2 7JP",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"147899791",
+ "employee_count":null,
+ "latitude":51.526387,
+ "_id":"147899791",
+ "web_url":"http:\/\/www.lessrain.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1366992228\/avatar_lessrain4_normal",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/1366992228\/avatar_lessrain4_normal",
+ "screen_name":"LessRainLondon"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.085773,
+ "name":"Giraffe",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"168709838",
+ "employee_count":null,
+ "latitude":51.517154,
+ "_id":"168709838",
+ "web_url":"http:\/\/www.giraffeads.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1096165810\/twitter_logo_normal.png",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1096165810\/twitter_logo_normal.png",
+ "screen_name":"ngicreative"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.053282,
+ "name":"MINIBAR",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"114811890",
+ "employee_count":null,
+ "latitude":51.528714,
+ "_id":"114811890",
+ "web_url":"http:\/\/www.openbusiness.cc\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/790160600\/6a00d83451e50a69e200e54f27ddc88834-800wi_normal.gif",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/790160600\/6a00d83451e50a69e200e54f27ddc88834-800wi_normal.gif",
+ "screen_name":"MiniBarlondon"},
+ {"rank":27,
+ "follower_count":6,
+ "longitude":-0.0782042,
+ "name":"PlayGen",
+ "postcode":"E2 8AA",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"23095072",
+ "employee_count":null,
+ "latitude":51.5284399,
+ "_id":"23095072",
+ "web_url":"http:\/\/www.playgen.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1135052200\/kam-star_normal.png",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/1135052200\/kam-star_normal.png",
+ "screen_name":"playgen"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.094451,
+ "name":"Open Destinations Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"194090195",
+ "employee_count":null,
+ "latitude":51.530955,
+ "_id":"194090195",
+ "web_url":"http:\/\/www.opendestinations.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1225306415\/OD_letters_normal.JPG",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1225306415\/OD_letters_normal.JPG",
+ "screen_name":"OpenDestination"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.067476,
+ "name":"Elixir Media Consultant Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"213777599",
+ "employee_count":null,
+ "latitude":51.518661,
+ "_id":"213777599",
+ "web_url":"http:\/\/www.elixirmedia.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/sticky\/default_profile_images\/default_profile_0_normal.png",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/sticky\/default_profile_images\/default_profile_0_normal.png",
+ "screen_name":"elixirmediacons"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.070651,
+ "name":"I Want Design",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"34647948",
+ "employee_count":null,
+ "latitude":51.519262,
+ "_id":"34647948",
+ "web_url":"http:\/\/www.iwantdesign.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1299576190\/bird_normal.png",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1299576190\/bird_normal.png",
+ "screen_name":"IWANTdesign"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.081812,
+ "name":"Stuff Multichannel Ltd.",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"45876960",
+ "employee_count":null,
+ "latitude":51.526361,
+ "_id":"45876960",
+ "web_url":"http:\/\/www.stuffmultichannel.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1285234665\/Stuff50_normal.gif",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1285234665\/Stuff50_normal.gif",
+ "screen_name":"StuffMulti"},
+ {"rank":15,
+ "follower_count":10,
+ "longitude":-0.09111459999999999,
+ "name":"Preloaded",
+ "postcode":"N1 7JQ",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"13773232",
+ "employee_count":null,
+ "latitude":51.5299906,
+ "_id":"13773232",
+ "web_url":"http:\/\/www.preloaded.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/613949415\/icon_p_normal.gif",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/613949415\/icon_p_normal.gif",
+ "screen_name":"Preloaded"},
+ {"rank":23,
+ "follower_count":7,
+ "longitude":-0.06925,
+ "name":"(Untitled) Digital Agency",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"21487384",
+ "employee_count":null,
+ "latitude":51.515588,
+ "_id":"21487384",
+ "web_url":"http:\/\/www.untitledlondon.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/907278551\/f38e0fb4-7f95-418a-8969-aec4c7edb49a_normal.png",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/907278551\/f38e0fb4-7f95-418a-8969-aec4c7edb49a_normal.png",
+ "screen_name":"untitledlondon"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.097619,
+ "name":"Vibrant Media Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"22845401",
+ "employee_count":null,
+ "latitude":51.519622,
+ "_id":"22845401",
+ "web_url":"http:\/\/www.vibrantmedia.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/351384617\/vibrant_icon_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/351384617\/vibrant_icon_normal.jpg",
+ "screen_name":"VibrantMedia"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.103796,
+ "name":"EHS 4D Group",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"34670493",
+ "employee_count":null,
+ "latitude":51.52153,
+ "_id":"34670493",
+ "web_url":"http:\/\/www.ehsbrann.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/891021684\/EHS_Star_normal.JPG",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/891021684\/EHS_Star_normal.JPG",
+ "screen_name":"4dgroup"},
+ {"rank":20,
+ "follower_count":8,
+ "longitude":-0.076197,
+ "name":"specialmoves",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"41600546",
+ "employee_count":null,
+ "latitude":51.524129,
+ "_id":"41600546",
+ "web_url":"http:\/\/specialmoves.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/316308162\/sm-twitter_normal.png",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/316308162\/sm-twitter_normal.png",
+ "screen_name":"specialmoves"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.076125,
+ "name":"What a Sunday",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"118738344",
+ "employee_count":null,
+ "latitude":51.528911,
+ "_id":"118738344",
+ "web_url":"http:\/\/www.whatasunday.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/872922202\/Me_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/872922202\/Me_normal.jpg",
+ "screen_name":"WDADComms"},
+ {"rank":50,
+ "follower_count":3,
+ "longitude":-0.067775,
+ "name":"N1 Creative Ltd",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"21389079",
+ "employee_count":null,
+ "latitude":51.510591,
+ "_id":"21389079",
+ "web_url":"http:\/\/www.n1creative.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1230855752\/n1_normal.png",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1230855752\/n1_normal.png",
+ "screen_name":"n1creative"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.072984,
+ "name":"Hyponik",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"81805825",
+ "employee_count":null,
+ "latitude":51.526144,
+ "_id":"81805825",
+ "web_url":"http:\/\/www.hyponik.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1300880423\/hyp_white_2__normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1300880423\/hyp_white_2__normal.jpg",
+ "screen_name":"Hyponik"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.076677,
+ "name":"Orpheus Studio",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"80595484",
+ "employee_count":null,
+ "latitude":51.535647,
+ "_id":"80595484",
+ "web_url":"http:\/\/www.orpheusstudio.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1173007732\/Orpheus_Logo_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1173007732\/Orpheus_Logo_normal.jpg",
+ "screen_name":"orpheusstudio"},
+ {"rank":20,
+ "follower_count":8,
+ "longitude":-0.0744205,
+ "name":"Digit",
+ "postcode":"E1 6NN",
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"19532509",
+ "employee_count":null,
+ "latitude":51.5207342,
+ "_id":"19532509",
+ "web_url":"http:\/\/www.digitlondon.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/73246455\/D2_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/73246455\/D2_normal.jpg",
+ "screen_name":"digitlondon"},
+ {"rank":39,
+ "follower_count":4,
+ "longitude":-0.076197,
+ "name":"The Domain Group",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"76030185",
+ "employee_count":null,
+ "latitude":51.524129,
+ "_id":"76030185",
+ "web_url":"http:\/\/www.domain-london.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/427391554\/Domain_logo_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/427391554\/Domain_logo_normal.jpg",
+ "screen_name":"DomainLondon"},
+ {"rank":191,
+ "follower_count":0,
+ "longitude":-0.08364869999999999,
+ "name":"33 Seconds",
+ "postcode":"EC2A 4NE",
+ "updated_at":"2011-08-02 19:48:24.696135",
+ "sector":null,
+ "twitter_id":"293471631",
+ "employee_count":null,
+ "latitude":51.52547149999999,
+ "_id":"293471631",
+ "web_url":"http:\/\/33seconds.co\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1339785974\/33Seconds-circle_only_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1339785974\/33Seconds-circle_only_normal.jpg",
+ "screen_name":"33SecondsAgency"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.0879852,
+ "name":"Latitude Digital Marketing",
+ "postcode":"EC1Y 2BP",
+ "updated_at":"2011-08-02 19:51:16.81984",
+ "sector":null,
+ "twitter_id":"16870211",
+ "employee_count":null,
+ "latitude":51.5251916,
+ "_id":"16870211",
+ "web_url":"http:\/\/www.latitudegroup.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1246983504\/Copy_of_latitude_logo_din_copy_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1246983504\/Copy_of_latitude_logo_din_copy_normal.jpg",
+ "screen_name":"Latitude_Group"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.08364869999999999,
+ "name":"Gramafilm",
+ "postcode":"EC2A 4NE",
+ "updated_at":"2011-08-02 19:51:16.81984",
+ "sector":null,
+ "twitter_id":"18510305",
+ "employee_count":null,
+ "latitude":51.52547149999999,
+ "_id":"18510305",
+ "web_url":"http:\/\/www.gramafilm.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/200171084\/GramalogoTransparent_normal.png",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/200171084\/GramalogoTransparent_normal.png",
+ "screen_name":"Gramafilm"},
+ {"rank":8,
+ "follower_count":23,
+ "longitude":-0.0818134,
+ "name":"BERG",
+ "postcode":"EC2A 4RQ",
+ "updated_at":"2011-08-02 19:51:16.81984",
+ "sector":null,
+ "twitter_id":"58441079",
+ "employee_count":null,
+ "latitude":51.5228337,
+ "_id":"58441079",
+ "web_url":"http:\/\/berglondon.com",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/362357729\/BERG_57px_rough_normal.png",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/362357729\/BERG_57px_rough_normal.png",
+ "screen_name":"BERGLONDON"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.081117,
+ "name":"Holition",
+ "postcode":"EC2A 3LT",
+ "updated_at":"2011-08-02 19:51:16.81984",
+ "sector":null,
+ "twitter_id":"95668712",
+ "employee_count":null,
+ "latitude":51.5225975,
+ "_id":"95668712",
+ "web_url":"http:\/\/www.holition.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/788054545\/Holition_icon_normal.png",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/788054545\/Holition_icon_normal.png",
+ "screen_name":"Holition"},
+ {"rank":18,
+ "follower_count":9,
+ "longitude":-0.0785365,
+ "name":"Brass",
+ "postcode":"EC2A 3AY",
+ "updated_at":"2011-08-02 19:51:16.81984",
+ "sector":null,
+ "twitter_id":"109563679",
+ "employee_count":null,
+ "latitude":51.5263681,
+ "_id":"109563679",
+ "web_url":"http:\/\/www.brassagency.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1072344365\/b_logo94x94_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/1072344365\/b_logo94x94_normal.jpg",
+ "screen_name":"BrassAgency"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.0799966,
+ "name":"Inensu",
+ "postcode":"N1 6NG",
+ "updated_at":"2011-08-02 19:51:16.81984",
+ "sector":null,
+ "twitter_id":"137593665",
+ "employee_count":null,
+ "latitude":51.5276419,
+ "_id":"137593665",
+ "web_url":"http:\/\/www.inensu.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/950054402\/Home_images_0005_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/950054402\/Home_images_0005_normal.jpg",
+ "screen_name":"inensu"},
+ {"rank":191,
+ "follower_count":0,
+ "longitude":-0.0836296,
+ "name":"Dub",
+ "postcode":"EC2A 4RU",
+ "updated_at":"2011-08-02 19:51:16.81984",
+ "sector":null,
+ "twitter_id":"140093607",
+ "employee_count":null,
+ "latitude":51.5231781,
+ "_id":"140093607",
+ "web_url":"http:\/\/www.dubstudios.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/872781372\/Dub_logo_twitter_normal.png",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/872781372\/Dub_logo_twitter_normal.png",
+ "screen_name":"dub_research"},
+ {"rank":191,
+ "follower_count":0,
+ "longitude":-0.0846702,
+ "name":"Credcomms",
+ "postcode":"EC2A 4JU",
+ "updated_at":"2011-08-02 19:51:16.81984",
+ "sector":null,
+ "twitter_id":"202101504",
+ "employee_count":null,
+ "latitude":51.52311419999999,
+ "_id":"202101504",
+ "web_url":"http:\/\/www.credcomms.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1237501160\/Credcomms_circle_green_normal.png",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1237501160\/Credcomms_circle_green_normal.png",
+ "screen_name":"Credcomms"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.08120279999999999,
+ "name":"BuonGiorno",
+ "postcode":"EC2A 4PF",
+ "updated_at":"2011-08-02 19:51:16.81984",
+ "sector":null,
+ "twitter_id":"265924188",
+ "employee_count":null,
+ "latitude":51.523642,
+ "_id":"265924188",
+ "web_url":"http:\/\/www.buongiorno.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1272449944\/Picture2_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1272449944\/Picture2_normal.jpg",
+ "screen_name":"AnnPRBuongiorno"},
+ {"rank":39,
+ "follower_count":4,
+ "longitude":-0.07999880000000001,
+ "name":"Made In Me",
+ "postcode":"EC2A 3BA",
+ "updated_at":"2011-08-02 19:51:16.81984",
+ "sector":null,
+ "twitter_id":"284446250",
+ "employee_count":null,
+ "latitude":51.52656289999999,
+ "_id":"284446250",
+ "web_url":"http:\/\/www.madeinme.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1316966165\/twitter_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1316966165\/twitter_normal.jpg",
+ "screen_name":"the_landofme"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.07799529999999999,
+ "name":"Monorex",
+ "postcode":"EC2A 3PQ",
+ "updated_at":"2011-08-02 19:51:16.833368",
+ "sector":null,
+ "twitter_id":"28316188",
+ "employee_count":null,
+ "latitude":51.5234726,
+ "_id":"28316188",
+ "web_url":"http:\/\/www.monorex.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1337122495\/M_Monorex_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/1337122495\/M_Monorex_normal.jpg",
+ "screen_name":"monorex"},
+ {"rank":191,
+ "follower_count":0,
+ "longitude":-0.0834128,
+ "name":"Red Leader",
+ "postcode":"EC2A 4RX",
+ "updated_at":"2011-08-03 09:04:08.614463",
+ "sector":null,
+ "twitter_id":"15074749",
+ "employee_count":null,
+ "latitude":51.52319250000001,
+ "_id":"15074749",
+ "web_url":"http:\/\/www.redleader.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1304536460\/logo-white-square_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1304536460\/logo-white-square_normal.jpg",
+ "screen_name":"redleaderlondon"},
+ {"rank":50,
+ "follower_count":3,
+ "longitude":-0.07799529999999999,
+ "name":"RjDj (Reality Jockey)",
+ "postcode":"EC2A 3PQ",
+ "updated_at":"2011-08-03 09:04:08.614463",
+ "sector":null,
+ "twitter_id":"17779808",
+ "employee_count":null,
+ "latitude":51.5234726,
+ "_id":"17779808",
+ "web_url":"http:\/\/www.rjdj.me\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/69994067\/rjdj_icon_512px_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/69994067\/rjdj_icon_512px_normal.jpg",
+ "screen_name":"rjdj"},
+ {"rank":50,
+ "follower_count":3,
+ "longitude":-0.0776515,
+ "name":"MusicMetric",
+ "postcode":"E1 6HP",
+ "updated_at":"2011-08-03 09:04:08.614463",
+ "sector":null,
+ "twitter_id":"20821862",
+ "employee_count":null,
+ "latitude":51.5244471,
+ "_id":"20821862",
+ "web_url":"http:\/\/www.musicmetric.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/332717868\/mu_icon_big_normal.png",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/332717868\/mu_icon_big_normal.png",
+ "screen_name":"musicmetric"},
+ {"rank":50,
+ "follower_count":3,
+ "longitude":-0.0813752,
+ "name":"Red Ant",
+ "postcode":"EC2A 3PB",
+ "updated_at":"2011-08-03 09:04:08.614463",
+ "sector":null,
+ "twitter_id":"25051012",
+ "employee_count":null,
+ "latitude":51.5253714,
+ "_id":"25051012",
+ "web_url":"http:\/\/www.redant.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/783519348\/twitterProfilePhoto_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/783519348\/twitterProfilePhoto_normal.jpg",
+ "screen_name":"Red_Ant"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.07983319999999999,
+ "name":"Shiny Ideas",
+ "postcode":"EC1V 9AU",
+ "updated_at":"2011-08-03 09:04:08.614463",
+ "sector":null,
+ "twitter_id":"55299403",
+ "employee_count":null,
+ "latitude":51.5270727,
+ "_id":"55299403",
+ "web_url":"http:\/\/shinyideas.co.uk",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/313869711\/shinyicon_normal.png",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/313869711\/shinyicon_normal.png",
+ "screen_name":"shinyideas"},
+ {"rank":18,
+ "follower_count":9,
+ "longitude":-0.1003762,
+ "name":"Skive",
+ "postcode":"EC1V 0AP",
+ "updated_at":"2011-08-03 09:04:08.614463",
+ "sector":null,
+ "twitter_id":"65604105",
+ "employee_count":null,
+ "latitude":51.5250062,
+ "_id":"65604105",
+ "web_url":"http:\/\/www.skive.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1167844601\/TwitterLogo_04_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1167844601\/TwitterLogo_04_normal.jpg",
+ "screen_name":"_skive_"},
+ {"rank":80,
+ "follower_count":2,
+ "longitude":-0.0777388,
+ "name":"seeper",
+ "postcode":"N1 5AQ",
+ "updated_at":"2011-08-03 09:04:08.614463",
+ "sector":null,
+ "twitter_id":"187589516",
+ "employee_count":null,
+ "latitude":51.5367504,
+ "_id":"187589516",
+ "web_url":"http:\/\/www.seeper.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1134378767\/LOgo_200x200_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a3.twimg.com\/profile_images\/1134378767\/LOgo_200x200_normal.jpg",
+ "screen_name":"seeperarts"},
+ {"rank":12,
+ "follower_count":16,
+ "longitude":-0.1096771,
+ "name":"Stink Digital",
+ "postcode":"EC1R 3AD",
+ "updated_at":"2011-08-03 10:34:35.687744",
+ "sector":null,
+ "twitter_id":"18684157",
+ "employee_count":null,
+ "latitude":51.5238975,
+ "_id":"18684157",
+ "web_url":"http:\/\/www.stinkdigital.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1399907312\/SD_LOGO-white-square_normal.png",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1399907312\/SD_LOGO-white-square_normal.png",
+ "screen_name":"stinkdigital"},
+ {"rank":50,
+ "follower_count":3,
+ "longitude":-0.0764021,
+ "name":"The 7th Chamber",
+ "postcode":"E2 7JP",
+ "updated_at":"2011-08-03 10:34:35.687744",
+ "sector":null,
+ "twitter_id":"19761627",
+ "employee_count":null,
+ "latitude":51.526387,
+ "_id":"19761627",
+ "web_url":"http:\/\/www.the7thchamber.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1232774244\/The-7th-Chamber-Twitter-profile_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1232774244\/The-7th-Chamber-Twitter-profile_normal.jpg",
+ "screen_name":"the7thchamber"},
+ {"rank":50,
+ "follower_count":3,
+ "longitude":-0.08222720000000001,
+ "name":"Ultra Knowledge",
+ "postcode":"EC2A 3DQ",
+ "updated_at":"2011-08-03 11:00:08.151825",
+ "sector":null,
+ "twitter_id":"19603042",
+ "employee_count":null,
+ "latitude":51.5263655,
+ "_id":"19603042",
+ "web_url":"http:\/\/www.ultraknowledge.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1149457046\/128_reasonably_small_normal.png",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1149457046\/128_reasonably_small_normal.png",
+ "screen_name":"ultraknowledge"},
+ {"rank":191,
+ "follower_count":0,
+ "longitude":-0.0813381,
+ "name":"Ticket Tailor",
+ "postcode":"EC2A 4HH",
+ "updated_at":"2011-08-03 11:00:08.151825",
+ "sector":null,
+ "twitter_id":"188058388",
+ "employee_count":null,
+ "latitude":51.5231676,
+ "_id":"188058388",
+ "web_url":"http:\/\/www.tickettailor.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1119307711\/Zima_021_normal.png",
+ "profile_image_url":
+ "http:\/\/a2.twimg.com\/profile_images\/1119307711\/Zima_021_normal.png",
+ "screen_name":"tickettailor"},
+ {"rank":27,
+ "follower_count":6,
+ "longitude":-0.0762234,
+ "name":"We Love Mobile",
+ "postcode":"E1 6JJ",
+ "updated_at":"2011-08-03 13:50:00.288248",
+ "sector":null,
+ "twitter_id":"38422315",
+ "employee_count":null,
+ "latitude":51.524127,
+ "_id":"38422315",
+ "web_url":"http:\/\/www.welovemobile.co.uk\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1265670673\/icon_Welovemobile_normal.jpg",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1265670673\/icon_Welovemobile_normal.jpg",
+ "screen_name":"WeLoveMobile"},
+ {"rank":119,
+ "follower_count":1,
+ "longitude":-0.0766862,
+ "name":"Unboxed Consulting",
+ "postcode":"E1 6BT",
+ "updated_at":"2011-08-03 13:50:00.288248",
+ "sector":null,
+ "twitter_id":"46690889",
+ "employee_count":null,
+ "latitude":51.5213559,
+ "_id":"46690889",
+ "web_url":"http:\/\/www.unboxedconsulting.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1319753202\/LinkedIn_Image_normal.gif",
+ "profile_image_url":
+ "http:\/\/a0.twimg.com\/profile_images\/1319753202\/LinkedIn_Image_normal.gif",
+ "screen_name":"Ubxd"},
+ {"rank":1,
+ "fixed":true,
+ "follower_count":38,
+ "longitude":-0.077022,
+ "name":"DigitalShoreditch",
+ "postcode":null,
+ "updated_at":"2011-08-01 19:54:27.11922",
+ "sector":null,
+ "twitter_id":"189087228",
+ "employee_count":null,
+ "latitude":51.529105,
+ "_id":"189087228",
+ "web_url":"http:\/\/digitalshoreditch.com\/",
+ "profile_image_url_https":
+ "https:\/\/si0.twimg.com\/profile_images\/1144541691\/basic_normal.png",
+ "profile_image_url":
+ "http:\/\/a1.twimg.com\/profile_images\/1144541691\/basic_normal.png",
+ "screen_name":"DigiShoreditch"}
+]}
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/force.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/force.js
new file mode 100644
index 0000000..dce9739
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/force.js
@@ -0,0 +1,161 @@
+var w = 960,
+ h = 700,
+ fill = d3.scale.category20();
+
+var vis = d3.select("#chart")
+ .append("svg:svg")
+ .attr("width", w)
+ .attr("height", h);
+
+ vis.append("svg:g").attr("class", "edges");
+ vis.append("svg:g").attr("class", "nodes");
+
+
+$(function() {
+ $.ajax({
+ url: '/gstudio/graphs/rgraph',
+ //crossDomain: true,
+ //dataType: 'jsonp',
+ success : function(json) {
+
+ var force;
+
+ var nodes_by_id = _.reduce(json.node_metadata, function(acc, n) {
+ acc[n._id] = n;
+ return acc;
+ }, {});
+
+
+ var follows_edges = _(json.is_followed_by).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'follows_edges';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var mentions_edges = _(json.is_mentioned_by).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'mentions_edges';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ nodes_by_id['189087228'].x = w/2.0;
+ nodes_by_id['189087228'].y = h/2.0;
+
+ var force = d3.layout.force()
+ .linkStrength(0.5)
+ .charge(-2000)
+ .friction(0.7)
+ .linkDistance(50)
+ .nodes([])
+ .links([])
+ .size([w, h])
+ .start();
+
+ function update(edges){
+
+ _.each(nodes_by_id, function(n){n.added = false});
+
+ var nodes = _.reduce(edges, function(acc, e) {
+ if(nodes_by_id[e.from] && !nodes_by_id[e.from].added){
+ nodes_by_id[e.from].added = true;
+ acc.push(nodes_by_id[e.from]);
+ }
+ if(nodes_by_id[e.to] && !nodes_by_id[e.to].added){
+ nodes_by_id[e.to].added = true;
+ acc.push(nodes_by_id[e.to]);
+ }
+ return acc;
+ }, []);
+
+ force.nodes(nodes);
+ force.links(edges);
+ force.start();
+
+ var link = d3.select("#chart g.edges").selectAll("line.link")
+ .data(edges, function(e){return e.from + "-" + e.to + "-" + e.type});
+
+ link.enter().append("svg:line")
+ .attr("class", "link")
+ .style("stroke-width", function(d) {
+ return Math.sqrt(d.value);
+ })
+ .attr("x1", function(d) {
+ return d.source.x;
+ })
+ .attr("y1", function(d) {
+ return d.source.y;
+ })
+ .attr("x2", function(d) {
+ return d.target.x;
+ })
+ .attr("y2", function(d) {
+ return d.target.y;
+ });
+
+ link.exit().remove();
+
+ var node = d3.select("#chart g.nodes").selectAll("g.node").data(nodes);
+
+ var new_g = node.enter().append("svg:g")
+ .attr("class", "node")
+ .call(force.drag);
+
+ new_g.append("svg:image").attr('xlink:href',
+ function(d) {
+ return d.profile_image_url;
+ }).attr('height', 32).attr('width', 32);
+
+ new_g.append("svg:text")
+ .attr("dy", 46)
+ .attr("text-anchor", "middle")
+ .text(function(d) {
+ return d.screen_name;
+ });
+
+ node.exit().remove();
+
+
+ force.on("tick", function() {
+
+ var x_center = $("#chart").width() / 2;
+ var y_center = $("#chart").height() / 2;
+
+ link.attr("x1", function(d) { return d.source.x; })
+ .attr("y1", function(d) { return d.source.y; })
+ .attr("x2", function(d) { return d.target.x; })
+ .attr("y2", function(d) { return d.target.y; });
+
+ node.attr("transform", function(d) { return "translate(" + (d.x-16) + "," + (d.y-16) + ")"; });
+
+ });
+ }
+
+ update(follows_edges);
+ vis.style("opacity", 1e-6)
+ .transition()
+ .duration(1000)
+ .style("opacity", 1);
+
+ $('input#follows').change(function(){
+ update(follows_edges);
+ });
+
+ $('input#mentions').change(function(){
+ update(mentions_edges);
+ });
+ }
+ });
+
+ $("#relation_type").buttonset();
+
+ $('input#mentions').change(function(){console.log(this)});
+ $('input#hashtags').change(function(){console.log(this)});
+
+});
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/gstudio.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/gstudio.js
new file mode 100644
index 0000000..bb5c879
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/gstudio.js
@@ -0,0 +1,88 @@
+$ = django.jQuery
+
+
+ $(document).ready(function() {
+
+ $("#id_atrributetype").ajaxSend(function(e,xhr,opt){
+
+
+ function getCookie(name) {
+ var cookieValue = null;
+ if (document.cookie && document.cookie != '') {
+ var cookies = document.cookie.split(';');
+ for (var i = 0; i < cookies.length; i++) {
+ var cookie = $.trim(cookies[i]);
+ // Does this cookie string begin with the name we want?
+ if (cookie.substring(0, name.length + 1) == (name + '=')) {
+ cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
+ break;
+ }
+ }
+ }
+ return cookieValue;
+ }
+ function sameOrigin(url) {
+ // url could be relative or scheme relative or absolute
+ var host = document.location.host; // host + port
+ var protocol = document.location.protocol;
+ var sr_origin = '//' + host;
+ var origin = protocol + sr_origin;
+ // Allow absolute or scheme relative URLs to same origin
+ return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
+ (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
+ // or any other URL that isn't scheme relative or absolute i.e relative.
+ !(/^(\/\/|http:|https:).*/.test(url));
+ }
+ function safeMethod(method) {
+ return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
+ }
+
+ if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
+ xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
+ }
+
+ }
+ );
+
+
+ $("#id_attributetype").change(function() {
+ test = $("#id_attributetype").val()
+ url = "/gstudio/ajax/?id=" + test
+ $.get(url,
+ function(data){
+
+ $("#id_subject").empty()
+
+ for (var key in data) {
+ $('#id_subject').append(
+ $('<option></option>').val(key).html(data[key])
+ );
+ }
+
+
+
+
+
+ });
+
+
+ });
+ $(function() {
+ $( "#id_creation_date_0" ).datepicker();
+ });
+
+ $(function() {
+ $( "#id_creation_date_1" ).timepicker();
+ });
+
+ $(function() {
+ $( "#id_last_update_0" ).datepicker();
+ });
+
+ $(function() {
+ $( "#id_last_update_1" ).timepicker();
+ });
+
+
+
+ });
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/gstudiojs.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/gstudiojs.js
new file mode 100644
index 0000000..205cd97
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/gstudiojs.js
@@ -0,0 +1,55 @@
+$ = django.jQuery
+
+ $(document).ready(function() {
+
+ $("#id_atrributetype").ajaxSend(function(e,xhr,opt){
+
+
+ function getCookie(name) {
+ var cookieValue = null;
+ if (document.cookie && document.cookie != '') {
+ var cookies = document.cookie.split(';');
+ for (var i = 0; i < cookies.length; i++) {
+ var cookie = jQuery.trim(cookies[i]);
+ // Does this cookie string begin with the name we want?
+ if (cookie.substring(0, name.length + 1) == (name + '=')) {
+ cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
+ break;
+ }
+ }
+ }
+ return cookieValue;
+ }
+ function sameOrigin(url) {
+ // url could be relative or scheme relative or absolute
+ var host = document.location.host; // host + port
+ var protocol = document.location.protocol;
+ var sr_origin = '//' + host;
+ var origin = protocol + sr_origin;
+ // Allow absolute or scheme relative URLs to same origin
+ return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
+ (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
+ // or any other URL that isn't scheme relative or absolute i.e relative.
+ !(/^(\/\/|http:|https:).*/.test(url));
+ }
+ function safeMethod(method) {
+ return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
+ }
+
+ if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
+ xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
+ }
+
+ }
+ );
+
+
+ $("#id_attributetype").change(function() {
+ $.get("/gstudio/ajaxurls/", { attributetype: "date_of_birth"},
+ function(data){
+ alert("Data Loaded: " + data);
+ });
+
+
+ });
+ });
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/GPL-LICENSE.txt b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/GPL-LICENSE.txt
new file mode 100644
index 0000000..932f111
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/GPL-LICENSE.txt
@@ -0,0 +1,278 @@
+GNU GENERAL PUBLIC LICENSE
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+ the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+ this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+ distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+ that everyone understands that there is no warranty for this free
+ software. If the software is modified by someone else and passed on, we
+ want its recipients to know that what they have is not the original, so
+ that any problems introduced by others will not reflect on the original
+ authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+ patents. We wish to avoid the danger that redistributors of a free
+ program will individually obtain patent licenses, in effect making the
+ program proprietary. To prevent this, we have made it clear that any
+ patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+ modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+ a notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License. The "Program", below,
+ refers to any such program or work, and a "work based on the Program"
+ means either the Program or any derivative work under copyright law:
+ that is to say, a work containing the Program or a portion of it,
+ either verbatim or with modifications and/or translated into another
+ language. (Hereinafter, translation is included without limitation in
+ the term "modification".) Each licensee is addressed as "you".
+
+ Activities other than copying, distribution and modification are not
+ covered by this License; they are outside its scope. The act of
+ running the Program is not restricted, and the output from the Program
+ is covered only if its contents constitute a work based on the
+ Program (independent of having been made by running the Program).
+ Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+ source code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any warranty;
+ and give any other recipients of the Program a copy of this License
+ along with the Program.
+
+ You may charge a fee for the physical act of transferring a copy, and
+ you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+ of it, thus forming a work based on the Program, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the Program,
+ and can be reasonably considered independent and separate works in
+ themselves, then this License, and its terms, do not apply to those
+ sections when you distribute them as separate works. But when you
+ distribute the same sections as part of a whole which is a work based
+ on the Program, the distribution of the whole must be on the terms of
+ this License, whose permissions for other licensees extend to the
+ entire whole, and thus to each and every part regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or contest
+ your rights to work written entirely by you; rather, the intent is to
+ exercise the right to control the distribution of derivative or
+ collective works based on the Program.
+
+ In addition, mere aggregation of another work not based on the Program
+ with the Program (or with a work based on the Program) on a volume of
+ a storage or distribution medium does not bring the other work under
+ the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+ under Section 2) in object code or executable form under the terms of
+ Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+ The source code for a work means the preferred form of the work for
+ making modifications to it. For an executable work, complete source
+ code means all the source code for all modules it contains, plus any
+ associated interface definition files, plus the scripts used to
+ control compilation and installation of the executable. However, as a
+ special exception, the source code distributed need not include
+ anything that is normally distributed (in either source or binary
+ form) with the major components (compiler, kernel, and so on) of the
+ operating system on which the executable runs, unless that component
+ itself accompanies the executable.
+
+ If distribution of executable or object code is made by offering
+ access to copy from a designated place, then offering equivalent
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+ void, and will automatically terminate your rights under this License.
+ However, parties who have received copies, or rights, from you under
+ this License will not have their licenses terminated so long as such
+ parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify or
+ distribute the Program or its derivative works. These actions are
+ prohibited by law if you do not accept this License. Therefore, by
+ modifying or distributing the Program (or any work based on the
+ Program), you indicate your acceptance of this License to do so, and
+ all its terms and conditions for copying, distributing or modifying
+ the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program subject to
+ these terms and conditions. You may not impose any further
+ restrictions on the recipients' exercise of the rights granted herein.
+ You are not responsible for enforcing compliance by third parties to
+ this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent issues),
+ conditions are imposed on you (whether by court order, agreement or
+ otherwise) that contradict the conditions of this License, they do not
+ excuse you from the conditions of this License. If you cannot
+ distribute so as to satisfy simultaneously your obligations under this
+ License and any other pertinent obligations, then as a consequence you
+ may not distribute the Program at all. For example, if a patent
+ license would not permit royalty-free redistribution of the Program by
+ all those who receive copies directly or indirectly through you, then
+ the only way you could satisfy both it and this License would be to
+ refrain entirely from distribution of the Program.
+
+ If any portion of this section is held invalid or unenforceable under
+ any particular circumstance, the balance of the section is intended to
+ apply and the section as a whole is intended to apply in other
+ circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of any
+ such claims; this section has the sole purpose of protecting the
+ integrity of the free software distribution system, which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is willing
+ to distribute software through any other system and a licensee cannot
+ impose that choice.
+
+ This section is intended to make thoroughly clear what is believed to
+ be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces, the
+ original copyright holder who places the Program under this License
+ may add an explicit geographical distribution limitation excluding
+ those countries, so that distribution is permitted only in or among
+ countries not thus excluded. In such case, this License incorporates
+ the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+ of the General Public License from time to time. Such new versions will
+ be similar in spirit to the present version, but may differ in detail to
+ address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the Program
+ specifies a version number of this License which applies to it and "any
+ later version", you have the option of following the terms and conditions
+ either of that version or of any later version published by the Free
+ Software Foundation. If the Program does not specify a version number of
+ this License, you may choose any version ever published by the Free Software
+ Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the author
+ to ask for permission. For software which is copyrighted by the Free
+ Software Foundation, write to the Free Software Foundation; we sometimes
+ make exceptions for this. Our decision will be guided by the two goals
+ of preserving the free status of all derivatives of our free software and
+ of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+ REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGES.""''''''
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/MIT-LICENSE.txt b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/MIT-LICENSE.txt
new file mode 100644
index 0000000..5327046
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/MIT-LICENSE.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2011 John Resig, http://jquery.com/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/i18n.html b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/i18n.html
new file mode 100644
index 0000000..83cb5e3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/i18n.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Internationalisation page for the jquery ui timepicker</title>
+
+ <script src="../include/jquery-1.5.1.min.js"></script>
+ <script src="../include/jquery.ui.core.min.js"></script>
+ <script src="../include/jquery.ui.widget.min.js"></script>
+ <script src="../jquery.ui.timepicker.js"></script>
+
+ <link rel="stylesheet" href="../include/jquery-ui-1.8.14.custom.css" />
+ <link rel="stylesheet" href="../jquery.ui.timepicker.css" />
+ <style>
+ #timepicker { font-size: 10px }
+ </style>
+
+ <script src='jquery.ui.timepicker-de.js'></script>
+ <script src='jquery.ui.timepicker-fr.js'></script>
+ <script src='jquery.ui.timepicker-ja.js'></script>
+</head>
+<body>
+
+ <script type="text/javascript">
+ $(document).ready(function() {
+
+ $.timepicker.setDefaults( $.timepicker.regional[ "" ] );
+
+ $('#timepicker').timepicker({
+ showCloseButton: true,
+ showNowButton: true,
+ showDeselectButton: true
+ });
+
+ $('#locale').change(function() {
+ $('#timepicker').timepicker( "option",
+ $.timepicker.regional[ $( this ).val() ] );
+ });
+ });
+ </script>
+
+ Select a localisation :
+ <select id='locale'>
+ <option value='fr'>Fran&ccedil;ais</option>
+ <option value='de'>Deutsch</option>
+ <option value='ja'>Japanese</option>
+ </select>
+
+ <br>
+
+ <div id="timepicker">
+
+ </div>
+
+ <br>
+
+ List of localisations :
+<ul>
+ <li>
+ <a href="jquery.ui.timepicker-de.js">Deutsch (jquery.ui.timepicker-de.js</a>
+ </li>
+
+ <li>
+ <a href="jquery.ui.timepicker-fr.js">Fran&ccedil;ais (jquery.ui.timepicker-fr.js</a>
+ </li>
+
+ <li>
+ <a href="jquery.ui.timepicker-ja.js">Japanese (jquery.ui.timepicker-ja.js</a>
+ </li>
+
+</ul>
+
+</body> \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-de.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-de.js
new file mode 100644
index 0000000..c010a49
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-de.js
@@ -0,0 +1,9 @@
+/* Deutsch initialisation for the timepicker plugin */
+/* Written by Bernd Plagge (bplagge@choicenet.ne.jp). */
+jQuery(function($){
+ $.timepicker.regional['de'] = {
+ hourText: 'Stunde',
+ minuteText: 'Minuten',
+ amPmText: ['AM', 'PM'] }
+ $.timepicker.setDefaults($.timepicker.regional['de']);
+}); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-fr.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-fr.js
new file mode 100644
index 0000000..bd37d73
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-fr.js
@@ -0,0 +1,13 @@
+/* French initialisation for the jQuery time picker plugin. */
+/* Written by Bernd Plagge (bplagge@choicenet.ne.jp),
+ Francois Gelinas (frank@fgelinas.com) */
+jQuery(function($){
+ $.timepicker.regional['fr'] = {
+ hourText: 'Heures',
+ minuteText: 'Minutes',
+ amPmText: ['AM', 'PM'],
+ closeButtonText: 'Fermer',
+ nowButtonText: 'Maintenant',
+ deselectButtonText: 'Désélectionner' }
+ $.timepicker.setDefaults($.timepicker.regional['fr']);
+}); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-ja.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-ja.js
new file mode 100644
index 0000000..01b2c8a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/i18n/jquery.ui.timepicker-ja.js
@@ -0,0 +1,9 @@
+/* Japanese initialisation for the jQuery time picker plugin. */
+/* Written by Bernd Plagge (bplagge@choicenet.ne.jp). */
+jQuery(function($){
+ $.timepicker.regional['ja'] = {
+ hourText: '時間',
+ minuteText: '分',
+ amPmText: ['午前', '午後'] }
+ $.timepicker.setDefaults($.timepicker.regional['ja']);
+});
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/index.html b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/index.html
new file mode 100644
index 0000000..a29d78c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/index.html
@@ -0,0 +1,1007 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
+ <title>jQuery UI Time Picker by Francois Gelinas</title>
+ <link rel="stylesheet" href="include/jquery-ui-1.8.14.custom.css" type="text/css" />
+ <link rel="stylesheet" href="jquery.ui.timepicker.css?v=0.2.9" type="text/css" />
+
+<!-- uncomment to test with legacy jquery -->
+<!--
+ <script type="text/javascript" src="jquery-1.2.6.js"></script>
+ <script type="text/javascript" src="jquery.fix.for.1.2.6.js"></script>
+ <script type="text/javascript" src="jquery.ui.1.6.all.js"></script>
+-->
+
+ <script type="text/javascript" src="include/jquery-1.5.1.min.js"></script>
+ <script type="text/javascript" src="include/jquery.ui.core.min.js"></script>
+ <script type="text/javascript" src="include/jquery.ui.widget.min.js"></script>
+ <script type="text/javascript" src="include/jquery.ui.tabs.min.js"></script>
+ <script type="text/javascript" src="include/jquery.ui.position.min.js"></script>
+
+ <script type="text/javascript" src="jquery.ui.timepicker.js?v=0.2.9"></script>
+
+ <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
+ <style type="text/css">
+ /* some styling for the page */
+ body { font-size: 10px; /* for the widget natural size */ }
+ #content { font-size: 1.2em; /* for the rest of the page to show at a normal size */
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+ width: 950px; margin: auto;
+ }
+ .box { border: 1px solid #888; padding: 15px; margin:12px; }
+ .code { margin: 6px; padding: 9px; background-color: #fdf5ce; border: 1px solid #c77405; }
+ fieldset { padding: 0.5em 2em }
+ hr { margin: 0.5em 0; clear: both }
+ a { cursor: pointer; }
+ #requirements li { line-height: 1.6em; }
+ </style>
+
+ <script type="text/javascript">
+
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-24327002-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+
+ function plusone_clicked() {
+ $('#thankyou').fadeIn(300);
+ }
+
+ $(document).ready(function() {
+ $('#floating_timepicker').timepicker({
+ onSelect: function(time, inst) {
+ $('#floating_selected_time').html('You selected ' + time);
+ }
+ });
+
+ $('#tabs').tabs();
+
+ });
+
+
+ </script>
+</head>
+<body>
+
+<div id="content">
+
+<div style="float: right; padding: 20px 0 20px 20px; font-size: 10px;">
+ <div id="floating_timepicker">
+ </div>
+ <span id="floating_selected_time">
+ </span>
+</div>
+
+<h1>jQuery UI Timepicker
+ <span style="color: #999; font-size:10px;">(By <a href="http://fgelinas.com">Fran&ccedil;ois G&eacute;linas</a>)</span>
+ <g:plusone callback='plusone_clicked'></g:plusone>
+ <span id="thankyou" style="display: none; font-size: 0.6em;" class="code">
+ Thanks !! (:
+ </span>
+</h1>
+
+<h2>What is this?</h2>
+<p style="font-size: 1.1em;">
+
+ This is a jQuery UI time picker plugin build to match with other official jQuery UI widgets.
+ Based on the existing date picker, it will blend nicely with your form and use your selected jQuery UI theme.
+ The plugin is very easy to integrate in your form for you time (hours / minutes) inputs.
+</p>
+<p>
+ Licensed under the same license as jQuery : <a href="http://docs.jquery.com/Licensing">MIT and GPL licenses</a>
+</p>
+
+<div style="clear: both"></div>
+
+<div id="tabs">
+
+ <ul>
+ <li><a href="#examples">Examples</a></li>
+ <li><a href="#usage">Usage</a></li>
+ <li><a href="#requirements">Requirements</a></li>
+ <li><a href="#release_notes">Release notes</a></li>
+ <li><a href="#get_timepicker">Get Timepicker version 0.2.9</a></li>
+ </ul>
+
+ <div id="examples">
+ <div>
+ Default time picker :
+ <input type="text" style="width: 70px;" id="timepicker.[1]" value="" />
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker\\.\\[1\\]').timepicker();
+ });
+ </script>
+
+ <a onclick="$('#script_1').toggle(200); return false;">[Show code]</a>
+ <pre id="script_1" style="display: none" class="code">$('#timepicker').timepicker();</pre>
+ </div>
+
+
+ <hr />
+
+ <div>
+ Time picker with period (AM/PM) in input and with hours leading 0s :
+ <input type="text" style="width: 70px;" id="timepicker_6" value="01:30 PM" />
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_6').timepicker({
+ showPeriod: true,
+ showLeadingZero: true
+ });
+ });
+ </script>
+
+ <a onclick="$('#script_6').toggle(200)">[Show code]</a>
+<pre id="script_6" style="display: none" class="code">$('#timepicker').timepicker({
+ showPeriod: true,
+ showLeadingZero: true
+});</pre>
+ </div>
+
+ <hr />
+
+ <div>
+ Time picker with buttons and labels in another language (Fran&ccedil;ais) :
+ <input type="text" style="width: 70px;" id="timepicker_locale" value="13h30" />
+ <br>
+ See the <a href="i18n/i18n.html">internationalisation page</a> for more information and details.
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_locale').timepicker({
+ hourText: 'Heures',
+ minuteText: 'Minutes',
+ amPmText: ['AM', 'PM'],
+ timeSeparator: 'h',
+ showLeadingZero: false,
+ nowButtonText: 'Maintenant',
+ showNowButton: true,
+ closeButtonText: 'Fermer',
+ showCloseButton: true,
+ deselectButtonText: 'Désélectionner',
+ showDeselectButton: true
+ });
+ });
+
+ </script>
+ <a onclick="$('#script_locale').toggle(200)">[Show code]</a>
+<pre id="script_locale" style="display: none" class="code">$('#timepicker').timepicker({
+ hourText: 'Heures',
+ minuteText: 'Minutes',
+ amPmText: ['AM', 'PM'],
+ timeSeparator: 'h',
+ nowButtonText: 'Maintenant',
+ showNowButton: true,
+ closeButtonText: 'Fermer',
+ showCloseButton: true,
+ deselectButtonText: 'Désélectionner',
+ showDeselectButton: true
+});</pre>
+ </div>
+
+ <hr />
+
+ <div>
+ Time picker with restricted (disabled) hours / minutes. 8:30 PM to 6:30 AM disabled :
+ <input type="text" style="width: 70px" id="timepicker_7" value="01:30 PM" />
+
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_7').timepicker({
+ showPeriod: true,
+ onHourShow: timepicker7OnHourShowCallback,
+ onMinuteShow: timepicker7OnMinuteShowCallback
+ });
+ });
+ function timepicker7OnHourShowCallback(hour) {
+ if ((hour > 20) || (hour < 6)) {
+ return false;
+ }
+ return true;
+ }
+ function timepicker7OnMinuteShowCallback(hour, minute) {
+ if ((hour == 20) && (minute >= 30)) { return false; }
+ if ((hour == 6) && (minute < 30)) { return false; }
+ return true;
+ }
+
+ </script>
+ <a onclick="$('#script_7').toggle(200)">[Show code]</a>
+<pre id="script_7" style="display: none" class="code">$('#timepicker').timepicker({
+ showPeriod: true,
+ onHourShow: OnHourShowCallback,
+ onMinuteShow: OnMinuteShowCallback
+ });
+function OnHourShowCallback(hour) {
+ if ((hour > 20) || (hour < 6)) {
+ return false; // not valid
+ }
+ return true; // valid
+}
+function OnMinuteShowCallback(hour, minute) {
+ if ((hour == 20) && (minute >= 30)) { return false; } // not valid
+ if ((hour == 6) && (minute < 30)) { return false; } // not valid
+ return true; // valid
+}</pre>
+ </div>
+
+ <hr />
+
+ <div>
+ Define when the time picker is shown with the <kbd>showOn</kbd> option and set a trigger element with the <kbd>button</kbd> option
+ <input type="text" style="width: 70px;" id="timepicker_showon" value="13h30" />
+ <div class='timepicker_button_trigger'
+ style="width: 16px; height:16px; background: url(include/ui-lightness/images/ui-icons_222222_256x240.png) -80px, -96px;
+ display: inline-block; border-radius: 2px; border: 1px solid #222222; margin-top: 3px; cursor:pointer"></div>
+ <button class='timepicker_button_trigger' id="btn_trigger_timepicker">Show</button>
+
+
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_showon').timepicker({
+ showOn: 'button',
+ button: $('.timepicker_button_trigger'),
+ showLeadingZero: false,
+ timeSeparator: 'h'
+ });
+
+ });
+
+ </script>
+ <a onclick="$('#script_showhide').toggle(200)">[Show code]</a>
+<pre id="script_showhide" style="display: none" class="code">$('#timepicker').timepicker({
+ showOn: 'button',
+ button: '.timepicker_button_trigger'
+});
+</pre>
+
+ </div>
+
+
+ <hr />
+
+ <div>
+ Time picker without the AM/PM labels on the left (showPeriodLabels option set to false:
+ <input type="text" style="width: 70px;" id="timepicker_noPeriodLabels" value="13:30" />
+
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_noPeriodLabels').timepicker({
+ showPeriodLabels: false
+ });
+ });
+
+ </script>
+ <a onclick="$('#script_noPeriodLabels').toggle(200)">[Show code]</a>
+<pre id="script_noPeriodLabels" style="display: none" class="code">$('#timepicker').timepicker({
+ showPeriodLabels: false,
+});
+</pre>
+
+ </div>
+
+
+ <hr />
+
+ <div>
+
+ Custom defined hours range (Business hours 6am to 7pm) and minutes increment set to 15 instead of 5, on 3 rows
+ <input type="text" style="width: 70px" id="timepicker_customrange" value="13:30">
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_customrange').timepicker({
+ hours: { starts: 6, ends: 19 },
+ minutes: { interval: 15 },
+ rows: 3,
+ showPeriodLabels: true,
+ minuteText: 'Min'
+ })
+ });
+
+ </script>
+
+ <a onclick="$('#script_2').toggle(200)">[Show code]</a>
+<pre id="script_2" style="display: none" class="code"> $('#timepicke').timepicker({
+ hours: { starts: 6, ends: 19 },
+ minutes: { interval: 15 },
+ rows: 3
+ showPeriodLabels: true,
+ minuteText: 'Min'
+});
+</pre>
+ </div>
+
+ <hr />
+
+ <div>
+ Input for hours only :
+ <input type="text" style="width: 70px" id="timepicker_hours" value="5 PM">
+ , input for minutes only :
+ <input type="text" style="width: 70px" id="timepicker_minutes" value="45">
+
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_hours').timepicker({
+ showMinutes: false,
+ showPeriod: true,
+ showLeadingZero: false
+ });
+ $('#timepicker_minutes').timepicker({
+ showHours: false
+ });
+ })
+ </script>
+
+ <a onclick="$('#script_hoursminutesonly').toggle(200)">[Show code]</a>
+<pre id="script_hoursminutesonly" style="display: none" class="code">$('#timepicker_hours').timepicker({
+ showMinutes: false,
+ showPeriod: true,
+ showLeadingZero: false
+});
+$('#timepicker_minutes').timepicker({
+ showHours: false
+});</pre>
+
+ </div>
+
+
+ <hr />
+
+ <div>
+ Timepicker with the Now, Deselect and Close buttons
+ <input type="text" style="width: 70px" id="timepicker_buttons" value="12:35">
+
+
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_buttons').timepicker({
+ showNowButton: true,
+ showDeselectButton: true,
+ defaultTime: '', // removes the highlighted time for when the input is empty.
+ showCloseButton: true
+ });
+ })
+ </script>
+
+ <a onclick="$('#script_buttonpane').toggle(200)">[Show code]</a>
+<pre id="script_buttonpane" style="display: none" class="code">$('#timepicker_buttons').timepicker({
+ showNowButton: true,
+ showDeselectButton: true,
+ defaultTime: '', // removes the highlighted time for when the input is empty.
+ showCloseButton: true
+});</pre>
+
+ </div>
+
+
+ <hr />
+
+ <div>
+ onSelect (hours and minutes both trigger event), beforeShow and onClose events :
+ <input type="text" style="width: 70px" id="timepicker_3" value="13:30" />
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_3').timepicker({
+ beforeShow: function(input, inst) {
+ log_event('beforeShow triggered for instance id ' + inst.id);
+ },
+ onClose: function(time, inst) {
+ log_event('onClose triggered with time : ' + time + ' for instance id : ' + inst.id);
+ },
+ onSelect: function(time, inst) {
+ log_event('onSelect triggered with time : ' + time + ' for instance id : ' + inst.id);
+ }
+ });
+ });
+
+ function log_event(event) {
+ $('#events_log').val(
+ $('#events_log').val() + "\n" + event
+ )
+ }
+ </script>
+
+ <a onclick="$('#script_3').toggle(200)">[Show code]</a>
+<pre id="script_3" style="display: none" class="code">function log_event(event) {
+ $('#events_log').val(
+ $('#events_log').val() + "\n" + event
+ )
+}
+$('#timepicker').timepicker({
+ onClose: function(time, inst) {
+ log_event('onClose triggered with time : ' + time + ' for instance id : ' + inst.id);
+ },
+ onSelect: function(time, inst) {
+ log_event('onSelect triggered with time : ' + time + ' for instance id : ' + inst.id);
+ }
+});
+</pre>
+ <br />
+ <textarea id="events_log" rows="4" cols="120" >events log :</textarea>
+ </div>
+
+
+<hr />
+
+ <div>
+
+ <div style="float: left">
+ Inline time picker :
+ <span style="color: #888;">
+ Alternate field :
+ <input type="text" style="width: 70px" id="timepicker_alt" value="13:30" readonly="readonly" disabled="disabled"/>
+ </span>
+ <br />
+ <input type="button" value="Change time to 16:55" onclick="javascript:$('#timepicker_inline_7').timepicker('setTime','16:55');">
+ <br>
+ <input type="button" id='tp7_getTime_button' value="Get selected time" onclick="javascript:tp7_getTime();" >
+ <br>
+ <input type="button" id="tp7_getHourMinute_button" value="Get hour and minute" onclick="javascript:tp7_getHourMinute();" >
+ <br />
+ <a onclick="$('#script_inline').toggle(200); return false;">[Show code]</a>
+ </div>
+ <div id="timepicker_inline_7" style="font-size: 10px; float: left; margin-left: 24px;"></div>
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_inline_7').timepicker({
+ altField: '#timepicker_alt',
+ defaultTime: '13:30'
+ });
+ });
+ function tp7_getTime() {
+ $('#tp7_getTime_button').val('Selected time : ' + $('#timepicker_inline_7').timepicker('getTime'));
+ }
+ function tp7_getHourMinute() {
+ $('#tp7_getHourMinute_button').val(
+ 'Hour : ' + $('#timepicker_inline_7').timepicker('getHour')
+ + ', ' +
+ 'minute : ' + $('#timepicker_inline_7').timepicker('getMinute')
+ );
+ }
+ </script>
+ <div style="clear: both"></div>
+
+<pre class="code" id="script_inline" style="display: none">$('#timepicker_inline_div').timepicker({
+ altField: '#timepicker_alt_input',
+ defaultTime: '9:20'
+});
+function setNewTime() {
+ $('#timepicker_inline_div').timepicker('setTime','16:55');
+}
+function getTime() {
+ $('#getTime_button').val('Selected time : ' + $('#timepicker').timepicker('getTime'));
+}
+function getHourMinute() {
+ $('#getHourMinute_button').val(
+ 'Hour : ' + $('#timepicker').timepicker('getHour')
+ + ', ' +
+ 'minute : ' + $('#timepicker').timepicker('getMinute')
+ );
+}
+</pre>
+
+ </div>
+
+
+ <hr />
+
+ <div>
+
+ Two timepickers to select chronological time range, the first timepicker is restricted to before the time selected in the second timepicker, and vice versa.
+ <br>
+ Start time :
+ <input type="text" style="width: 70px" id="timepicker_start" value="9:15" />
+ end time :
+ <input type="text" style="width: 70px" id="timepicker_end" value="16:30" />
+
+ <a onclick="$('#script_time_range').toggle(200); return false;">[Show code]</a>
+
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_start').timepicker({
+ showLeadingZero: false,
+ onHourShow: tpStartOnHourShowCallback,
+ onMinuteShow: tpStartOnMinuteShowCallback
+ });
+ $('#timepicker_end').timepicker({
+ showLeadingZero: false,
+ onHourShow: tpEndOnHourShowCallback,
+ onMinuteShow: tpEndOnMinuteShowCallback
+ });
+ });
+
+ function tpStartOnHourShowCallback(hour) {
+ var tpEndHour = $('#timepicker_end').timepicker('getHour');
+ // Check if proposed hour is prior or equal to selected end time hour
+ if (hour <= tpEndHour) { return true; }
+ // if hour did not match, it can not be selected
+ return false;
+ }
+ function tpStartOnMinuteShowCallback(hour, minute) {
+ var tpEndHour = $('#timepicker_end').timepicker('getHour');
+ var tpEndMinute = $('#timepicker_end').timepicker('getMinute');
+ // Check if proposed hour is prior to selected end time hour
+ if (hour < tpEndHour) { return true; }
+ // Check if proposed hour is equal to selected end time hour and minutes is prior
+ if ( (hour == tpEndHour) && (minute < tpEndMinute) ) { return true; }
+ // if minute did not match, it can not be selected
+ return false;
+ }
+
+ function tpEndOnHourShowCallback(hour) {
+ var tpStartHour = $('#timepicker_start').timepicker('getHour');
+ // Check if proposed hour is after or equal to selected start time hour
+ if (hour >= tpStartHour) { return true; }
+ // if hour did not match, it can not be selected
+ return false;
+ }
+ function tpEndOnMinuteShowCallback(hour, minute) {
+ var tpStartHour = $('#timepicker_start').timepicker('getHour');
+ var tpStartMinute = $('#timepicker_start').timepicker('getMinute');
+ // Check if proposed hour is after selected start time hour
+ if (hour > tpStartHour) { return true; }
+ // Check if proposed hour is equal to selected start time hour and minutes is after
+ if ( (hour == tpStartHour) && (minute > tpStartMinute) ) { return true; }
+ // if minute did not match, it can not be selected
+ return false;
+ }
+
+ </script>
+
+<pre class="code" id="script_time_range" style="display: none">
+$(document).ready(function() {
+ $('#timepicker_start').timepicker({
+ showLeadingZero: false,
+ onHourShow: tpStartOnHourShowCallback,
+ onMinuteShow: tpStartOnMinuteShowCallback
+ });
+ $('#timepicker_end').timepicker({
+ showLeadingZero: false,
+ onHourShow: tpEndOnHourShowCallback,
+ onMinuteShow: tpEndOnMinuteShowCallback
+ });
+});
+
+function tpStartOnHourShowCallback(hour) {
+ var tpEndHour = $('#timepicker_end').timepicker('getHour');
+ // Check if proposed hour is prior or equal to selected end time hour
+ if (hour <= tpEndHour) { return true; }
+ // if hour did not match, it can not be selected
+ return false;
+}
+function tpStartOnMinuteShowCallback(hour, minute) {
+ var tpEndHour = $('#timepicker_end').timepicker('getHour');
+ var tpEndMinute = $('#timepicker_end').timepicker('getMinute');
+ // Check if proposed hour is prior to selected end time hour
+ if (hour < tpEndHour) { return true; }
+ // Check if proposed hour is equal to selected end time hour and minutes is prior
+ if ( (hour == tpEndHour) && (minute < tpEndMinute) ) { return true; }
+ // if minute did not match, it can not be selected
+ return false;
+}
+
+function tpEndOnHourShowCallback(hour) {
+ var tpStartHour = $('#timepicker_start').timepicker('getHour');
+ // Check if proposed hour is after or equal to selected start time hour
+ if (hour >= tpStartHour) { return true; }
+ // if hour did not match, it can not be selected
+ return false;
+}
+function tpEndOnMinuteShowCallback(hour, minute) {
+ var tpStartHour = $('#timepicker_start').timepicker('getHour');
+ var tpStartMinute = $('#timepicker_start').timepicker('getMinute');
+ // Check if proposed hour is after selected start time hour
+ if (hour > tpStartHour) { return true; }
+ // Check if proposed hour is equal to selected start time hour and minutes is after
+ if ( (hour == tpStartHour) && (minute > tpStartMinute) ) { return true; }
+ // if minute did not match, it can not be selected
+ return false;
+}
+</pre>
+
+ </div>
+
+
+
+ <hr />
+
+ <div>
+ Example to disable and re-enable a timepicker.
+ <br />
+ <div id="timepicker_disable_inline" style="font-size: 10px; float: left;"></div>
+ <input type="text" style="width: 70px" id="timepicker_disable" value="9:15" />
+ <br />
+ <button id="btn_disable_tp">Disable the time pickers</button>
+ <br />
+ <button id="btn_enable_tp">Re-enable the time pickers</button>
+ <br />
+ <a onclick="$('#script_tp_disable').toggle(200); return false;">[Show code]</a>
+ <div style="clear: both"></div>
+
+ <script type="text/javascript">
+ $(document).ready(function() {
+ $('#timepicker_disable_inline').timepicker();
+ $('#timepicker_disable').timepicker({showLeadingZero: false });
+ $('#btn_disable_tp').click(function() {
+ $('#timepicker_disable_inline').timepicker('disable');
+ $('#timepicker_disable').timepicker('disable');
+ });
+ $('#btn_enable_tp').click(function() {
+ $('#timepicker_disable_inline').timepicker('enable');
+ $('#timepicker_disable').timepicker('enable');
+ });
+ });
+ </script>
+<pre class="code" style="display: none" id="script_tp_disable">
+$('#timepicker_disable_inline').timepicker();
+$('#timepicker_disable').timepicker({showLeadingZero: false });
+$('#btn_disable_tp').click(function() {
+ $('#timepicker_disable_inline').timepicker('disable');
+ $('#timepicker_disable').timepicker('disable');
+});
+$('#btn_enable_tp').click(function() {
+ $('#timepicker_disable_inline').timepicker('enable');
+ $('#timepicker_disable').timepicker('enable');
+});
+</pre>
+ </div>
+
+
+ </div>
+
+ <!------------------------------------------------------------------------------------------------------------->
+ <!------------------------------------------------------------------------------------------------------------->
+ <!------------------------------------------------------------------------------------------------------------->
+
+ <div id="usage">
+
+ <h2><a name="documentation"></a>Usage:</h2>
+ <pre class="code">$('#timepicker').timepicker({
+ // Options
+ timeSeparator: ':', // The character to use to separate hours and minutes. (default: ':')
+ showLeadingZero: true, // Define whether or not to show a leading zero for hours < 10.
+ (default: true)
+ showMinutesLeadingZero: true, // Define whether or not to show a leading zero for minutes < 10.
+ (default: true)
+ showPeriod: false, // Define whether or not to show AM/PM with selected time. (default: false)
+ showPeriodLabels: true, // Define if the AM/PM labels on the left are displayed. (default: true)
+ periodSeparator: ' ', // The character to use to separate the time from the time period.
+ altField: '#alternate_input', // Define an alternate input to parse selected time to
+ defaultTime: '12:34', // Used as default time when input field is empty or for inline timePicker
+ // (set to 'now' for the current time, '' for no highlighted time,
+ default value: now)
+
+ // trigger options
+ showOn: 'focus', // Define when the timepicker is shown.
+ // 'focus': when the input gets focus, 'button' when the button trigger element is clicked,
+ // 'both': when the input gets focus and when the button is clicked.
+ button: null, // jQuery selector that acts as button trigger. ex: '#trigger_button'
+
+ // Localization
+ hourText: 'Hour', // Define the locale text for "Hours"
+ minuteText: 'Minute', // Define the locale text for "Minute"
+ amPmText: ['AM', 'PM'], // Define the locale text for periods
+
+ // Position
+ myPosition: 'left top', // Corner of the dialog to position, used with the jQuery UI Position utility if present.
+ atPosition: 'left bottom', // Corner of the input to position
+
+ // Events
+ beforeShow: beforeShowCallback, // Callback function executed before the timepicker is rendered and displayed.
+ onSelect: onSelectCallback, // Define a callback function when an hour / minutes is selected.
+ onClose: onCloseCallback, // Define a callback function when the timepicker is closed.
+ onHourShow: onHourShow, // Define a callback to enable / disable certain hours. ex: function onHourShow(hour)
+ onMinuteShow: onMinuteShow, // Define a callback to enable / disable certain minutes. ex: function onMinuteShow(hour, minute)
+
+ // custom hours and minutes
+ hours: {
+ starts: 0, // First displayed hour
+ ends: 23 // Last displayed hour
+ },
+ minutes: {
+ starts: 0, // First displayed minute
+ ends: 55, // Last displayed minute
+ interval: 5 // Interval of displayed minutes
+ },
+ rows: 4, // Number of rows for the input tables, minimum 2, makes more sense if you use multiple of 2
+ showHours: true, // Define if the hours section is displayed or not. Set to false to get a minute only dialog
+ showMinutes: true, // Define if the minutes section is displayed or not. Set to false to get an hour only dialog
+
+ // buttons
+ showCloseButton: false, // shows an OK button to confirm the edit
+ closeButtonText: 'Done', // Text for the confirmation button (ok button)
+ showNowButton: false, // Shows the 'now' button
+ nowButtonText: 'Now', // Text for the now button
+ showDeselectButton: false, // Shows the deselect time button
+ deselectButtonText: 'Deselect' // Text for the deselect button
+
+});</pre>
+
+ </div>
+
+ <!------------------------------------------------------------------------------------------------------------->
+ <!------------------------------------------------------------------------------------------------------------->
+ <!------------------------------------------------------------------------------------------------------------->
+
+ <div id="requirements">
+ <h2>Requirements : </h2>
+ <ul>
+ <li>
+ <a href="http://jquery.com">
+ jQuery 1.5.1 (probably works with previous versions)
+ </a>
+ </li>
+ <li>
+ <a href="http://jqueryui.com/">
+ jQuery UI Core (included in jquery-ui-x.x.x.custom.min.js)
+ </a>
+ </li>
+ <li>
+ <a href="http://jqueryui.com/demos/position/">
+ jQuery UI Position utility (optional for special position of the dialog)
+ </a>
+ </li>
+ <li>
+ <a href="http://jqueryui.com/">
+ jQuery UI Theme.css (included in jquery-ui-x.x.x.custom.css)
+ </a>
+ </li>
+
+ <li>
+ <a href="jquery.ui.timepicker.js?v=0.2.9">
+ jquery.ui.timepicker.js
+ </a>
+ </li>
+
+ <li>
+ <a href="jquery.ui.timepicker.css?v=0.2.9">
+ jquery.ui.timepicker.css
+ </a>
+ </li>
+
+
+ </ul>
+ </div>
+
+ <!------------------------------------------------------------------------------------------------------------->
+ <!------------------------------------------------------------------------------------------------------------->
+ <!------------------------------------------------------------------------------------------------------------->
+
+ <div id="release_notes">
+
+ <h2>Releases :</h2>
+ <dl>
+
+ <dt>Release 0.2.9 - November 13, 2011</dt>
+ <dd>Fixed the zIndex problem and removed the zIndex option (Thanks everyone who reported the problem)</dd>
+ <dd>Fix a bug where repeatedly clicking on hour cells made the timepicker very slow.</dd>
+ <dd>Added Italian translation, thanks to Serge Margarita.</dd>
+
+ <dt>Release 0.2.8 - October 28, 2011</dt>
+ <dd>Updated defaultTime to allow for Date object (github issue #26)</dd>
+ <dd>Fixed the now and deselect buttons in IE</dd>
+
+ <dt>Release 0.2.7 - October 19, 2011</dt>
+ <dd>Added option to omit minutes in parsed time when user select 0 for minutes. (Thanks tribalvibes, Github issue #23)</dd>
+ <dd>Added support for internationalisation (fr, de and ja, Thanks Bernd Plagge).</dd>
+ <dd>Added an <a href="i18n/i18n.html">internationalisation page</a></dd>
+
+ <dt>0.2.6 - October 12, 2011</dt>
+ <dd>Fixed a bug when input ID have more then one special char. (Thanks Jacqueline Krijnen)</dd>
+ <dd>Fixed a bug when parsing hours only or minutes only time. (Thanks protron, <a href="https://github.com/fgelinas/timepicker/issues/20">github issue #20</a>)</dd>
+ <dd>Added 'Now', 'Deselect' and 'Close' buttons. (Thanks Christian Grobmeier for the close button code, <a href="https://github.com/fgelinas/timepicker/issues/20">github issue #22</a>)</dd>
+
+ <dt>0.2.5 - September 13, 2011</dt>
+ <dd>Added support for disable and enable. (Suggested by danielrex, github issue #17)</dd>
+ <dd>Added an example for 2 timepicker to behave as a period selector (start time and end time). (Thanks Bill Pellowe)</dd>
+ <dd>Renamed the stylesheet to jquery.ui.timepicker.css to be more consistent with jQuery UI file name convention.</dd>
+
+ <dt>0.2.4 - August 5, 2011</dt>
+ <dd>Fixed the hand cursor in the css file. (Thanks Mike Neumegen)</dd>
+ <dd>Added position option to use with the jquery ui position utility.</dd>
+ <dd>Added option to display only hours or only minutes.</dd>
+
+ <dt>0.2.3 - July 11, 2011 </dt>
+ <dd>Fix github issue #3 : Bug when hours or minutes choices does not divide by number of rows (thanks wukimus).</dd>
+ <dd>Changed default behavior of the defaultTime option, if set to '' and input is empty, there will be no highlighted time in the popup (Thanks Rasmus Schultz)</dd>
+ <dd>Fix github issue #4 : Error when generating empty minute cell. (Thanks 123Haynes)</dd>
+ <dd>Fix github issue #5 : Add functionality for "getTime" option. (Thanks edanuff)</dd>
+ <dd>Added the periodSeparator option. (thanks jrchamp)</dd>
+ <dd>Fixed "getTime" for inline timepickers. (thanks Mike Neumegen)</dd>
+ <dd>Added "getHour" and "getMinute" to get individual values.</dd>
+ <dd>New page interface, about time :)</dd>
+
+ <dt>0.2.2 - June 16, 2011</dt>
+ <dd>Fixed a "console.log" line that I forgot to remove before release 0.2.1. (Thanks Derek Lavine)</dd>
+
+ <dt>0.2.1 - June 8, 2011</dt>
+ <dd>Timepicker does not give the focus back to the input any more after time selection. This is similar to the datepicker behaviour and is more natural to the user because it shows the dialog again when the user click on the input again, as expected.</dd>
+ <dd>Added options to customize the hours and minutes ranges and interval for more customization.</dd>
+
+ <dt>0.2 - May 28, 2011</dt>
+ <dd>In the last release, I messed up versions and lost some changes so I'm fixing all this up with release 0.2</dd>
+
+
+ <dt>0.1.2 - May 26, 2011</dt>
+ <dd>Fixed a bug with inline timepickers that would append a #timepickr hashtag when selecting hours and minutes.</dd>
+ <dd>Fixed z-index problem with IE6 (Thanks Graham Bentley)</dd>
+ <dd>Added selection of highlighted text when enter is pressed on the input field (Thanks Glen Chiacchieri)</dd>
+ <dd>Adjusted some focus problems, now the input gets the focus back when the used click on hours / minutes.</dd>
+
+ <dt>0.1.something aka the lost release - around April 11</dt>
+ <dd>Fixed a bug for when input Id had a dot in it, it was getting double escaped when it should not. (Thanks Zdenek Machac)</dd>
+ <dd>So in 0.1.1 I created a bug that made timepicker changes the location hash, well now it's fixed. (Thanks Lucas Falk)</dd>
+
+ <dt>0.1.1 - April 6, 2011</dt>
+ <dd>Changed the cells click and dblclick binding for faster rendering in IE6/7 (Thanks Blair Parsons)</dd>
+ <dd>Fixed a class naming bug created in 0.1.0 (Thanks Morlion Peter)</dd>
+
+ <dt>0.1.0 - March 23, 2011</dt>
+ <dd>Fixed some bugs with version 0.0.9</dd>
+
+ <dt>0.0.9 - March 22, 2011</dt>
+ <dd>Added zIndex option (Thanks Frank Enderle)</dd>
+ <dd>Added showPeriodLabels option (default: true) to show/hide AM/PM labels on the left (thanks Frank Enderle)</dd>
+ <dd>Added showOn ['focus'|'button'|'both'] and button options for alternate trigger method</dd>
+
+ <dt>0.0.8 - February 17, 2011</dt>
+ <dd>Fixed close event not triggered when switching to another input with time picker (thanks Stuart Gregg)</dd>
+
+ <dt>0.0.7 - February 10, 2011</dt>
+ <dd>Added function to set time after initialisation :$('#timepicker').timepicker('setTime',newTime);</dd>
+ <dd>Added support for disabled period of time : onHourShow and onMinuteShow (thanks Rene Felgenträger)</dd>
+
+ <dt>0.0.6 - January 19, 2011</dt>
+ <dd>Replaced some div with tables to : fix some display bugs in IE7, fix inline display and fix my headhake.</dd>
+ <dd>Added standard "change" event being triggered on the input when the content changes. (Thanks Rasmus Schultz)</dd>
+ <dd>Added support for inline timePicker, attached to div or span.</dd>
+ <dd>Added altField that receive the parsed time value when selected time changes.</dd>
+ <dd>Added defaultTime value to use when input field is missing (inline) or input value is empty. If defaultTime is missing then current time is used.</dd>
+
+ <dt>0.0.5 - January 18, 2011</dt>
+ <dd>Now updating time picker selected value when manually typing in the text field (thanks Rasmus Schultz)<br />
+ <small>Another step toward inline time picker ?</small></dd>
+ <dd>Fixed : with showPeriod: true and showLeadingZero: true, PM hours did not show leading zeros (thanks Chandler May)</dd>
+ <dd>Fixed : with showPeriod: true and showLeadingZero: true, Selecting 12 AM shows as 00 AM in the input field, also parsing 12AM did not work correctly (thanks Rasmus Schultz)</dd>
+
+ <dt>0.0.4 - January 10, 2011</dt>
+ <dd>Changed showLeadingZero to affect only hours, added showMinutesLeadingZero for minutes display.</dd>
+ <dd>Changed the default value of timeSeparator from 'h' to ':'.</dd>
+ <dd>Removed width:100% on tables in the css, caused a bug in some browsers.</dd>
+
+ <dt>0.0.3 - January 8, 2011</dt>
+ <dd>Fixed a bug with the widget not displaying with some jQuery UI 1.8.7 css. (Thanks Alexander Fietz)</dd>
+ <dd>Fixed a display bug on page load, a small empty div was visible at the bottom of pages. (Thanks Gertjan van Roekel)</dd>
+ <dd>Modified the jquery-ui-timepicker.css to make the widget more dynamic to style and sizes changes.</dd>
+
+ <dt>0.0.2 - January 4, 2011</dt>
+ <dd>Added showPeriod: period (AM/PM) in input and showLeadingZero: to control display of number < 10. (big thanks Steve Commisso)</dd>
+
+ <dt>0.0.1 - December 2010</dt>
+ <dd>First release</dd>
+ </dl>
+
+ <hr />
+
+ <h2>To Do : </h2>
+
+ <ul>
+ <li>
+ Possibility to use the timepicker for hours only, or minutes only.
+ </li>
+
+ <li>
+ Change the code style to use the jQuery widget framework.
+ </li>
+ <li>
+ Detect a second click on the same cell and close the picker (ie: the user selected hours and do not want to select different minutes or vice versa, and click twice on the same cell instead)
+ This is already simulated with the handling of the double click.
+ </li>
+ </ul>
+
+ </div>
+
+ <!------------------------------------------------------------------------------------------------------------->
+ <!------------------------------------------------------------------------------------------------------------->
+ <!------------------------------------------------------------------------------------------------------------->
+
+ <div id="get_timepicker">
+
+ <h2>Download Timepicker</h2>
+
+ <p>
+ Current version : 0.2.9 - released November 13, 2011
+ </p>
+
+ <p>
+ <a href="http://github.com/fgelinas/timepicker">Get it on github</a>
+ </p>
+
+ <p>
+ <a href="releases/jquery-ui-timepicker-0.2.9.zip">Download from here (.zip)</a>
+ </p>
+
+ <hr >
+
+ <p>
+ I put a lot of time and effort in this project. If you like it, please <span style="text-decoration: line-through">pay me a beer</span> donate
+ <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
+ <input type="hidden" name="cmd" value="_s-xclick">
+ <input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIHXwYJKoZIhvcNAQcEoIIHUDCCB0wCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYAWkzIsIl82czV2G3Q9ZXnb/DRAMXxqoRAbR2Ko9MxOohDZFiEVewPWrI/SK/7BiD0ja9juUtjuCVuy1o2biKJBi+iVii4Z3TFPiukwX+WfUymLym+6G0VdNdW6gjrL6UtYUy6c0y/edfwLuZCErAkSfUxa5TusNL8pwgPmtPBK7DELMAkGBSsOAwIaBQAwgdwGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIA9o7C8ZvFUqAgbjWPJxPrybGa8lccR3EvoJu44RfaBK43kMW+Z20hmldlWqLEx3M87vO5l6qKEBkpAGI9OMexe/qSfVCzbaDDA3pXOjJAKtdMvW0rXKoAvu9BTFJH0eaSWfc+8wO80xRgjdIawgDPlVBmDvd7ZHjMA+otaW85fhGLXBD5OCcdKgx57I2X9UAVkKRSJaFBr5Uoi1jjjToxgmVjggX48rM5siegUMnhXwy4CXZoyZLGPPIVIamwdHQFrr8oIIDhzCCA4MwggLsoAMCAQICAQAwDQYJKoZIhvcNAQEFBQAwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tMB4XDTA0MDIxMzEwMTMxNVoXDTM1MDIxMzEwMTMxNVowgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBR07d/ETMS1ycjtkpkvjXZe9k+6CieLuLsPumsJ7QC1odNz3sJiCbs2wC0nLE0uLGaEtXynIgRqIddYCHx88pb5HTXv4SZeuv0Rqq4+axW9PLAAATU8w04qqjaSXgbGLP3NmohqM6bV9kZZwZLR/klDaQGo1u9uDb9lr4Yn+rBQIDAQABo4HuMIHrMB0GA1UdDgQWBBSWn3y7xm8XvVk/UtcKG+wQ1mSUazCBuwYDVR0jBIGzMIGwgBSWn3y7xm8XvVk/UtcKG+wQ1mSUa6GBlKSBkTCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb22CAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCBXzpWmoBa5e9fo6ujionW1hUhPkOBakTr3YCDjbYfvJEiv/2P+IobhOGJr85+XHhN0v4gUkEDI8r2/rNk1m0GA8HKddvTjyGw/XqXa+LSTlDYkqI8OwR8GEYj4efEtcRpRYBxV8KxAW93YDWzFGvruKnnLbDAF6VR5w/cCMn5hzGCAZowggGWAgEBMIGUMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbQIBADAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTEwODAzMDExMDA1WjAjBgkqhkiG9w0BCQQxFgQUgo9bH78dF5LRoNM548QKDGlFK6swDQYJKoZIhvcNAQEBBQAEgYBTMfZGH1bq7va+xzcOogdHkk+icmN3+f1FS+1sH5lxbanekELUV/ATDUdnoRMxEuOkGCsl0pLERGqhE0NDN6CwvrLf7mvY/dk/Q5sF1kARmp+4TAXdPkS/GoyVB/hDmBcfMvfVDUD1LFbzfSDnS+GY66Bn+bw3zqKB7Rb9RTWLxg==-----END PKCS7-----
+ ">
+ <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
+ <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
+ </form>
+ </p>
+
+ <hr />
+
+ <p>
+ Instruction for legacy jQuery integration (jQuery 1.2.6 and jQuery UI 1.6)
+ <br>
+
+ <ul>
+ <li>
+ <a href="releases/jquery-ui-timepicker-legacy_support.zip">Get the legacy package here</a>
+ , built with jQuery Timepicker 0.2.4 but should work with newer versions
+ </li>
+ <li>
+ Make sure to include jquery-1.2.6.js, jquery.fix.for.1.2.6.js and jquery.ui.1.6.all.js
+ </li>
+ <li>
+ See the working example in index.html in the "legacy_1.2.6" folder.
+ </li>
+ <li>
+ Support for previous versions of jquery is limited.
+ </li>
+ </ul>
+
+ </p>
+
+ </div>
+</div>
+
+
+<hr />
+<!-- =============================================================================================================== -->
+
+<div id="footer">
+
+
+
+ <p>
+ <strong>New! New!</strong> TimePicker is now 100% more social, on GitHub @ <a href="http://github.com/fgelinas/timepicker">http://github.com/fgelinas/timepicker</a>.
+ </p>
+ <p>
+ Get the release package here : <a href="releases/jquery-ui-timepicker-0.2.9.zip">jquery-ui-timepicker-0.2.9.zip</a>
+ </p>
+
+ <hr />
+
+ <p>
+ <form action="https://www.paypal.com/cgi-bin/webscr" method="post">
+ I put a lot of time and effort in this project. If you like it, please <span style="text-decoration: line-through">pay me a beer</span> donate
+ <input type="hidden" name="cmd" value="_s-xclick">
+ <input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIHXwYJKoZIhvcNAQcEoIIHUDCCB0wCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYAOOlt0j59m8piNj+eoHdZuDbEkv/TCvP1r0KRrnnprtQLlNhfnFOEmY1MQbrCs/QJb80MxUS1/O2pNK7z+GzdC3CFn41SIAHiaTVQlQ8HO6C7EqWqkwsVXhgkob/WdDw7BzN5UcI/lPfuhtwTZ2pVrS/FhKt14ce1OJlvwdo4kKTELMAkGBSsOAwIaBQAwgdwGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIsV1Pn/r0+ReAgbih+9Jwqy8FHU2Ba2iAkKRKBmwv7ZzNqVJ9f23bBu8eBG0EDbQuikn7lXozKnq23Qbjf9BtoX5B/92Ma2Ue/hB6WttZm4ka/nAnnK2lyS+mU8YVagQlieWblUiFzCvcltTDgukcI4L88rLtjmgG4x1Zf/ZBqiYrZzKt/J8wQWAvO69X75qULw6FRr+aFPmO668KtSi0Ggp2IDKpGiTMzaTaf3KChQTvgovPim2+4x6XH5888poSsuHAoIIDhzCCA4MwggLsoAMCAQICAQAwDQYJKoZIhvcNAQEFBQAwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tMB4XDTA0MDIxMzEwMTMxNVoXDTM1MDIxMzEwMTMxNVowgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBR07d/ETMS1ycjtkpkvjXZe9k+6CieLuLsPumsJ7QC1odNz3sJiCbs2wC0nLE0uLGaEtXynIgRqIddYCHx88pb5HTXv4SZeuv0Rqq4+axW9PLAAATU8w04qqjaSXgbGLP3NmohqM6bV9kZZwZLR/klDaQGo1u9uDb9lr4Yn+rBQIDAQABo4HuMIHrMB0GA1UdDgQWBBSWn3y7xm8XvVk/UtcKG+wQ1mSUazCBuwYDVR0jBIGzMIGwgBSWn3y7xm8XvVk/UtcKG+wQ1mSUa6GBlKSBkTCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb22CAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCBXzpWmoBa5e9fo6ujionW1hUhPkOBakTr3YCDjbYfvJEiv/2P+IobhOGJr85+XHhN0v4gUkEDI8r2/rNk1m0GA8HKddvTjyGw/XqXa+LSTlDYkqI8OwR8GEYj4efEtcRpRYBxV8KxAW93YDWzFGvruKnnLbDAF6VR5w/cCMn5hzGCAZowggGWAgEBMIGUMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbQIBADAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTEwODAzMDExOTA1WjAjBgkqhkiG9w0BCQQxFgQUF1zJZYGVyFN/5C0fJiA3xL4Mgr8wDQYJKoZIhvcNAQEBBQAEgYCgdTdP9XXWmEtk2C7m8A1d4zR1UBxLplBAdiIF3lNrEr3zZFXoptVZ5TMbydvkQKhHrXEsBfjFs7lkB1vU0heqpN4fUmVB5nXUsiv8e/W92yOnJb59DQ4hXG6ASibeynTyGXbQxphj/128LC2lmi2waQdRzSdf5gY+bMZ4OgabQg==-----END PKCS7-----
+ ">
+ <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
+ <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
+ </form>
+ </p>
+
+
+ <hr />
+ Bug, ideas or comments : <a href="mailto:frank@fgelinas.com">frank@fgelinas.com</a>
+
+</div>
+
+</div>
+
+</body>
+</html>
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/jquery.ui.timepicker.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/jquery.ui.timepicker.css
new file mode 100644
index 0000000..08b442a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/jquery.ui.timepicker.css
@@ -0,0 +1,69 @@
+/*
+ * Timepicker stylesheet
+ * Highly inspired from datepicker
+ * FG - Nov 2010 - Web3R
+ *
+ * version 0.0.3 : Fixed some settings, more dynamic
+ * version 0.0.4 : Removed width:100% on tables
+ * version 0.1.1 : set width 0 on tables to fix an ie6 bug
+ */
+
+.ui-timepicker-inline { display: inline; }
+
+#ui-timepicker-div { padding: 0.2em }
+.ui-timepicker-table { display: inline-table; width: 0; }
+.ui-timepicker-table table { margin:0.15em 0 0 0; border-collapse: collapse; }
+
+.ui-timepicker-hours, .ui-timepicker-minutes { padding: 0.2em; }
+
+.ui-timepicker-table .ui-timepicker-title { line-height: 1.8em; text-align: center; }
+.ui-timepicker-table td { padding: 0.1em; width: 2.2em; }
+.ui-timepicker-table th.periods { padding: 0.1em; width: 2.2em; }
+
+/* span for disabled cells */
+.ui-timepicker-table td span {
+ display:block;
+ padding:0.2em 0.3em 0.2em 0.5em;
+ width: 1.2em;
+
+ text-align:right;
+ text-decoration:none;
+}
+/* anchors for clickable cells */
+.ui-timepicker-table td a {
+ display:block;
+ padding:0.2em 0.3em 0.2em 0.5em;
+ width: 1.2em;
+ cursor: pointer;
+ text-align:right;
+ text-decoration:none;
+}
+
+
+/* buttons and button pane styling */
+.ui-timepicker .ui-timepicker-buttonpane {
+ background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0;
+}
+.ui-timepicker .ui-timepicker-buttonpane button { margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+/* The close button */
+.ui-timepicker .ui-timepicker-close { float: right }
+
+/* the now button */
+.ui-timepicker .ui-timepicker-now { float: left; }
+
+/* the deselect button */
+.ui-timepicker .ui-timepicker-deselect { float: left; }
+
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-timepicker-cover {
+ display: none; /*sorry for IE5*/
+ display/**/: block; /*sorry for IE5*/
+ position: absolute; /*must have*/
+ z-index: -1; /*must have*/
+ filter: mask(); /*must have*/
+ top: -4px; /*must have*/
+ left: -4px; /*must have*/
+ width: 200px; /*must have*/
+ height: 200px; /*must have*/
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/jquery.ui.timepicker.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/jquery.ui.timepicker.js
new file mode 100644
index 0000000..d086b67
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/jquery.ui.timepicker.js
@@ -0,0 +1,1345 @@
+/*
+ * jQuery UI Timepicker 0.2.9
+ *
+ * Copyright 2010-2011, Francois Gelinas
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://fgelinas.com/code/timepicker
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.position.js (only if position settngs are used)
+ *
+ * Change version 0.1.0 - moved the t-rex up here
+ *
+ ____
+ ___ .-~. /_"-._
+ `-._~-. / /_ "~o\ :Y
+ \ \ / : \~x. ` ')
+ ] Y / | Y< ~-.__j
+ / ! _.--~T : l l< /.-~
+ / / ____.--~ . ` l /~\ \<|Y
+ / / .-~~" /| . ',-~\ \L|
+ / / / .^ \ Y~Y \.^>/l_ "--'
+ / Y .-"( . l__ j_j l_/ /~_.-~ .
+ Y l / \ ) ~~~." / `/"~ / \.__/l_
+ | \ _.-" ~-{__ l : l._Z~-.___.--~
+ | ~---~ / ~~"---\_ ' __[>
+ l . _.^ ___ _>-y~
+ \ \ . .-~ .-~ ~>--" /
+ \ ~---" / ./ _.-'
+ "-.,_____.,_ _.--~\ _.-~
+ ~~ ( _} -Row
+ `. ~(
+ ) \
+ /,`--'~\--'~\
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ->T-Rex<-
+*/
+
+(function ($, undefined) {
+
+ $.extend($.ui, { timepicker: { version: "0.2.9"} });
+
+ var PROP_NAME = 'timepicker';
+ var tpuuid = new Date().getTime();
+
+ /* Time picker manager.
+ Use the singleton instance of this class, $.timepicker, to interact with the time picker.
+ Settings for (groups of) time pickers are maintained in an instance object,
+ allowing multiple different settings on the same page. */
+
+ function Timepicker() {
+ this.debug = true; // Change this to true to start debugging
+ this._curInst = null; // The current instance in use
+ this._isInline = false; // true if the instance is displayed inline
+ this._disabledInputs = []; // List of time picker inputs that have been disabled
+ this._timepickerShowing = false; // True if the popup picker is showing , false if not
+ this._inDialog = false; // True if showing within a "dialog", false if not
+ this._dialogClass = 'ui-timepicker-dialog'; // The name of the dialog marker class
+ this._mainDivId = 'ui-timepicker-div'; // The ID of the main timepicker division
+ this._inlineClass = 'ui-timepicker-inline'; // The name of the inline marker class
+ this._currentClass = 'ui-timepicker-current'; // The name of the current hour / minutes marker class
+ this._dayOverClass = 'ui-timepicker-days-cell-over'; // The name of the day hover marker class
+
+ this.regional = []; // Available regional settings, indexed by language code
+ this.regional[''] = { // Default regional settings
+ hourText: 'Hour', // Display text for hours section
+ minuteText: 'Minute', // Display text for minutes link
+ amPmText: ['AM', 'PM'], // Display text for AM PM
+ closeButtonText: 'Done', // Text for the confirmation button (ok button)
+ nowButtonText: 'Now', // Text for the now button
+ deselectButtonText: 'Deselect' // Text for the deselect button
+ };
+ this._defaults = { // Global defaults for all the time picker instances
+ showOn: 'focus', // 'focus' for popup on focus,
+ // 'button' for trigger button, or 'both' for either (not yet implemented)
+ button: null, // 'button' element that will trigger the timepicker
+ showAnim: 'fadeIn', // Name of jQuery animation for popup
+ showOptions: {}, // Options for enhanced animations
+ appendText: '', // Display text following the input box, e.g. showing the format
+
+ beforeShow: null, // Define a callback function executed before the timepicker is shown
+ onSelect: null, // Define a callback function when a hour / minutes is selected
+ onClose: null, // Define a callback function when the timepicker is closed
+
+ timeSeparator: ':', // The character to use to separate hours and minutes.
+ periodSeparator: ' ', // The character to use to separate the time from the time period.
+ showPeriod: false, // Define whether or not to show AM/PM with selected time
+ showPeriodLabels: true, // Show the AM/PM labels on the left of the time picker
+ showLeadingZero: true, // Define whether or not to show a leading zero for hours < 10. [true/false]
+ showMinutesLeadingZero: true, // Define whether or not to show a leading zero for minutes < 10.
+ altField: '', // Selector for an alternate field to store selected time into
+ defaultTime: 'now', // Used as default time when input field is empty or for inline timePicker
+ // (set to 'now' for the current time, '' for no highlighted time)
+ myPosition: 'left top', // Position of the dialog relative to the input.
+ // see the position utility for more info : http://jqueryui.com/demos/position/
+ atPosition: 'left bottom', // Position of the input element to match
+ // Note : if the position utility is not loaded, the timepicker will attach left top to left bottom
+ //NEW: 2011-02-03
+ onHourShow: null, // callback for enabling / disabling on selectable hours ex : function(hour) { return true; }
+ onMinuteShow: null, // callback for enabling / disabling on time selection ex : function(hour,minute) { return true; }
+
+ hours: {
+ starts: 0, // first displayed hour
+ ends: 23 // last displayed hour
+ },
+ minutes: {
+ starts: 0, // first displayed minute
+ ends: 55, // last displayed minute
+ interval: 5 // interval of displayed minutes
+ },
+ rows: 4, // number of rows for the input tables, minimum 2, makes more sense if you use multiple of 2
+ // 2011-08-05 0.2.4
+ showHours: true, // display the hours section of the dialog
+ showMinutes: true, // display the minute section of the dialog
+ optionalMinutes: false, // optionally parse inputs of whole hours with minutes omitted
+
+ // buttons
+ showCloseButton: false, // shows an OK button to confirm the edit
+ showNowButton: false, // Shows the 'now' button
+ showDeselectButton: false // Shows the deselect time button
+
+ };
+ $.extend(this._defaults, this.regional['']);
+
+ this.tpDiv = $('<div id="' + this._mainDivId + '" class="ui-timepicker ui-widget ui-helper-clearfix ui-corner-all " style="display: none"></div>');
+ }
+
+ $.extend(Timepicker.prototype, {
+ /* Class name added to elements to indicate already configured with a time picker. */
+ markerClassName: 'hasTimepicker',
+
+ /* Debug logging (if enabled). */
+ log: function () {
+ if (this.debug)
+ console.log.apply('', arguments);
+ },
+
+ _widgetTimepicker: function () {
+ return this.tpDiv;
+ },
+
+ /* Override the default settings for all instances of the time picker.
+ @param settings object - the new settings to use as defaults (anonymous object)
+ @return the manager object */
+ setDefaults: function (settings) {
+ extendRemove(this._defaults, settings || {});
+ return this;
+ },
+
+ /* Attach the time picker to a jQuery selection.
+ @param target element - the target input field or division or span
+ @param settings object - the new settings to use for this time picker instance (anonymous) */
+ _attachTimepicker: function (target, settings) {
+ // check for settings on the control itself - in namespace 'time:'
+ var inlineSettings = null;
+ for (var attrName in this._defaults) {
+ var attrValue = target.getAttribute('time:' + attrName);
+ if (attrValue) {
+ inlineSettings = inlineSettings || {};
+ try {
+ inlineSettings[attrName] = eval(attrValue);
+ } catch (err) {
+ inlineSettings[attrName] = attrValue;
+ }
+ }
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ var inline = (nodeName == 'div' || nodeName == 'span');
+
+ if (!target.id) {
+ this.uuid += 1;
+ target.id = 'tp' + this.uuid;
+ }
+ var inst = this._newInst($(target), inline);
+ inst.settings = $.extend({}, settings || {}, inlineSettings || {});
+ if (nodeName == 'input') {
+ this._connectTimepicker(target, inst);
+ // init inst.hours and inst.minutes from the input value
+ this._setTimeFromField(inst);
+ } else if (inline) {
+ this._inlineTimepicker(target, inst);
+ }
+
+
+ },
+
+ /* Create a new instance object. */
+ _newInst: function (target, inline) {
+ var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
+ return {
+ id: id, input: target, // associated target
+ inline: inline, // is timepicker inline or not :
+ tpDiv: (!inline ? this.tpDiv : // presentation div
+ $('<div class="' + this._inlineClass + ' ui-timepicker ui-widget ui-helper-clearfix"></div>'))
+ };
+ },
+
+ /* Attach the time picker to an input field. */
+ _connectTimepicker: function (target, inst) {
+ var input = $(target);
+ inst.append = $([]);
+ inst.trigger = $([]);
+ if (input.hasClass(this.markerClassName)) { return; }
+ this._attachments(input, inst);
+ input.addClass(this.markerClassName).
+ keydown(this._doKeyDown).
+ keyup(this._doKeyUp).
+ bind("setData.timepicker", function (event, key, value) {
+ inst.settings[key] = value;
+ }).
+ bind("getData.timepicker", function (event, key) {
+ return this._get(inst, key);
+ });
+ $.data(target, PROP_NAME, inst);
+ },
+
+ /* Handle keystrokes. */
+ _doKeyDown: function (event) {
+ var inst = $.timepicker._getInst(event.target);
+ var handled = true;
+ inst._keyEvent = true;
+ if ($.timepicker._timepickerShowing) {
+ switch (event.keyCode) {
+ case 9: $.timepicker._hideTimepicker();
+ handled = false;
+ break; // hide on tab out
+ case 13:
+ $.timepicker._updateSelectedValue(inst);
+ $.timepicker._hideTimepicker();
+
+ return false; // don't submit the form
+ break; // select the value on enter
+ case 27: $.timepicker._hideTimepicker();
+ break; // hide on escape
+ default: handled = false;
+ }
+ }
+ else if (event.keyCode == 36 && event.ctrlKey) { // display the time picker on ctrl+home
+ $.timepicker._showTimepicker(this);
+ }
+ else {
+ handled = false;
+ }
+ if (handled) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /* Update selected time on keyUp */
+ /* Added verion 0.0.5 */
+ _doKeyUp: function (event) {
+ var inst = $.timepicker._getInst(event.target);
+ $.timepicker._setTimeFromField(inst);
+ $.timepicker._updateTimepicker(inst);
+ },
+
+ /* Make attachments based on settings. */
+ _attachments: function (input, inst) {
+ var appendText = this._get(inst, 'appendText');
+ var isRTL = this._get(inst, 'isRTL');
+ if (inst.append) { inst.append.remove(); }
+ if (appendText) {
+ inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
+ input[isRTL ? 'before' : 'after'](inst.append);
+ }
+ input.unbind('focus.timepicker', this._showTimepicker);
+ if (inst.trigger) { inst.trigger.remove(); }
+
+ var showOn = this._get(inst, 'showOn');
+ if (showOn == 'focus' || showOn == 'both') { // pop-up time picker when in the marked field
+ input.bind("focus.timepicker", this._showTimepicker);
+ }
+ if (showOn == 'button' || showOn == 'both') { // pop-up time picker when 'button' element is clicked
+ var button = this._get(inst, 'button');
+ $(button).bind("click.timepicker", function () {
+ if ($.timepicker._timepickerShowing && $.timepicker._lastInput == input[0]) { $.timepicker._hideTimepicker(); }
+ else { $.timepicker._showTimepicker(input[0]); }
+ return false;
+ });
+
+ }
+ },
+
+
+ /* Attach an inline time picker to a div. */
+ _inlineTimepicker: function(target, inst) {
+ var divSpan = $(target);
+ if (divSpan.hasClass(this.markerClassName))
+ return;
+ divSpan.addClass(this.markerClassName).append(inst.tpDiv).
+ bind("setData.timepicker", function(event, key, value){
+ inst.settings[key] = value;
+ }).bind("getData.timepicker", function(event, key){
+ return this._get(inst, key);
+ });
+ $.data(target, PROP_NAME, inst);
+
+ this._setTimeFromField(inst);
+ this._updateTimepicker(inst);
+ inst.tpDiv.show();
+ },
+
+ /* Pop-up the time picker for a given input field.
+ @param input element - the input field attached to the time picker or
+ event - if triggered by focus */
+ _showTimepicker: function (input) {
+ input = input.target || input;
+ if (input.nodeName.toLowerCase() != 'input') { input = $('input', input.parentNode)[0]; } // find from button/image trigger
+ if ($.timepicker._isDisabledTimepicker(input) || $.timepicker._lastInput == input) { return; } // already here
+
+ // fix v 0.0.8 - close current timepicker before showing another one
+ $.timepicker._hideTimepicker();
+
+ var inst = $.timepicker._getInst(input);
+ if ($.timepicker._curInst && $.timepicker._curInst != inst) {
+ $.timepicker._curInst.tpDiv.stop(true, true);
+ }
+ var beforeShow = $.timepicker._get(inst, 'beforeShow');
+ extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
+ inst.lastVal = null;
+ $.timepicker._lastInput = input;
+
+ $.timepicker._setTimeFromField(inst);
+
+ // calculate default position
+ if ($.timepicker._inDialog) { input.value = ''; } // hide cursor
+ if (!$.timepicker._pos) { // position below input
+ $.timepicker._pos = $.timepicker._findPos(input);
+ $.timepicker._pos[1] += input.offsetHeight; // add the height
+ }
+ var isFixed = false;
+ $(input).parents().each(function () {
+ isFixed |= $(this).css('position') == 'fixed';
+ return !isFixed;
+ });
+ if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
+ $.timepicker._pos[0] -= document.documentElement.scrollLeft;
+ $.timepicker._pos[1] -= document.documentElement.scrollTop;
+ }
+
+ var offset = { left: $.timepicker._pos[0], top: $.timepicker._pos[1] };
+
+ $.timepicker._pos = null;
+ // determine sizing offscreen
+ inst.tpDiv.css({ position: 'absolute', display: 'block', top: '-1000px' });
+ $.timepicker._updateTimepicker(inst);
+
+
+ // position with the ui position utility, if loaded
+ if ( ( ! inst.inline ) && ( typeof $.ui.position == 'object' ) ) {
+ inst.tpDiv.position({
+ of: inst.input,
+ my: $.timepicker._get( inst, 'myPosition' ),
+ at: $.timepicker._get( inst, 'atPosition' ),
+ // offset: $( "#offset" ).val(),
+ // using: using,
+ collision: 'flip'
+ });
+ var offset = inst.tpDiv.offset();
+ $.timepicker._pos = [offset.top, offset.left];
+ }
+
+
+ // reset clicked state
+ inst._hoursClicked = false;
+ inst._minutesClicked = false;
+
+ // fix width for dynamic number of time pickers
+ // and adjust position before showing
+ offset = $.timepicker._checkOffset(inst, offset, isFixed);
+ inst.tpDiv.css({ position: ($.timepicker._inDialog && $.blockUI ?
+ 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
+ left: offset.left + 'px', top: offset.top + 'px'
+ });
+ if ( ! inst.inline ) {
+ var showAnim = $.timepicker._get(inst, 'showAnim');
+ var duration = $.timepicker._get(inst, 'duration');
+
+ var postProcess = function () {
+ $.timepicker._timepickerShowing = true;
+ var borders = $.timepicker._getBorders(inst.tpDiv);
+ inst.tpDiv.find('iframe.ui-timepicker-cover'). // IE6- only
+ css({ left: -borders[0], top: -borders[1],
+ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
+ });
+ };
+
+ // Fixed the zIndex problem for real (I hope) - FG - v 0.2.9
+ inst.tpDiv.css('zIndex', $.timepicker._getZIndex(input) +1);
+
+ if ($.effects && $.effects[showAnim]) {
+ inst.tpDiv.show(showAnim, $.timepicker._get(inst, 'showOptions'), duration, postProcess);
+ }
+ else {
+ inst.tpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
+ }
+ if (!showAnim || !duration) { postProcess(); }
+ if (inst.input.is(':visible') && !inst.input.is(':disabled')) { inst.input.focus(); }
+ $.timepicker._curInst = inst;
+ }
+ },
+
+ // This is a copy of the zIndex function of UI core 1.8.??
+ // Copied in the timepicker to stay backward compatible.
+ _getZIndex: function (target) {
+ var elem = $( target ), position, value;
+ while ( elem.length && elem[ 0 ] !== document ) {
+ position = elem.css( "position" );
+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+ value = parseInt( elem.css( "zIndex" ), 10 );
+ if ( !isNaN( value ) && value !== 0 ) {
+ return value;
+ }
+ }
+ elem = elem.parent();
+ }
+ },
+
+ /* Generate the time picker content. */
+ _updateTimepicker: function (inst) {
+ inst.tpDiv.empty().append(this._generateHTML(inst));
+ this._rebindDialogEvents(inst);
+
+ },
+
+ _rebindDialogEvents: function (inst) {
+ var borders = $.timepicker._getBorders(inst.tpDiv),
+ self = this;
+ inst.tpDiv
+ .find('iframe.ui-timepicker-cover') // IE6- only
+ .css({ left: -borders[0], top: -borders[1],
+ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
+ })
+ .end()
+ // after the picker html is appended bind the click & double click events (faster in IE this way
+ // then letting the browser interpret the inline events)
+ // the binding for the minute cells also exists in _updateMinuteDisplay
+ .find('.ui-timepicker-minute-cell')
+ .unbind()
+ .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
+ .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this))
+ .end()
+ .find('.ui-timepicker-hour-cell')
+ .unbind()
+ .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectHours, this))
+ .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectHours, this))
+ .end()
+ .find('.ui-timepicker td a')
+ .unbind()
+ .bind('mouseout', function () {
+ $(this).removeClass('ui-state-hover');
+ if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).removeClass('ui-timepicker-prev-hover');
+ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).removeClass('ui-timepicker-next-hover');
+ })
+ .bind('mouseover', function () {
+ if ( ! self._isDisabledTimepicker(inst.inline ? inst.tpDiv.parent()[0] : inst.input[0])) {
+ $(this).parents('.ui-timepicker-calendar').find('a').removeClass('ui-state-hover');
+ $(this).addClass('ui-state-hover');
+ if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).addClass('ui-timepicker-prev-hover');
+ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-timepicker-next-hover');
+ }
+ })
+ .end()
+ .find('.' + this._dayOverClass + ' a')
+ .trigger('mouseover')
+ .end()
+ .find('.ui-timepicker-now').bind("click",function(e) {
+ $.timepicker.selectNow(e);
+ }).end()
+ .find('.ui-timepicker-deselect').bind("click",function(e) {
+ $.timepicker.deselectTime(e);
+ }).end()
+ .find('.ui-timepicker-close').bind("click",function(e) {
+ $.timepicker._hideTimepicker();
+ }).end();
+ },
+
+ /* Generate the HTML for the current state of the time picker. */
+ _generateHTML: function (inst) {
+
+ var h, m, row, col, html, hoursHtml, minutesHtml = '',
+ showPeriod = (this._get(inst, 'showPeriod') == true),
+ showPeriodLabels = (this._get(inst, 'showPeriodLabels') == true),
+ showLeadingZero = (this._get(inst, 'showLeadingZero') == true),
+ showHours = (this._get(inst, 'showHours') == true),
+ showMinutes = (this._get(inst, 'showMinutes') == true),
+ amPmText = this._get(inst, 'amPmText'),
+ rows = this._get(inst, 'rows'),
+ amRows = 0,
+ pmRows = 0,
+ amItems = 0,
+ pmItems = 0,
+ amFirstRow = 0,
+ pmFirstRow = 0,
+ hours = Array(),
+ hours_options = this._get(inst, 'hours'),
+ hoursPerRow = null,
+ hourCounter = 0,
+ hourLabel = this._get(inst, 'hourText'),
+ showCloseButton = this._get(inst, 'showCloseButton'),
+ closeButtonText = this._get(inst, 'closeButtonText'),
+ showNowButton = this._get(inst, 'showNowButton'),
+ nowButtonText = this._get(inst, 'nowButtonText'),
+ showDeselectButton = this._get(inst, 'showDeselectButton'),
+ deselectButtonText = this._get(inst, 'deselectButtonText'),
+ showButtonPanel = showCloseButton || showNowButton || showDeselectButton;
+
+
+
+ // prepare all hours and minutes, makes it easier to distribute by rows
+ for (h = hours_options.starts; h <= hours_options.ends; h++) {
+ hours.push (h);
+ }
+ hoursPerRow = Math.ceil(hours.length / rows); // always round up
+
+ if (showPeriodLabels) {
+ for (hourCounter = 0; hourCounter < hours.length; hourCounter++) {
+ if (hours[hourCounter] < 12) {
+ amItems++;
+ }
+ else {
+ pmItems++;
+ }
+ }
+ hourCounter = 0;
+
+ amRows = Math.floor(amItems / hours.length * rows);
+ pmRows = Math.floor(pmItems / hours.length * rows);
+
+ // assign the extra row to the period that is more densly populated
+ if (rows != amRows + pmRows) {
+ // Make sure: AM Has Items and either PM Does Not, AM has no rows yet, or AM is more dense
+ if (amItems && (!pmItems || !amRows || (pmRows && amItems / amRows >= pmItems / pmRows))) {
+ amRows++;
+ } else {
+ pmRows++;
+ }
+ }
+ amFirstRow = Math.min(amRows, 1);
+ pmFirstRow = amRows + 1;
+ hoursPerRow = Math.ceil(Math.max(amItems / amRows, pmItems / pmRows));
+ }
+
+
+ html = '<table class="ui-timepicker-table ui-widget-content ui-corner-all"><tr>';
+
+ if (showHours) {
+
+ html += '<td class="ui-timepicker-hours">' +
+ '<div class="ui-timepicker-title ui-widget-header ui-helper-clearfix ui-corner-all">' +
+ hourLabel +
+ '</div>' +
+ '<table class="ui-timepicker">';
+
+ for (row = 1; row <= rows; row++) {
+ html += '<tr>';
+ // AM
+ if (row == amFirstRow && showPeriodLabels) {
+ html += '<th rowspan="' + amRows.toString() + '" class="periods" scope="row">' + amPmText[0] + '</th>';
+ }
+ // PM
+ if (row == pmFirstRow && showPeriodLabels) {
+ html += '<th rowspan="' + pmRows.toString() + '" class="periods" scope="row">' + amPmText[1] + '</th>';
+ }
+ for (col = 1; col <= hoursPerRow; col++) {
+ if (showPeriodLabels && row < pmFirstRow && hours[hourCounter] >= 12) {
+ html += this._generateHTMLHourCell(inst, undefined, showPeriod, showLeadingZero);
+ } else {
+ html += this._generateHTMLHourCell(inst, hours[hourCounter], showPeriod, showLeadingZero);
+ hourCounter++;
+ }
+ }
+ html += '</tr>';
+ }
+ html += '</tr></table>' + // Close the hours cells table
+ '</td>'; // Close the Hour td
+ }
+
+ if (showMinutes) {
+ html += '<td class="ui-timepicker-minutes">';
+ html += this._generateHTMLMinutes(inst);
+ html += '</td>';
+ }
+
+ html += '</tr>';
+
+
+ if (showButtonPanel) {
+ var buttonPanel = '<tr><td colspan="3"><div class="ui-timepicker-buttonpane ui-widget-content">';
+ if (showNowButton) {
+ buttonPanel += '<button type="button" class="ui-timepicker-now ui-state-default ui-corner-all" '
+ + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
+ + nowButtonText + '</button>';
+ }
+ if (showDeselectButton) {
+ buttonPanel += '<button type="button" class="ui-timepicker-deselect ui-state-default ui-corner-all" '
+ + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
+ + deselectButtonText + '</button>';
+ }
+ if (showCloseButton) {
+ buttonPanel += '<button type="button" class="ui-timepicker-close ui-state-default ui-corner-all" '
+ + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
+ + closeButtonText + '</button>';
+ }
+
+ html += buttonPanel + '</div></td></tr>';
+ }
+ html += '</table>';
+
+ /* IE6 IFRAME FIX (taken from datepicker 1.5.3, fixed in 0.1.2 */
+ html += ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+ '<iframe src="javascript:false;" class="ui-timepicker-cover" frameborder="0"></iframe>' : '');
+
+ return html;
+ },
+
+ /* Special function that update the minutes selection in currently visible timepicker
+ * called on hour selection when onMinuteShow is defined */
+ _updateMinuteDisplay: function (inst) {
+ var newHtml = this._generateHTMLMinutes(inst);
+ inst.tpDiv.find('td.ui-timepicker-minutes').html(newHtml);
+ this._rebindDialogEvents(inst);
+ // after the picker html is appended bind the click & double click events (faster in IE this way
+ // then letting the browser interpret the inline events)
+ // yes I know, duplicate code, sorry
+/* .find('.ui-timepicker-minute-cell')
+ .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
+ .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this));
+*/
+
+ },
+
+ /*
+ * Generate the minutes table
+ * This is separated from the _generateHTML function because is can be called separately (when hours changes)
+ */
+ _generateHTMLMinutes: function (inst) {
+
+ var m, row, html = '',
+ rows = this._get(inst, 'rows'),
+ minutes = Array(),
+ minutes_options = this._get(inst, 'minutes'),
+ minutesPerRow = null,
+ minuteCounter = 0,
+ showMinutesLeadingZero = (this._get(inst, 'showMinutesLeadingZero') == true),
+ onMinuteShow = this._get(inst, 'onMinuteShow'),
+ minuteLabel = this._get(inst, 'minuteText');
+
+ if ( ! minutes_options.starts) {
+ minutes_options.starts = 0;
+ }
+ if ( ! minutes_options.ends) {
+ minutes_options.ends = 59;
+ }
+ for (m = minutes_options.starts; m <= minutes_options.ends; m += minutes_options.interval) {
+ minutes.push(m);
+ }
+ minutesPerRow = Math.round(minutes.length / rows + 0.49); // always round up
+
+ /*
+ * The minutes table
+ */
+ // if currently selected minute is not enabled, we have a problem and need to select a new minute.
+ if (onMinuteShow &&
+ (onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours , inst.minutes]) == false) ) {
+ // loop minutes and select first available
+ for (minuteCounter = 0; minuteCounter < minutes.length; minuteCounter += 1) {
+ m = minutes[minuteCounter];
+ if (onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours, m])) {
+ inst.minutes = m;
+ break;
+ }
+ }
+ }
+
+
+
+ html += '<div class="ui-timepicker-title ui-widget-header ui-helper-clearfix ui-corner-all">' +
+ minuteLabel +
+ '</div>' +
+ '<table class="ui-timepicker">';
+
+ minuteCounter = 0;
+ for (row = 1; row <= rows; row++) {
+ html += '<tr>';
+ while (minuteCounter < row * minutesPerRow) {
+ var m = minutes[minuteCounter];
+ var displayText = '';
+ if (m !== undefined ) {
+ displayText = (m < 10) && showMinutesLeadingZero ? "0" + m.toString() : m.toString();
+ }
+ html += this._generateHTMLMinuteCell(inst, m, displayText);
+ minuteCounter++;
+ }
+ html += '</tr>';
+ }
+
+ html += '</table>';
+
+ return html;
+ },
+
+ /* Generate the content of a "Hour" cell */
+ _generateHTMLHourCell: function (inst, hour, showPeriod, showLeadingZero) {
+
+ var displayHour = hour;
+ if ((hour > 12) && showPeriod) {
+ displayHour = hour - 12;
+ }
+ if ((displayHour == 0) && showPeriod) {
+ displayHour = 12;
+ }
+ if ((displayHour < 10) && showLeadingZero) {
+ displayHour = '0' + displayHour;
+ }
+
+ var html = "";
+ var enabled = true;
+ var onHourShow = this._get(inst, 'onHourShow'); //custom callback
+
+ if (hour == undefined) {
+ html = '<td><span class="ui-state-default ui-state-disabled">&nbsp;</span></td>';
+ return html;
+ }
+
+ if (onHourShow) {
+ enabled = onHourShow.apply((inst.input ? inst.input[0] : null), [hour]);
+ }
+
+ if (enabled) {
+ html = '<td class="ui-timepicker-hour-cell" data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" data-hour="' + hour.toString() + '">' +
+ '<a class="ui-state-default ' +
+ (hour == inst.hours ? 'ui-state-active' : '') +
+ '">' +
+ displayHour.toString() +
+ '</a></td>';
+ }
+ else {
+ html =
+ '<td>' +
+ '<span class="ui-state-default ui-state-disabled ' +
+ (hour == inst.hours ? ' ui-state-active ' : ' ') +
+ '">' +
+ displayHour.toString() +
+ '</span>' +
+ '</td>';
+ }
+ return html;
+ },
+
+ /* Generate the content of a "Hour" cell */
+ _generateHTMLMinuteCell: function (inst, minute, displayText) {
+ var html = "";
+ var enabled = true;
+ var onMinuteShow = this._get(inst, 'onMinuteShow'); //custom callback
+ if (onMinuteShow) {
+ //NEW: 2011-02-03 we should give the hour as a parameter as well!
+ enabled = onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours,minute]); //trigger callback
+ }
+
+ if (minute == undefined) {
+ html = '<td><span class="ui-state-default ui-state-disabled">&nbsp;</span></td>';
+ return html;
+ }
+
+ if (enabled) {
+ html = '<td class="ui-timepicker-minute-cell" data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" data-minute="' + minute.toString() + '" >' +
+ '<a class="ui-state-default ' +
+ (minute == inst.minutes ? 'ui-state-active' : '') +
+ '" >' +
+ displayText +
+ '</a></td>';
+ }
+ else {
+
+ html = '<td>' +
+ '<span class="ui-state-default ui-state-disabled" >' +
+ displayText +
+ '</span>' +
+ '</td>';
+ }
+ return html;
+ },
+
+
+ /* Enable the date picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _enableTimepicker: function(target) {
+ var $target = $(target),
+ target_id = $target.attr('id'),
+ inst = $.data(target, PROP_NAME);
+
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = false;
+ inst.trigger.filter('button').
+ each(function() { this.disabled = false; }).end();
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().removeClass('ui-state-disabled');
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target_id ? null : value); }); // delete entry
+ },
+
+ /* Disable the time picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _disableTimepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = true;
+
+ inst.trigger.filter('button').
+ each(function() { this.disabled = true; }).end();
+
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().addClass('ui-state-disabled');
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target ? null : value); }); // delete entry
+ this._disabledInputs[this._disabledInputs.length] = $target.attr('id');
+ },
+
+ /* Is the first field in a jQuery collection disabled as a timepicker?
+ @param target_id element - the target input field or division or span
+ @return boolean - true if disabled, false if enabled */
+ _isDisabledTimepicker: function (target_id) {
+ if ( ! target_id) { return false; }
+ for (var i = 0; i < this._disabledInputs.length; i++) {
+ if (this._disabledInputs[i] == target_id) { return true; }
+ }
+ return false;
+ },
+
+ /* Check positioning to remain on screen. */
+ _checkOffset: function (inst, offset, isFixed) {
+ var tpWidth = inst.tpDiv.outerWidth();
+ var tpHeight = inst.tpDiv.outerHeight();
+ var inputWidth = inst.input ? inst.input.outerWidth() : 0;
+ var inputHeight = inst.input ? inst.input.outerHeight() : 0;
+ var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
+ var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
+
+ offset.left -= (this._get(inst, 'isRTL') ? (tpWidth - inputWidth) : 0);
+ offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
+ offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
+
+ // now check if datepicker is showing outside window viewport - move to a better place if so.
+ offset.left -= Math.min(offset.left, (offset.left + tpWidth > viewWidth && viewWidth > tpWidth) ?
+ Math.abs(offset.left + tpWidth - viewWidth) : 0);
+ offset.top -= Math.min(offset.top, (offset.top + tpHeight > viewHeight && viewHeight > tpHeight) ?
+ Math.abs(tpHeight + inputHeight) : 0);
+
+ return offset;
+ },
+
+ /* Find an object's position on the screen. */
+ _findPos: function (obj) {
+ var inst = this._getInst(obj);
+ var isRTL = this._get(inst, 'isRTL');
+ while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
+ obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+ }
+ var position = $(obj).offset();
+ return [position.left, position.top];
+ },
+
+ /* Retrieve the size of left and top borders for an element.
+ @param elem (jQuery object) the element of interest
+ @return (number[2]) the left and top borders */
+ _getBorders: function (elem) {
+ var convert = function (value) {
+ return { thin: 1, medium: 2, thick: 3}[value] || value;
+ };
+ return [parseFloat(convert(elem.css('border-left-width'))),
+ parseFloat(convert(elem.css('border-top-width')))];
+ },
+
+
+ /* Close time picker if clicked elsewhere. */
+ _checkExternalClick: function (event) {
+ if (!$.timepicker._curInst) { return; }
+ var $target = $(event.target);
+ if ($target[0].id != $.timepicker._mainDivId &&
+ $target.parents('#' + $.timepicker._mainDivId).length == 0 &&
+ !$target.hasClass($.timepicker.markerClassName) &&
+ !$target.hasClass($.timepicker._triggerClass) &&
+ $.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
+ $.timepicker._hideTimepicker();
+ },
+
+ /* Hide the time picker from view.
+ @param input element - the input field attached to the time picker */
+ _hideTimepicker: function (input) {
+ var inst = this._curInst;
+ if (!inst || (input && inst != $.data(input, PROP_NAME))) { return; }
+ if (this._timepickerShowing) {
+ var showAnim = this._get(inst, 'showAnim');
+ var duration = this._get(inst, 'duration');
+ var postProcess = function () {
+ $.timepicker._tidyDialog(inst);
+ this._curInst = null;
+ };
+ if ($.effects && $.effects[showAnim]) {
+ inst.tpDiv.hide(showAnim, $.timepicker._get(inst, 'showOptions'), duration, postProcess);
+ }
+ else {
+ inst.tpDiv[(showAnim == 'slideDown' ? 'slideUp' :
+ (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
+ }
+ if (!showAnim) { postProcess(); }
+ var onClose = this._get(inst, 'onClose');
+ if (onClose) {
+ onClose.apply(
+ (inst.input ? inst.input[0] : null),
+ [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback
+ }
+ this._timepickerShowing = false;
+ this._lastInput = null;
+ if (this._inDialog) {
+ this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
+ if ($.blockUI) {
+ $.unblockUI();
+ $('body').append(this.tpDiv);
+ }
+ }
+ this._inDialog = false;
+ }
+ },
+
+
+
+ /* Tidy up after a dialog display. */
+ _tidyDialog: function (inst) {
+ inst.tpDiv.removeClass(this._dialogClass).unbind('.ui-timepicker');
+ },
+
+ /* Retrieve the instance data for the target control.
+ @param target element - the target input field or division or span
+ @return object - the associated instance data
+ @throws error if a jQuery problem getting data */
+ _getInst: function (target) {
+ try {
+ return $.data(target, PROP_NAME);
+ }
+ catch (err) {
+ throw 'Missing instance data for this timepicker';
+ }
+ },
+
+ /* Get a setting value, defaulting if necessary. */
+ _get: function (inst, name) {
+ return inst.settings[name] !== undefined ?
+ inst.settings[name] : this._defaults[name];
+ },
+
+ /* Parse existing time and initialise time picker. */
+ _setTimeFromField: function (inst) {
+ if (inst.input.val() == inst.lastVal) { return; }
+ var defaultTime = this._get(inst, 'defaultTime');
+
+ var timeToParse = defaultTime == 'now' ? this._getCurrentTimeRounded(inst) : defaultTime;
+ if ((inst.inline == false) && (inst.input.val() != '')) { timeToParse = inst.input.val() }
+
+ if (timeToParse instanceof Date) {
+ inst.hours = timeToParse.getHours();
+ inst.minutes = timeToParse.getMinutes();
+ } else {
+ var timeVal = inst.lastVal = timeToParse;
+ if (timeToParse == '') {
+ inst.hours = -1;
+ inst.minutes = -1;
+ } else {
+ var time = this.parseTime(inst, timeVal);
+ inst.hours = time.hours;
+ inst.minutes = time.minutes;
+ }
+ }
+
+
+ $.timepicker._updateTimepicker(inst);
+ },
+
+ /* Update or retrieve the settings for an existing time picker.
+ @param target element - the target input field or division or span
+ @param name object - the new settings to update or
+ string - the name of the setting to change or retrieve,
+ when retrieving also 'all' for all instance settings or
+ 'defaults' for all global defaults
+ @param value any - the new value for the setting
+ (omit if above is an object or to retrieve a value) */
+ _optionTimepicker: function(target, name, value) {
+ var inst = this._getInst(target);
+ if (arguments.length == 2 && typeof name == 'string') {
+ return (name == 'defaults' ? $.extend({}, $.timepicker._defaults) :
+ (inst ? (name == 'all' ? $.extend({}, inst.settings) :
+ this._get(inst, name)) : null));
+ }
+ var settings = name || {};
+ if (typeof name == 'string') {
+ settings = {};
+ settings[name] = value;
+ }
+ if (inst) {
+ if (this._curInst == inst) {
+ this._hideTimepicker();
+ }
+ extendRemove(inst.settings, settings);
+ this._updateTimepicker(inst);
+ }
+ },
+
+
+ /* Set the time for a jQuery selection.
+ @param target element - the target input field or division or span
+ @param time String - the new time */
+ _setTimeTimepicker: function(target, time) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._setTime(inst, time);
+ this._updateTimepicker(inst);
+ this._updateAlternate(inst, time);
+ }
+ },
+
+ /* Set the time directly. */
+ _setTime: function(inst, time, noChange) {
+ var origHours = inst.hours;
+ var origMinutes = inst.minutes;
+ var time = this.parseTime(inst, time);
+ inst.hours = time.hours;
+ inst.minutes = time.minutes;
+
+ if ((origHours != inst.hours || origMinutes != inst.minuts) && !noChange) {
+ inst.input.trigger('change');
+ }
+ this._updateTimepicker(inst);
+ this._updateSelectedValue(inst);
+ },
+
+ /* Return the current time, ready to be parsed, rounded to the closest 5 minute */
+ _getCurrentTimeRounded: function (inst) {
+ var currentTime = new Date(),
+ currentMinutes = currentTime.getMinutes(),
+ // round to closest 5
+ adjustedMinutes = Math.round( currentMinutes / 5 ) * 5;
+ currentTime.setMinutes(adjustedMinutes);
+ return currentTime;
+ },
+
+ /*
+ * Parse a time string into hours and minutes
+ */
+ parseTime: function (inst, timeVal) {
+ var retVal = new Object();
+ retVal.hours = -1;
+ retVal.minutes = -1;
+
+ var timeSeparator = this._get(inst, 'timeSeparator'),
+ amPmText = this._get(inst, 'amPmText'),
+ showHours = this._get(inst, 'showHours'),
+ showMinutes = this._get(inst, 'showMinutes'),
+ optionalMinutes = this._get(inst, 'optionalMinutes'),
+ showPeriod = (this._get(inst, 'showPeriod') == true),
+ p = timeVal.indexOf(timeSeparator);
+
+ // check if time separator found
+ if (p != -1) {
+ retVal.hours = parseInt(timeVal.substr(0, p), 10);
+ retVal.minutes = parseInt(timeVal.substr(p + 1), 10);
+ }
+ // check for hours only
+ else if ( (showHours) && ( !showMinutes || optionalMinutes ) ) {
+ retVal.hours = parseInt(timeVal, 10);
+ }
+ // check for minutes only
+ else if ( ( ! showHours) && (showMinutes) ) {
+ retVal.minutes = parseInt(timeVal, 10);
+ }
+
+ if (showHours) {
+ var timeValUpper = timeVal.toUpperCase();
+ if ((retVal.hours < 12) && (showPeriod) && (timeValUpper.indexOf(amPmText[1].toUpperCase()) != -1)) {
+ retVal.hours += 12;
+ }
+ // fix for 12 AM
+ if ((retVal.hours == 12) && (showPeriod) && (timeValUpper.indexOf(amPmText[0].toUpperCase()) != -1)) {
+ retVal.hours = 0;
+ }
+ }
+
+ return retVal;
+ },
+
+ selectNow: function(e) {
+
+ var id = $(e.target).attr("data-timepicker-instance-id"),
+ $target = $(id),
+ inst = this._getInst($target[0]);
+
+ //if (!inst || (input && inst != $.data(input, PROP_NAME))) { return; }
+ var currentTime = new Date();
+ inst.hours = currentTime.getHours();
+ inst.minutes = currentTime.getMinutes();
+ this._updateSelectedValue(inst);
+ this._updateTimepicker(inst);
+ this._hideTimepicker();
+ },
+
+ deselectTime: function(e) {
+ var id = $(e.target).attr("data-timepicker-instance-id"),
+ $target = $(id),
+ inst = this._getInst($target[0]);
+ inst.hours = -1;
+ inst.minutes = -1;
+ this._updateSelectedValue(inst);
+ this._hideTimepicker();
+ },
+
+
+ selectHours: function (event) {
+ var $td = $(event.currentTarget),
+ id = $td.attr("data-timepicker-instance-id"),
+ newHours = $td.attr("data-hour"),
+ fromDoubleClick = event.data.fromDoubleClick,
+ $target = $(id),
+ inst = this._getInst($target[0]),
+ showMinutes = (this._get(inst, 'showMinutes') == true);
+
+ // don't select if disabled
+ if ( $.timepicker._isDisabledTimepicker($target.attr('id')) ) { return false }
+
+ $td.parents('.ui-timepicker-hours:first').find('a').removeClass('ui-state-active');
+ $td.children('a').addClass('ui-state-active');
+ inst.hours = newHours;
+
+ // added for onMinuteShow callback
+ var onMinuteShow = this._get(inst, 'onMinuteShow');
+ if (onMinuteShow) {
+ // this will trigger a callback on selected hour to make sure selected minute is allowed.
+ this._updateMinuteDisplay(inst);
+ }
+
+ this._updateSelectedValue(inst);
+
+ inst._hoursClicked = true;
+ if ((inst._minutesClicked) || (fromDoubleClick) || (showMinutes == false)) {
+ $.timepicker._hideTimepicker();
+ }
+ // return false because if used inline, prevent the url to change to a hashtag
+ return false;
+ },
+
+ selectMinutes: function (event) {
+ var $td = $(event.currentTarget),
+ id = $td.attr("data-timepicker-instance-id"),
+ newMinutes = $td.attr("data-minute"),
+ fromDoubleClick = event.data.fromDoubleClick,
+ $target = $(id),
+ inst = this._getInst($target[0]),
+ showHours = (this._get(inst, 'showHours') == true);
+
+ // don't select if disabled
+ if ( $.timepicker._isDisabledTimepicker($target.attr('id')) ) { return false }
+
+ $td.parents('.ui-timepicker-minutes:first').find('a').removeClass('ui-state-active');
+ $td.children('a').addClass('ui-state-active');
+
+ inst.minutes = newMinutes;
+ this._updateSelectedValue(inst);
+
+ inst._minutesClicked = true;
+ if ((inst._hoursClicked) || (fromDoubleClick) || (showHours == false)) {
+ $.timepicker._hideTimepicker();
+ // return false because if used inline, prevent the url to change to a hashtag
+ return false;
+ }
+
+ // return false because if used inline, prevent the url to change to a hashtag
+ return false;
+ },
+
+ _updateSelectedValue: function (inst) {
+ var newTime = this._getParsedTime(inst);
+ if (inst.input) {
+ inst.input.val(newTime);
+ inst.input.trigger('change');
+ }
+ var onSelect = this._get(inst, 'onSelect');
+ if (onSelect) { onSelect.apply((inst.input ? inst.input[0] : null), [newTime, inst]); } // trigger custom callback
+ this._updateAlternate(inst, newTime);
+ return newTime;
+ },
+
+ /* this function process selected time and return it parsed according to instance options */
+ _getParsedTime: function(inst) {
+
+ if (inst.hours == -1 && inst.minutes == -1) {
+ return '';
+ }
+
+ if ((inst.hours < 0) || (inst.hours > 23)) { inst.hours = 12; }
+ if ((inst.minutes < 0) || (inst.minutes > 59)) { inst.minutes = 0; }
+
+ var period = "",
+ showPeriod = (this._get(inst, 'showPeriod') == true),
+ showLeadingZero = (this._get(inst, 'showLeadingZero') == true),
+ showHours = (this._get(inst, 'showHours') == true),
+ showMinutes = (this._get(inst, 'showMinutes') == true),
+ optionalMinutes = (this._get(inst, 'optionalMinutes') == true),
+ amPmText = this._get(inst, 'amPmText'),
+ selectedHours = inst.hours ? inst.hours : 0,
+ selectedMinutes = inst.minutes ? inst.minutes : 0,
+ displayHours = selectedHours ? selectedHours : 0,
+ parsedTime = '';
+
+ if (showPeriod) {
+ if (inst.hours == 0) {
+ displayHours = 12;
+ }
+ if (inst.hours < 12) {
+ period = amPmText[0];
+ }
+ else {
+ period = amPmText[1];
+ if (displayHours > 12) {
+ displayHours -= 12;
+ }
+ }
+ }
+
+ var h = displayHours.toString();
+ if (showLeadingZero && (displayHours < 10)) { h = '0' + h; }
+
+ var m = selectedMinutes.toString();
+ if (selectedMinutes < 10) { m = '0' + m; }
+
+ if (showHours) {
+ parsedTime += h;
+ }
+ if (showHours && showMinutes && (!optionalMinutes || m != 0)) {
+ parsedTime += this._get(inst, 'timeSeparator');
+ }
+ if (showMinutes && (!optionalMinutes || m != 0)) {
+ parsedTime += m;
+ }
+ if (showHours) {
+ if (period.length > 0) { parsedTime += this._get(inst, 'periodSeparator') + period; }
+ }
+
+ return parsedTime;
+ },
+
+ /* Update any alternate field to synchronise with the main field. */
+ _updateAlternate: function(inst, newTime) {
+ var altField = this._get(inst, 'altField');
+ if (altField) { // update alternate field too
+ $(altField).each(function(i,e) {
+ $(e).val(newTime);
+ });
+ }
+ },
+
+ /* This might look unused but it's called by the $.fn.timepicker function with param getTime */
+ /* added v 0.2.3 - gitHub issue #5 - Thanks edanuff */
+ _getTimeTimepicker : function(input) {
+ var inst = this._getInst(input);
+ return this._getParsedTime(inst);
+ },
+ _getHourTimepicker: function(input) {
+ var inst = this._getInst(input);
+ if ( inst == undefined) { return -1; }
+ return inst.hours;
+ },
+ _getMinuteTimepicker: function(input) {
+ var inst= this._getInst(input);
+ if ( inst == undefined) { return -1; }
+ return inst.minutes;
+ }
+
+ });
+
+
+
+ /* Invoke the timepicker functionality.
+ @param options string - a command, optionally followed by additional parameters or
+ Object - settings for attaching new timepicker functionality
+ @return jQuery object */
+ $.fn.timepicker = function (options) {
+
+ /* Initialise the time picker. */
+ if (!$.timepicker.initialized) {
+ $(document).mousedown($.timepicker._checkExternalClick).
+ find('body').append($.timepicker.tpDiv);
+ $.timepicker.initialized = true;
+ }
+
+ var otherArgs = Array.prototype.slice.call(arguments, 1);
+ if (typeof options == 'string' && (options == 'getTime' || options == 'getHour' || options == 'getMinute' ))
+ return $.timepicker['_' + options + 'Timepicker'].
+ apply($.timepicker, [this[0]].concat(otherArgs));
+ if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
+ return $.timepicker['_' + options + 'Timepicker'].
+ apply($.timepicker, [this[0]].concat(otherArgs));
+ return this.each(function () {
+ typeof options == 'string' ?
+ $.timepicker['_' + options + 'Timepicker'].
+ apply($.timepicker, [this].concat(otherArgs)) :
+ $.timepicker._attachTimepicker(this, options);
+ });
+ };
+
+ /* jQuery extend now ignores nulls! */
+ function extendRemove(target, props) {
+ $.extend(target, props);
+ for (var name in props)
+ if (props[name] == null || props[name] == undefined)
+ target[name] = props[name];
+ return target;
+ };
+
+ $.timepicker = new Timepicker(); // singleton instance
+ $.timepicker.initialized = false;
+ $.timepicker.uuid = new Date().getTime();
+ $.timepicker.version = "0.2.9";
+
+ // Workaround for #4055
+ // Add another global to avoid noConflict issues with inline event handlers
+ window['TP_jQuery_' + tpuuid] = $;
+
+})(jQuery);
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/releases.txt b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/releases.txt
new file mode 100644
index 0000000..64622d4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui-timepicker-0.2.9/releases.txt
@@ -0,0 +1,105 @@
+Release 0.2.9 - November 13, 2011
+Fixed the zIndex problem and removed the zIndex option (Thanks everyone who reported the problem)
+Fix a bug where repeatedly clicking on hour cells made the timepicker very slow.
+Added Italian translation, thanks to Serge Margarita.
+
+Release 0.2.8 - November 5, 2011
+Updated "defaultTime" to allow for Date object (github issue #26)
+Fixed the now and deselect buttons in IE
+
+Release 0.2.7 - October 19, 2011
+Added option to omit minutes in parsed time when user select 0 for minutes. (Thanks tribalvibes, Github issue #23)
+Added support for internationalisation (fr, de and ja, Thanks Bernd Plagge).
+
+Release 0.2.6 - October 12, 2011
+Fixed a bug when input ID have more then one special char. (Thamks Jacqueline Krijnen)
+Fixed a bug when parsing hours only or minutes only time. (Thanks protron, <a href="https://github.com/fgelinas/timepicker/issues/20">github issue #20</a>)
+Added 'Now', 'Deselect' and 'Close' buttons. (Thanks Christian Grobmeier for the close button code, <a href="https://github.com/fgelinas/timepicker/issues/20">github issue #22</a>)
+
+Release 0.2.5 - September 13, 2011
+Added support for disable and enable. (Suggested by danielrex, github issue #17)
+Added an example for 2 timepicker to behave as a period selector (start time and end time). (Thanks Bill Pellowe)
+Renamed the stylesheet to jquery.ui.timepicker.css to be more consistent with jQuery UI file name convention.
+
+Release 0.2.4 - August 5, 2011
+Fixed the hand cursor in the css file. (Thanks Mike Neumegen)
+Added position option to use with the jquery ui position utility.
+Added option to display only hours or only minutes.
+
+Release 0.2.3 - July 11, 2011
+Fix github issue #3 : Bug when hours or minutes choices does not divide by number of rows (thanks wukimus)
+Changed default behavior of the defaultTime option, if set to '' and input is empty, there will be no highlighted time in the popup (Thanks Rasmus Schultz)
+Fix github issue #4 : Error when generating empty minute cell. (Thanks 123Haynes)
+Fix github issue #5 : Add functionality for "getTime" option. (Thanks edanuff)
+Added the periodSeparator option. (thanks jrchamp)
+Fixed "getTime" for inline timepickers. (thanks Mike Neumegen)
+Added "getHour" and "getMinute" to get individual values.
+
+Release 0.2.2 - June 16, 2011
+Fixed a "console.log" line that I forgot to remove before release 0.2.1
+
+Release 0.2.1 - June 12, 2011
+Timepicker does not give the focus back to the input any more after time selection. This is similar to the datepicker behaviour and is more natural to the user because it shows the dialog again when the user click on the input again, as expected.
+Added options to customize the hours and minutes ranges and interval for more customization.
+
+Release 0.2 - May 28, 2011
+So in the previous release I mixed up versions and lost some changes, I guess that's what happen when you drink and code.
+
+Release 0.1.2 - May 26, 2011
+Fixed a bug with inline timepickers that would append a #timepickr hashtag when selecting hours and minutes.
+Fixed z-index problem with IE6 (Thanks Graham Bentley)
+Added selection of highlighted text when enter is pressed on the input field (Thanks Glen Chiacchieri)
+Adjusted some focus problems, now the input gets the focus back when the used click on hours / minutes.
+
+Release 0.1.something aka the lost release - around April 11
+Fixed a bug for when input Id had a dot in it, it was getting double escaped when it should not. (Thanks Zdenek Machac)
+So in 0.1.1 I created a bug that made timepicker changes the location hash, well now it's fixed. (Thanks Lucas Falk)
+
+Release 0.1.1 - April 6, 2011
+Changed the cells click and dblclick binding for faster rendering in IE6/7 (Thanks Blair Parsons)
+Fixed a class naming bug created in 0.1.0 (Thanks Morlion Peter)
+
+Release 0.1.0 - March 23, 2011
+Fixed some bugs with release 0.0.9
+
+Release 0.0.9 - March 22, 2011
+Added zIndex option (Thanks Frank Enderle)
+Added option showPeriodLabels that defines if the AM/PM labels are displayed on the left (Thanks Frank Enderle)
+Added showOn ['focus'|'button'|'both'] and button options for alternate trigger method
+
+Release 0.0.8 - Fev 17, 2011
+Fixed close event not triggered when switching to another input with time picker (thanks Stuart Gregg)
+
+Release 0.0.7 - Fev 10, 2011
+Added function to set time after initialisation :$('#timepicker').timepicker('setTime',newTime);
+Added support for disabled period of time : onHourShow and onMinuteShow (thanks Rene Felgentr�ger)
+
+Release 0.0.6 - Jan 19, 2011
+Added standard "change" event being triggered on the input when the content changes. (Thanks Rasmus Schultz)
+Added support for inline timePicker, attached to div or span
+Added altField that receive the parsed time value when selected time changes
+Added defaultTime value to use when input field is missing (inline) or input value is empty
+ if defaultTime is missing, current time is used
+
+Release 0.0.5 - Jan 18, 2011
+Now updating time picker selected value when manually typing in the text field (thanks Rasmus Schultz)
+Fixed : with showPeriod: true and showLeadingZero: true, PM hours did not show leading zeros (thanks Chandler May)
+Fixed : with showPeriod: true and showLeadingZero: true, Selecting 12 AM shows as 00 AM in the input field, also parsing 12AM did not work correctly (thanks Rasmus Schultz)
+
+Release 0.0.4 - jan 10, 2011
+changed showLeadingZero to affect only hours, added showMinutesLeadingZero for minutes display
+Removed width:100% for tables in css
+
+Release 0.0.3 - Jan 8, 2011
+Re-added a display:none on the main div (fix a small empty div visible at the bottom of the page before timepicker is called) (Thanks Gertjan van Roekel)
+Fixed a problem where the timepicker was never displayed with jquery ui 1.8.7 css,
+ the problem was the class ui-helper-hidden-accessible, witch I removed.
+ Thanks Alexander Fietz and StackOverflow : http://stackoverflow.com/questions/4522274/jquery-timepicker-and-jqueryui-1-8-7-conflict
+
+Release 0.0.2 - Jan 6, 2011
+Updated to include common display options for USA users
+Stephen Commisso - Jan 2011
+
+As it is a timepicker, I inspired most of the code from the datepicker
+Francois Gelinas - Nov 2010
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui.js
new file mode 100644
index 0000000..cd515f3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery-ui.js
@@ -0,0 +1,11767 @@
+/*!
+ * jQuery UI 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function( $, undefined ) {
+
+// prevent duplicate loading
+// this is only a problem because we proxy existing functions
+// and we don't want to double proxy them
+$.ui = $.ui || {};
+if ( $.ui.version ) {
+ return;
+}
+
+$.extend( $.ui, {
+ version: "1.8.16",
+
+ keyCode: {
+ ALT: 18,
+ BACKSPACE: 8,
+ CAPS_LOCK: 20,
+ COMMA: 188,
+ COMMAND: 91,
+ COMMAND_LEFT: 91, // COMMAND
+ COMMAND_RIGHT: 93,
+ CONTROL: 17,
+ DELETE: 46,
+ DOWN: 40,
+ END: 35,
+ ENTER: 13,
+ ESCAPE: 27,
+ HOME: 36,
+ INSERT: 45,
+ LEFT: 37,
+ MENU: 93, // COMMAND_RIGHT
+ NUMPAD_ADD: 107,
+ NUMPAD_DECIMAL: 110,
+ NUMPAD_DIVIDE: 111,
+ NUMPAD_ENTER: 108,
+ NUMPAD_MULTIPLY: 106,
+ NUMPAD_SUBTRACT: 109,
+ PAGE_DOWN: 34,
+ PAGE_UP: 33,
+ PERIOD: 190,
+ RIGHT: 39,
+ SHIFT: 16,
+ SPACE: 32,
+ TAB: 9,
+ UP: 38,
+ WINDOWS: 91 // COMMAND
+ }
+});
+
+// plugins
+$.fn.extend({
+ propAttr: $.fn.prop || $.fn.attr,
+
+ _focus: $.fn.focus,
+ focus: function( delay, fn ) {
+ return typeof delay === "number" ?
+ this.each(function() {
+ var elem = this;
+ setTimeout(function() {
+ $( elem ).focus();
+ if ( fn ) {
+ fn.call( elem );
+ }
+ }, delay );
+ }) :
+ this._focus.apply( this, arguments );
+ },
+
+ scrollParent: function() {
+ var scrollParent;
+ if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+ scrollParent = this.parents().filter(function() {
+ return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+ }).eq(0);
+ } else {
+ scrollParent = this.parents().filter(function() {
+ return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+ }).eq(0);
+ }
+
+ return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
+ },
+
+ zIndex: function( zIndex ) {
+ if ( zIndex !== undefined ) {
+ return this.css( "zIndex", zIndex );
+ }
+
+ if ( this.length ) {
+ var elem = $( this[ 0 ] ), position, value;
+ while ( elem.length && elem[ 0 ] !== document ) {
+ // Ignore z-index if position is set to a value where z-index is ignored by the browser
+ // This makes behavior of this function consistent across browsers
+ // WebKit always returns auto if the element is positioned
+ position = elem.css( "position" );
+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+ // IE returns 0 when zIndex is not specified
+ // other browsers return a string
+ // we ignore the case of nested elements with an explicit value of 0
+ // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+ value = parseInt( elem.css( "zIndex" ), 10 );
+ if ( !isNaN( value ) && value !== 0 ) {
+ return value;
+ }
+ }
+ elem = elem.parent();
+ }
+ }
+
+ return 0;
+ },
+
+ disableSelection: function() {
+ return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+ ".ui-disableSelection", function( event ) {
+ event.preventDefault();
+ });
+ },
+
+ enableSelection: function() {
+ return this.unbind( ".ui-disableSelection" );
+ }
+});
+
+$.each( [ "Width", "Height" ], function( i, name ) {
+ var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+ type = name.toLowerCase(),
+ orig = {
+ innerWidth: $.fn.innerWidth,
+ innerHeight: $.fn.innerHeight,
+ outerWidth: $.fn.outerWidth,
+ outerHeight: $.fn.outerHeight
+ };
+
+ function reduce( elem, size, border, margin ) {
+ $.each( side, function() {
+ size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
+ if ( border ) {
+ size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
+ }
+ if ( margin ) {
+ size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
+ }
+ });
+ return size;
+ }
+
+ $.fn[ "inner" + name ] = function( size ) {
+ if ( size === undefined ) {
+ return orig[ "inner" + name ].call( this );
+ }
+
+ return this.each(function() {
+ $( this ).css( type, reduce( this, size ) + "px" );
+ });
+ };
+
+ $.fn[ "outer" + name] = function( size, margin ) {
+ if ( typeof size !== "number" ) {
+ return orig[ "outer" + name ].call( this, size );
+ }
+
+ return this.each(function() {
+ $( this).css( type, reduce( this, size, true, margin ) + "px" );
+ });
+ };
+});
+
+// selectors
+function focusable( element, isTabIndexNotNaN ) {
+ var nodeName = element.nodeName.toLowerCase();
+ if ( "area" === nodeName ) {
+ var map = element.parentNode,
+ mapName = map.name,
+ img;
+ if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+ return false;
+ }
+ img = $( "img[usemap=#" + mapName + "]" )[0];
+ return !!img && visible( img );
+ }
+ return ( /input|select|textarea|button|object/.test( nodeName )
+ ? !element.disabled
+ : "a" == nodeName
+ ? element.href || isTabIndexNotNaN
+ : isTabIndexNotNaN)
+ // the element and all of its ancestors must be visible
+ && visible( element );
+}
+
+function visible( element ) {
+ return !$( element ).parents().andSelf().filter(function() {
+ return $.curCSS( this, "visibility" ) === "hidden" ||
+ $.expr.filters.hidden( this );
+ }).length;
+}
+
+$.extend( $.expr[ ":" ], {
+ data: function( elem, i, match ) {
+ return !!$.data( elem, match[ 3 ] );
+ },
+
+ focusable: function( element ) {
+ return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
+ },
+
+ tabbable: function( element ) {
+ var tabIndex = $.attr( element, "tabindex" ),
+ isTabIndexNaN = isNaN( tabIndex );
+ return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
+ }
+});
+
+// support
+$(function() {
+ var body = document.body,
+ div = body.appendChild( div = document.createElement( "div" ) );
+
+ $.extend( div.style, {
+ minHeight: "100px",
+ height: "auto",
+ padding: 0,
+ borderWidth: 0
+ });
+
+ $.support.minHeight = div.offsetHeight === 100;
+ $.support.selectstart = "onselectstart" in div;
+
+ // set display to none to avoid a layout bug in IE
+ // http://dev.jquery.com/ticket/4014
+ body.removeChild( div ).style.display = "none";
+});
+
+
+
+
+
+// deprecated
+$.extend( $.ui, {
+ // $.ui.plugin is deprecated. Use the proxy pattern instead.
+ plugin: {
+ add: function( module, option, set ) {
+ var proto = $.ui[ module ].prototype;
+ for ( var i in set ) {
+ proto.plugins[ i ] = proto.plugins[ i ] || [];
+ proto.plugins[ i ].push( [ option, set[ i ] ] );
+ }
+ },
+ call: function( instance, name, args ) {
+ var set = instance.plugins[ name ];
+ if ( !set || !instance.element[ 0 ].parentNode ) {
+ return;
+ }
+
+ for ( var i = 0; i < set.length; i++ ) {
+ if ( instance.options[ set[ i ][ 0 ] ] ) {
+ set[ i ][ 1 ].apply( instance.element, args );
+ }
+ }
+ }
+ },
+
+ // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
+ contains: function( a, b ) {
+ return document.compareDocumentPosition ?
+ a.compareDocumentPosition( b ) & 16 :
+ a !== b && a.contains( b );
+ },
+
+ // only used by resizable
+ hasScroll: function( el, a ) {
+
+ //If overflow is hidden, the element might have extra content, but the user wants to hide it
+ if ( $( el ).css( "overflow" ) === "hidden") {
+ return false;
+ }
+
+ var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
+ has = false;
+
+ if ( el[ scroll ] > 0 ) {
+ return true;
+ }
+
+ // TODO: determine which cases actually cause this to happen
+ // if the element doesn't have the scroll set, see if it's possible to
+ // set the scroll
+ el[ scroll ] = 1;
+ has = ( el[ scroll ] > 0 );
+ el[ scroll ] = 0;
+ return has;
+ },
+
+ // these are odd functions, fix the API or move into individual plugins
+ isOverAxis: function( x, reference, size ) {
+ //Determines when x coordinate is over "b" element axis
+ return ( x > reference ) && ( x < ( reference + size ) );
+ },
+ isOver: function( y, x, top, left, height, width ) {
+ //Determines when x, y coordinates is over "b" element
+ return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
+ }
+});
+
+})( jQuery );
+/*!
+ * jQuery UI Widget 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function( $, undefined ) {
+
+// jQuery 1.4+
+if ( $.cleanData ) {
+ var _cleanData = $.cleanData;
+ $.cleanData = function( elems ) {
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ try {
+ $( elem ).triggerHandler( "remove" );
+ // http://bugs.jquery.com/ticket/8235
+ } catch( e ) {}
+ }
+ _cleanData( elems );
+ };
+} else {
+ var _remove = $.fn.remove;
+ $.fn.remove = function( selector, keepData ) {
+ return this.each(function() {
+ if ( !keepData ) {
+ if ( !selector || $.filter( selector, [ this ] ).length ) {
+ $( "*", this ).add( [ this ] ).each(function() {
+ try {
+ $( this ).triggerHandler( "remove" );
+ // http://bugs.jquery.com/ticket/8235
+ } catch( e ) {}
+ });
+ }
+ }
+ return _remove.call( $(this), selector, keepData );
+ });
+ };
+}
+
+$.widget = function( name, base, prototype ) {
+ var namespace = name.split( "." )[ 0 ],
+ fullName;
+ name = name.split( "." )[ 1 ];
+ fullName = namespace + "-" + name;
+
+ if ( !prototype ) {
+ prototype = base;
+ base = $.Widget;
+ }
+
+ // create selector for plugin
+ $.expr[ ":" ][ fullName ] = function( elem ) {
+ return !!$.data( elem, name );
+ };
+
+ $[ namespace ] = $[ namespace ] || {};
+ $[ namespace ][ name ] = function( options, element ) {
+ // allow instantiation without initializing for simple inheritance
+ if ( arguments.length ) {
+ this._createWidget( options, element );
+ }
+ };
+
+ var basePrototype = new base();
+ // we need to make the options hash a property directly on the new instance
+ // otherwise we'll modify the options hash on the prototype that we're
+ // inheriting from
+// $.each( basePrototype, function( key, val ) {
+// if ( $.isPlainObject(val) ) {
+// basePrototype[ key ] = $.extend( {}, val );
+// }
+// });
+ basePrototype.options = $.extend( true, {}, basePrototype.options );
+ $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+ namespace: namespace,
+ widgetName: name,
+ widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
+ widgetBaseClass: fullName
+ }, prototype );
+
+ $.widget.bridge( name, $[ namespace ][ name ] );
+};
+
+$.widget.bridge = function( name, object ) {
+ $.fn[ name ] = function( options ) {
+ var isMethodCall = typeof options === "string",
+ args = Array.prototype.slice.call( arguments, 1 ),
+ returnValue = this;
+
+ // allow multiple hashes to be passed on init
+ options = !isMethodCall && args.length ?
+ $.extend.apply( null, [ true, options ].concat(args) ) :
+ options;
+
+ // prevent calls to internal methods
+ if ( isMethodCall && options.charAt( 0 ) === "_" ) {
+ return returnValue;
+ }
+
+ if ( isMethodCall ) {
+ this.each(function() {
+ var instance = $.data( this, name ),
+ methodValue = instance && $.isFunction( instance[options] ) ?
+ instance[ options ].apply( instance, args ) :
+ instance;
+ // TODO: add this back in 1.9 and use $.error() (see #5972)
+// if ( !instance ) {
+// throw "cannot call methods on " + name + " prior to initialization; " +
+// "attempted to call method '" + options + "'";
+// }
+// if ( !$.isFunction( instance[options] ) ) {
+// throw "no such method '" + options + "' for " + name + " widget instance";
+// }
+// var methodValue = instance[ options ].apply( instance, args );
+ if ( methodValue !== instance && methodValue !== undefined ) {
+ returnValue = methodValue;
+ return false;
+ }
+ });
+ } else {
+ this.each(function() {
+ var instance = $.data( this, name );
+ if ( instance ) {
+ instance.option( options || {} )._init();
+ } else {
+ $.data( this, name, new object( options, this ) );
+ }
+ });
+ }
+
+ return returnValue;
+ };
+};
+
+$.Widget = function( options, element ) {
+ // allow instantiation without initializing for simple inheritance
+ if ( arguments.length ) {
+ this._createWidget( options, element );
+ }
+};
+
+$.Widget.prototype = {
+ widgetName: "widget",
+ widgetEventPrefix: "",
+ options: {
+ disabled: false
+ },
+ _createWidget: function( options, element ) {
+ // $.widget.bridge stores the plugin instance, but we do it anyway
+ // so that it's stored even before the _create function runs
+ $.data( element, this.widgetName, this );
+ this.element = $( element );
+ this.options = $.extend( true, {},
+ this.options,
+ this._getCreateOptions(),
+ options );
+
+ var self = this;
+ this.element.bind( "remove." + this.widgetName, function() {
+ self.destroy();
+ });
+
+ this._create();
+ this._trigger( "create" );
+ this._init();
+ },
+ _getCreateOptions: function() {
+ return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+ },
+ _create: function() {},
+ _init: function() {},
+
+ destroy: function() {
+ this.element
+ .unbind( "." + this.widgetName )
+ .removeData( this.widgetName );
+ this.widget()
+ .unbind( "." + this.widgetName )
+ .removeAttr( "aria-disabled" )
+ .removeClass(
+ this.widgetBaseClass + "-disabled " +
+ "ui-state-disabled" );
+ },
+
+ widget: function() {
+ return this.element;
+ },
+
+ option: function( key, value ) {
+ var options = key;
+
+ if ( arguments.length === 0 ) {
+ // don't return a reference to the internal hash
+ return $.extend( {}, this.options );
+ }
+
+ if (typeof key === "string" ) {
+ if ( value === undefined ) {
+ return this.options[ key ];
+ }
+ options = {};
+ options[ key ] = value;
+ }
+
+ this._setOptions( options );
+
+ return this;
+ },
+ _setOptions: function( options ) {
+ var self = this;
+ $.each( options, function( key, value ) {
+ self._setOption( key, value );
+ });
+
+ return this;
+ },
+ _setOption: function( key, value ) {
+ this.options[ key ] = value;
+
+ if ( key === "disabled" ) {
+ this.widget()
+ [ value ? "addClass" : "removeClass"](
+ this.widgetBaseClass + "-disabled" + " " +
+ "ui-state-disabled" )
+ .attr( "aria-disabled", value );
+ }
+
+ return this;
+ },
+
+ enable: function() {
+ return this._setOption( "disabled", false );
+ },
+ disable: function() {
+ return this._setOption( "disabled", true );
+ },
+
+ _trigger: function( type, event, data ) {
+ var callback = this.options[ type ];
+
+ event = $.Event( event );
+ event.type = ( type === this.widgetEventPrefix ?
+ type :
+ this.widgetEventPrefix + type ).toLowerCase();
+ data = data || {};
+
+ // copy original event properties over to the new event
+ // this would happen if we could call $.event.fix instead of $.Event
+ // but we don't have a way to force an event to be fixed multiple times
+ if ( event.originalEvent ) {
+ for ( var i = $.event.props.length, prop; i; ) {
+ prop = $.event.props[ --i ];
+ event[ prop ] = event.originalEvent[ prop ];
+ }
+ }
+
+ this.element.trigger( event, data );
+
+ return !( $.isFunction(callback) &&
+ callback.call( this.element[0], event, data ) === false ||
+ event.isDefaultPrevented() );
+ }
+};
+
+})( jQuery );
+/*!
+ * jQuery UI Mouse 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var mouseHandled = false;
+$( document ).mouseup( function( e ) {
+ mouseHandled = false;
+});
+
+$.widget("ui.mouse", {
+ options: {
+ cancel: ':input,option',
+ distance: 1,
+ delay: 0
+ },
+ _mouseInit: function() {
+ var self = this;
+
+ this.element
+ .bind('mousedown.'+this.widgetName, function(event) {
+ return self._mouseDown(event);
+ })
+ .bind('click.'+this.widgetName, function(event) {
+ if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
+ $.removeData(event.target, self.widgetName + '.preventClickEvent');
+ event.stopImmediatePropagation();
+ return false;
+ }
+ });
+
+ this.started = false;
+ },
+
+ // TODO: make sure destroying one instance of mouse doesn't mess with
+ // other instances of mouse
+ _mouseDestroy: function() {
+ this.element.unbind('.'+this.widgetName);
+ },
+
+ _mouseDown: function(event) {
+ // don't let more than one widget handle mouseStart
+ if( mouseHandled ) { return };
+
+ // we may have missed mouseup (out of window)
+ (this._mouseStarted && this._mouseUp(event));
+
+ this._mouseDownEvent = event;
+
+ var self = this,
+ btnIsLeft = (event.which == 1),
+ // event.target.nodeName works around a bug in IE 8 with
+ // disabled inputs (#7620)
+ elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+ return true;
+ }
+
+ this.mouseDelayMet = !this.options.delay;
+ if (!this.mouseDelayMet) {
+ this._mouseDelayTimer = setTimeout(function() {
+ self.mouseDelayMet = true;
+ }, this.options.delay);
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted = (this._mouseStart(event) !== false);
+ if (!this._mouseStarted) {
+ event.preventDefault();
+ return true;
+ }
+ }
+
+ // Click event may never have fired (Gecko & Opera)
+ if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
+ $.removeData(event.target, this.widgetName + '.preventClickEvent');
+ }
+
+ // these delegates are required to keep context
+ this._mouseMoveDelegate = function(event) {
+ return self._mouseMove(event);
+ };
+ this._mouseUpDelegate = function(event) {
+ return self._mouseUp(event);
+ };
+ $(document)
+ .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+ .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+ event.preventDefault();
+
+ mouseHandled = true;
+ return true;
+ },
+
+ _mouseMove: function(event) {
+ // IE mouseup check - mouseup happened when mouse was out of window
+ if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
+ return this._mouseUp(event);
+ }
+
+ if (this._mouseStarted) {
+ this._mouseDrag(event);
+ return event.preventDefault();
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted =
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+ }
+
+ return !this._mouseStarted;
+ },
+
+ _mouseUp: function(event) {
+ $(document)
+ .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+ .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+ if (this._mouseStarted) {
+ this._mouseStarted = false;
+
+ if (event.target == this._mouseDownEvent.target) {
+ $.data(event.target, this.widgetName + '.preventClickEvent', true);
+ }
+
+ this._mouseStop(event);
+ }
+
+ return false;
+ },
+
+ _mouseDistanceMet: function(event) {
+ return (Math.max(
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
+ ) >= this.options.distance
+ );
+ },
+
+ _mouseDelayMet: function(event) {
+ return this.mouseDelayMet;
+ },
+
+ // These are placeholder methods, to be overriden by extending plugin
+ _mouseStart: function(event) {},
+ _mouseDrag: function(event) {},
+ _mouseStop: function(event) {},
+ _mouseCapture: function(event) { return true; }
+});
+
+})(jQuery);
+/*
+ * jQuery UI Draggable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.draggable", $.ui.mouse, {
+ widgetEventPrefix: "drag",
+ options: {
+ addClasses: true,
+ appendTo: "parent",
+ axis: false,
+ connectToSortable: false,
+ containment: false,
+ cursor: "auto",
+ cursorAt: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ iframeFix: false,
+ opacity: false,
+ refreshPositions: false,
+ revert: false,
+ revertDuration: 500,
+ scope: "default",
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ snap: false,
+ snapMode: "both",
+ snapTolerance: 20,
+ stack: false,
+ zIndex: false
+ },
+ _create: function() {
+
+ if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
+ this.element[0].style.position = 'relative';
+
+ (this.options.addClasses && this.element.addClass("ui-draggable"));
+ (this.options.disabled && this.element.addClass("ui-draggable-disabled"));
+
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+ if(!this.element.data('draggable')) return;
+ this.element
+ .removeData("draggable")
+ .unbind(".draggable")
+ .removeClass("ui-draggable"
+ + " ui-draggable-dragging"
+ + " ui-draggable-disabled");
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseCapture: function(event) {
+
+ var o = this.options;
+
+ // among others, prevent a drag on a resizable-handle
+ if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
+ return false;
+
+ //Quit if we're not on a valid handle
+ this.handle = this._getHandle(event);
+ if (!this.handle)
+ return false;
+
+ if ( o.iframeFix ) {
+ $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+ $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
+ .css({
+ width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+ position: "absolute", opacity: "0.001", zIndex: 1000
+ })
+ .css($(this).offset())
+ .appendTo("body");
+ });
+ }
+
+ return true;
+
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options;
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ //If ddmanager is used for droppables, set the global draggable
+ if($.ui.ddmanager)
+ $.ui.ddmanager.current = this;
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Store the helper's css position
+ this.cssPosition = this.helper.css("position");
+ this.scrollParent = this.helper.scrollParent();
+
+ //The element's absolute position on the page minus margins
+ this.offset = this.positionAbs = this.element.offset();
+ this.offset = {
+ top: this.offset.top - this.margins.top,
+ left: this.offset.left - this.margins.left
+ };
+
+ $.extend(this.offset, {
+ click: { //Where the click happened, relative to the element
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ },
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+ });
+
+ //Generate the original position
+ this.originalPosition = this.position = this._generatePosition(event);
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Set a containment if given in the options
+ if(o.containment)
+ this._setContainment();
+
+ //Trigger event + callbacks
+ if(this._trigger("start", event) === false) {
+ this._clear();
+ return false;
+ }
+
+ //Recache the helper size
+ this._cacheHelperProportions();
+
+ //Prepare the droppable offsets
+ if ($.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+
+ this.helper.addClass("ui-draggable-dragging");
+ this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+
+ //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
+ if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
+
+ return true;
+ },
+
+ _mouseDrag: function(event, noPropagation) {
+
+ //Compute the helpers position
+ this.position = this._generatePosition(event);
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Call plugins and callbacks and use the resulting position if something is returned
+ if (!noPropagation) {
+ var ui = this._uiHash();
+ if(this._trigger('drag', event, ui) === false) {
+ this._mouseUp({});
+ return false;
+ }
+ this.position = ui.position;
+ }
+
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ //If we are using droppables, inform the manager about the drop
+ var dropped = false;
+ if ($.ui.ddmanager && !this.options.dropBehaviour)
+ dropped = $.ui.ddmanager.drop(this, event);
+
+ //if a drop comes from outside (a sortable)
+ if(this.dropped) {
+ dropped = this.dropped;
+ this.dropped = false;
+ }
+
+ //if the original element is removed, don't bother to continue if helper is set to "original"
+ if((!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original")
+ return false;
+
+ if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
+ var self = this;
+ $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
+ if(self._trigger("stop", event) !== false) {
+ self._clear();
+ }
+ });
+ } else {
+ if(this._trigger("stop", event) !== false) {
+ this._clear();
+ }
+ }
+
+ return false;
+ },
+
+ _mouseUp: function(event) {
+ if (this.options.iframeFix === true) {
+ $("div.ui-draggable-iframeFix").each(function() {
+ this.parentNode.removeChild(this);
+ }); //Remove frame helpers
+ }
+
+ //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
+ if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
+
+ return $.ui.mouse.prototype._mouseUp.call(this, event);
+ },
+
+ cancel: function() {
+
+ if(this.helper.is(".ui-draggable-dragging")) {
+ this._mouseUp({});
+ } else {
+ this._clear();
+ }
+
+ return this;
+
+ },
+
+ _getHandle: function(event) {
+
+ var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
+ $(this.options.handle, this.element)
+ .find("*")
+ .andSelf()
+ .each(function() {
+ if(this == event.target) handle = true;
+ });
+
+ return handle;
+
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options;
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
+
+ if(!helper.parents('body').length)
+ helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
+
+ if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
+ helper.css("position", "absolute");
+
+ return helper;
+
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj == 'string') {
+ obj = obj.split(' ');
+ }
+ if ($.isArray(obj)) {
+ obj = {left: +obj[0], top: +obj[1] || 0};
+ }
+ if ('left' in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ('right' in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+ }
+ if ('top' in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ('bottom' in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+ }
+ },
+
+ _getParentOffset: function() {
+
+ //Get the offsetParent and cache its position
+ this.offsetParent = this.helper.offsetParent();
+ var po = this.offsetParent.offset();
+
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+ if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+ || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+ po = { top: 0, left: 0 };
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+
+ if(this.cssPosition == "relative") {
+ var p = this.element.position();
+ return {
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+ };
+ } else {
+ return { top: 0, left: 0 };
+ }
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.element.css("marginLeft"),10) || 0),
+ top: (parseInt(this.element.css("marginTop"),10) || 0),
+ right: (parseInt(this.element.css("marginRight"),10) || 0),
+ bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var o = this.options;
+ if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+ if(o.containment == 'document' || o.containment == 'window') this.containment = [
+ o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
+ o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
+ (o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+ (o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+ ];
+
+ if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
+ var c = $(o.containment);
+ var ce = c[0]; if(!ce) return;
+ var co = c.offset();
+ var over = ($(ce).css("overflow") != 'hidden');
+
+ this.containment = [
+ (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
+ (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
+ (over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
+ (over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top - this.margins.bottom
+ ];
+ this.relative_container = c;
+
+ } else if(o.containment.constructor == Array) {
+ this.containment = o.containment;
+ }
+
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if(!pos) pos = this.position;
+ var mod = d == "absolute" ? 1 : -1;
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ return {
+ top: (
+ pos.top // The absolute mouse position
+ + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+ ),
+ left: (
+ pos.left // The absolute mouse position
+ + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function(event) {
+
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+ var pageX = event.pageX;
+ var pageY = event.pageY;
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+ var containment;
+ if(this.containment) {
+ if (this.relative_container){
+ var co = this.relative_container.offset();
+ containment = [ this.containment[0] + co.left,
+ this.containment[1] + co.top,
+ this.containment[2] + co.left,
+ this.containment[3] + co.top ];
+ }
+ else {
+ containment = this.containment;
+ }
+
+ if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
+ if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
+ }
+
+ if(o.grid) {
+ //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
+ var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
+ pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+ var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
+ pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ }
+
+ }
+
+ return {
+ top: (
+ pageY // The absolute mouse position
+ - this.offset.click.top // Click offset (relative to the element)
+ - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+ ),
+ left: (
+ pageX // The absolute mouse position
+ - this.offset.click.left // Click offset (relative to the element)
+ - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+ )
+ };
+
+ },
+
+ _clear: function() {
+ this.helper.removeClass("ui-draggable-dragging");
+ if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
+ //if($.ui.ddmanager) $.ui.ddmanager.current = null;
+ this.helper = null;
+ this.cancelHelperRemoval = false;
+ },
+
+ // From now on bulk stuff - mainly helpers
+
+ _trigger: function(type, event, ui) {
+ ui = ui || this._uiHash();
+ $.ui.plugin.call(this, type, [event, ui]);
+ if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
+ return $.Widget.prototype._trigger.call(this, type, event, ui);
+ },
+
+ plugins: {},
+
+ _uiHash: function(event) {
+ return {
+ helper: this.helper,
+ position: this.position,
+ originalPosition: this.originalPosition,
+ offset: this.positionAbs
+ };
+ }
+
+});
+
+$.extend($.ui.draggable, {
+ version: "1.8.16"
+});
+
+$.ui.plugin.add("draggable", "connectToSortable", {
+ start: function(event, ui) {
+
+ var inst = $(this).data("draggable"), o = inst.options,
+ uiSortable = $.extend({}, ui, { item: inst.element });
+ inst.sortables = [];
+ $(o.connectToSortable).each(function() {
+ var sortable = $.data(this, 'sortable');
+ if (sortable && !sortable.options.disabled) {
+ inst.sortables.push({
+ instance: sortable,
+ shouldRevert: sortable.options.revert
+ });
+ sortable.refreshPositions(); // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
+ sortable._trigger("activate", event, uiSortable);
+ }
+ });
+
+ },
+ stop: function(event, ui) {
+
+ //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
+ var inst = $(this).data("draggable"),
+ uiSortable = $.extend({}, ui, { item: inst.element });
+
+ $.each(inst.sortables, function() {
+ if(this.instance.isOver) {
+
+ this.instance.isOver = 0;
+
+ inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
+ this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
+
+ //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
+ if(this.shouldRevert) this.instance.options.revert = true;
+
+ //Trigger the stop of the sortable
+ this.instance._mouseStop(event);
+
+ this.instance.options.helper = this.instance.options._helper;
+
+ //If the helper has been the original item, restore properties in the sortable
+ if(inst.options.helper == 'original')
+ this.instance.currentItem.css({ top: 'auto', left: 'auto' });
+
+ } else {
+ this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
+ this.instance._trigger("deactivate", event, uiSortable);
+ }
+
+ });
+
+ },
+ drag: function(event, ui) {
+
+ var inst = $(this).data("draggable"), self = this;
+
+ var checkPos = function(o) {
+ var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
+ var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
+ var itemHeight = o.height, itemWidth = o.width;
+ var itemTop = o.top, itemLeft = o.left;
+
+ return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
+ };
+
+ $.each(inst.sortables, function(i) {
+
+ //Copy over some variables to allow calling the sortable's native _intersectsWith
+ this.instance.positionAbs = inst.positionAbs;
+ this.instance.helperProportions = inst.helperProportions;
+ this.instance.offset.click = inst.offset.click;
+
+ if(this.instance._intersectsWith(this.instance.containerCache)) {
+
+ //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
+ if(!this.instance.isOver) {
+
+ this.instance.isOver = 1;
+ //Now we fake the start of dragging for the sortable instance,
+ //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
+ //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
+ this.instance.currentItem = $(self).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
+ this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
+ this.instance.options.helper = function() { return ui.helper[0]; };
+
+ event.target = this.instance.currentItem[0];
+ this.instance._mouseCapture(event, true);
+ this.instance._mouseStart(event, true, true);
+
+ //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
+ this.instance.offset.click.top = inst.offset.click.top;
+ this.instance.offset.click.left = inst.offset.click.left;
+ this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
+ this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
+
+ inst._trigger("toSortable", event);
+ inst.dropped = this.instance.element; //draggable revert needs that
+ //hack so receive/update callbacks work (mostly)
+ inst.currentItem = inst.element;
+ this.instance.fromOutside = inst;
+
+ }
+
+ //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
+ if(this.instance.currentItem) this.instance._mouseDrag(event);
+
+ } else {
+
+ //If it doesn't intersect with the sortable, and it intersected before,
+ //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
+ if(this.instance.isOver) {
+
+ this.instance.isOver = 0;
+ this.instance.cancelHelperRemoval = true;
+
+ //Prevent reverting on this forced stop
+ this.instance.options.revert = false;
+
+ // The out event needs to be triggered independently
+ this.instance._trigger('out', event, this.instance._uiHash(this.instance));
+
+ this.instance._mouseStop(event, true);
+ this.instance.options.helper = this.instance.options._helper;
+
+ //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
+ this.instance.currentItem.remove();
+ if(this.instance.placeholder) this.instance.placeholder.remove();
+
+ inst._trigger("fromSortable", event);
+ inst.dropped = false; //draggable revert needs that
+ }
+
+ };
+
+ });
+
+ }
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+ start: function(event, ui) {
+ var t = $('body'), o = $(this).data('draggable').options;
+ if (t.css("cursor")) o._cursor = t.css("cursor");
+ t.css("cursor", o.cursor);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ if (o._cursor) $('body').css("cursor", o._cursor);
+ }
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+ start: function(event, ui) {
+ var t = $(ui.helper), o = $(this).data('draggable').options;
+ if(t.css("opacity")) o._opacity = t.css("opacity");
+ t.css('opacity', o.opacity);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ if(o._opacity) $(ui.helper).css('opacity', o._opacity);
+ }
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+ start: function(event, ui) {
+ var i = $(this).data("draggable");
+ if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
+ },
+ drag: function(event, ui) {
+
+ var i = $(this).data("draggable"), o = i.options, scrolled = false;
+
+ if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
+
+ if(!o.axis || o.axis != 'x') {
+ if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+ i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
+ else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
+ i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
+ }
+
+ if(!o.axis || o.axis != 'y') {
+ if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+ i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
+ else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
+ i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
+ }
+
+ } else {
+
+ if(!o.axis || o.axis != 'x') {
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+ }
+
+ if(!o.axis || o.axis != 'y') {
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+ }
+
+ }
+
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(i, event);
+
+ }
+});
+
+$.ui.plugin.add("draggable", "snap", {
+ start: function(event, ui) {
+
+ var i = $(this).data("draggable"), o = i.options;
+ i.snapElements = [];
+
+ $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
+ var $t = $(this); var $o = $t.offset();
+ if(this != i.element[0]) i.snapElements.push({
+ item: this,
+ width: $t.outerWidth(), height: $t.outerHeight(),
+ top: $o.top, left: $o.left
+ });
+ });
+
+ },
+ drag: function(event, ui) {
+
+ var inst = $(this).data("draggable"), o = inst.options;
+ var d = o.snapTolerance;
+
+ var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+ y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+ for (var i = inst.snapElements.length - 1; i >= 0; i--){
+
+ var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
+ t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
+
+ //Yes, I know, this is insane ;)
+ if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
+ if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ inst.snapElements[i].snapping = false;
+ continue;
+ }
+
+ if(o.snapMode != 'inner') {
+ var ts = Math.abs(t - y2) <= d;
+ var bs = Math.abs(b - y1) <= d;
+ var ls = Math.abs(l - x2) <= d;
+ var rs = Math.abs(r - x1) <= d;
+ if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+ if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
+ if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
+ if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
+ }
+
+ var first = (ts || bs || ls || rs);
+
+ if(o.snapMode != 'outer') {
+ var ts = Math.abs(t - y1) <= d;
+ var bs = Math.abs(b - y2) <= d;
+ var ls = Math.abs(l - x1) <= d;
+ var rs = Math.abs(r - x2) <= d;
+ if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
+ if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+ if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
+ if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
+ }
+
+ if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
+ (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+ };
+
+ }
+});
+
+$.ui.plugin.add("draggable", "stack", {
+ start: function(event, ui) {
+
+ var o = $(this).data("draggable").options;
+
+ var group = $.makeArray($(o.stack)).sort(function(a,b) {
+ return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
+ });
+ if (!group.length) { return; }
+
+ var min = parseInt(group[0].style.zIndex) || 0;
+ $(group).each(function(i) {
+ this.style.zIndex = min + i;
+ });
+
+ this[0].style.zIndex = min + group.length;
+
+ }
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+ start: function(event, ui) {
+ var t = $(ui.helper), o = $(this).data("draggable").options;
+ if(t.css("zIndex")) o._zIndex = t.css("zIndex");
+ t.css('zIndex', o.zIndex);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data("draggable").options;
+ if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
+ }
+});
+
+})(jQuery);
+/*
+ * jQuery UI Droppable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.mouse.js
+ * jquery.ui.draggable.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.droppable", {
+ widgetEventPrefix: "drop",
+ options: {
+ accept: '*',
+ activeClass: false,
+ addClasses: true,
+ greedy: false,
+ hoverClass: false,
+ scope: 'default',
+ tolerance: 'intersect'
+ },
+ _create: function() {
+
+ var o = this.options, accept = o.accept;
+ this.isover = 0; this.isout = 1;
+
+ this.accept = $.isFunction(accept) ? accept : function(d) {
+ return d.is(accept);
+ };
+
+ //Store the droppable's proportions
+ this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
+
+ // Add the reference and positions to the manager
+ $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
+ $.ui.ddmanager.droppables[o.scope].push(this);
+
+ (o.addClasses && this.element.addClass("ui-droppable"));
+
+ },
+
+ destroy: function() {
+ var drop = $.ui.ddmanager.droppables[this.options.scope];
+ for ( var i = 0; i < drop.length; i++ )
+ if ( drop[i] == this )
+ drop.splice(i, 1);
+
+ this.element
+ .removeClass("ui-droppable ui-droppable-disabled")
+ .removeData("droppable")
+ .unbind(".droppable");
+
+ return this;
+ },
+
+ _setOption: function(key, value) {
+
+ if(key == 'accept') {
+ this.accept = $.isFunction(value) ? value : function(d) {
+ return d.is(value);
+ };
+ }
+ $.Widget.prototype._setOption.apply(this, arguments);
+ },
+
+ _activate: function(event) {
+ var draggable = $.ui.ddmanager.current;
+ if(this.options.activeClass) this.element.addClass(this.options.activeClass);
+ (draggable && this._trigger('activate', event, this.ui(draggable)));
+ },
+
+ _deactivate: function(event) {
+ var draggable = $.ui.ddmanager.current;
+ if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+ (draggable && this._trigger('deactivate', event, this.ui(draggable)));
+ },
+
+ _over: function(event) {
+
+ var draggable = $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+ if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
+ this._trigger('over', event, this.ui(draggable));
+ }
+
+ },
+
+ _out: function(event) {
+
+ var draggable = $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+ if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+ this._trigger('out', event, this.ui(draggable));
+ }
+
+ },
+
+ _drop: function(event,custom) {
+
+ var draggable = custom || $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
+
+ var childrenIntersection = false;
+ this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
+ var inst = $.data(this, 'droppable');
+ if(
+ inst.options.greedy
+ && !inst.options.disabled
+ && inst.options.scope == draggable.options.scope
+ && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
+ && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
+ ) { childrenIntersection = true; return false; }
+ });
+ if(childrenIntersection) return false;
+
+ if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+ if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+ this._trigger('drop', event, this.ui(draggable));
+ return this.element;
+ }
+
+ return false;
+
+ },
+
+ ui: function(c) {
+ return {
+ draggable: (c.currentItem || c.element),
+ helper: c.helper,
+ position: c.position,
+ offset: c.positionAbs
+ };
+ }
+
+});
+
+$.extend($.ui.droppable, {
+ version: "1.8.16"
+});
+
+$.ui.intersect = function(draggable, droppable, toleranceMode) {
+
+ if (!droppable.offset) return false;
+
+ var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
+ y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
+ var l = droppable.offset.left, r = l + droppable.proportions.width,
+ t = droppable.offset.top, b = t + droppable.proportions.height;
+
+ switch (toleranceMode) {
+ case 'fit':
+ return (l <= x1 && x2 <= r
+ && t <= y1 && y2 <= b);
+ break;
+ case 'intersect':
+ return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
+ && x2 - (draggable.helperProportions.width / 2) < r // Left Half
+ && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
+ && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
+ break;
+ case 'pointer':
+ var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
+ draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
+ isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
+ return isOver;
+ break;
+ case 'touch':
+ return (
+ (y1 >= t && y1 <= b) || // Top edge touching
+ (y2 >= t && y2 <= b) || // Bottom edge touching
+ (y1 < t && y2 > b) // Surrounded vertically
+ ) && (
+ (x1 >= l && x1 <= r) || // Left edge touching
+ (x2 >= l && x2 <= r) || // Right edge touching
+ (x1 < l && x2 > r) // Surrounded horizontally
+ );
+ break;
+ default:
+ return false;
+ break;
+ }
+
+};
+
+/*
+ This manager tracks offsets of draggables and droppables
+*/
+$.ui.ddmanager = {
+ current: null,
+ droppables: { 'default': [] },
+ prepareOffsets: function(t, event) {
+
+ var m = $.ui.ddmanager.droppables[t.options.scope] || [];
+ var type = event ? event.type : null; // workaround for #2317
+ var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
+
+ droppablesLoop: for (var i = 0; i < m.length; i++) {
+
+ if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted
+ for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
+ m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue
+
+ if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
+
+ m[i].offset = m[i].element.offset();
+ m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
+
+ }
+
+ },
+ drop: function(draggable, event) {
+
+ var dropped = false;
+ $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+ if(!this.options) return;
+ if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
+ dropped = dropped || this._drop.call(this, event);
+
+ if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ this.isout = 1; this.isover = 0;
+ this._deactivate.call(this, event);
+ }
+
+ });
+ return dropped;
+
+ },
+ dragStart: function( draggable, event ) {
+ //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
+ draggable.element.parents( ":not(body,html)" ).bind( "scroll.droppable", function() {
+ if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
+ });
+ },
+ drag: function(draggable, event) {
+
+ //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
+ if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
+
+ //Run through all droppables and check their positions based on specific tolerance options
+ $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+ if(this.options.disabled || this.greedyChild || !this.visible) return;
+ var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
+
+ var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
+ if(!c) return;
+
+ var parentInstance;
+ if (this.options.greedy) {
+ var parent = this.element.parents(':data(droppable):eq(0)');
+ if (parent.length) {
+ parentInstance = $.data(parent[0], 'droppable');
+ parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
+ }
+ }
+
+ // we just moved into a greedy child
+ if (parentInstance && c == 'isover') {
+ parentInstance['isover'] = 0;
+ parentInstance['isout'] = 1;
+ parentInstance._out.call(parentInstance, event);
+ }
+
+ this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
+ this[c == "isover" ? "_over" : "_out"].call(this, event);
+
+ // we just moved out of a greedy child
+ if (parentInstance && c == 'isout') {
+ parentInstance['isout'] = 0;
+ parentInstance['isover'] = 1;
+ parentInstance._over.call(parentInstance, event);
+ }
+ });
+
+ },
+ dragStop: function( draggable, event ) {
+ draggable.element.parents( ":not(body,html)" ).unbind( "scroll.droppable" );
+ //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
+ if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
+ }
+};
+
+})(jQuery);
+/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.resizable", $.ui.mouse, {
+ widgetEventPrefix: "resize",
+ options: {
+ alsoResize: false,
+ animate: false,
+ animateDuration: "slow",
+ animateEasing: "swing",
+ aspectRatio: false,
+ autoHide: false,
+ containment: false,
+ ghost: false,
+ grid: false,
+ handles: "e,s,se",
+ helper: false,
+ maxHeight: null,
+ maxWidth: null,
+ minHeight: 10,
+ minWidth: 10,
+ zIndex: 1000
+ },
+ _create: function() {
+
+ var self = this, o = this.options;
+ this.element.addClass("ui-resizable");
+
+ $.extend(this, {
+ _aspectRatio: !!(o.aspectRatio),
+ aspectRatio: o.aspectRatio,
+ originalElement: this.element,
+ _proportionallyResizeElements: [],
+ _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
+ });
+
+ //Wrap the element if it cannot hold child nodes
+ if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
+
+ //Opera fix for relative positioning
+ if (/relative/.test(this.element.css('position')) && $.browser.opera)
+ this.element.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ //Create a wrapper element and set the wrapper to the new current internal element
+ this.element.wrap(
+ $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
+ position: this.element.css('position'),
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight(),
+ top: this.element.css('top'),
+ left: this.element.css('left')
+ })
+ );
+
+ //Overwrite the original this.element
+ this.element = this.element.parent().data(
+ "resizable", this.element.data('resizable')
+ );
+
+ this.elementIsWrapper = true;
+
+ //Move margins to the wrapper
+ this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
+ this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
+
+ //Prevent Safari textarea resize
+ this.originalResizeStyle = this.originalElement.css('resize');
+ this.originalElement.css('resize', 'none');
+
+ //Push the actual element to our proportionallyResize internal array
+ this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
+
+ // avoid IE jump (hard set the margin)
+ this.originalElement.css({ margin: this.originalElement.css('margin') });
+
+ // fix handlers offset
+ this._proportionallyResize();
+
+ }
+
+ this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
+ if(this.handles.constructor == String) {
+
+ if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
+ var n = this.handles.split(","); this.handles = {};
+
+ for(var i = 0; i < n.length; i++) {
+
+ var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
+ var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
+
+ // increase zIndex of sw, se, ne, nw axis
+ //TODO : this modifies original option
+ if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
+
+ //TODO : What's going on here?
+ if ('se' == handle) {
+ axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
+ };
+
+ //Insert into internal handles object and append to element
+ this.handles[handle] = '.ui-resizable-'+handle;
+ this.element.append(axis);
+ }
+
+ }
+
+ this._renderAxis = function(target) {
+
+ target = target || this.element;
+
+ for(var i in this.handles) {
+
+ if(this.handles[i].constructor == String)
+ this.handles[i] = $(this.handles[i], this.element).show();
+
+ //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
+ if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
+
+ var axis = $(this.handles[i], this.element), padWrapper = 0;
+
+ //Checking the correct pad and border
+ padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+ //The padding type i have to apply...
+ var padPos = [ 'padding',
+ /ne|nw|n/.test(i) ? 'Top' :
+ /se|sw|s/.test(i) ? 'Bottom' :
+ /^e$/.test(i) ? 'Right' : 'Left' ].join("");
+
+ target.css(padPos, padWrapper);
+
+ this._proportionallyResize();
+
+ }
+
+ //TODO: What's that good for? There's not anything to be executed left
+ if(!$(this.handles[i]).length)
+ continue;
+
+ }
+ };
+
+ //TODO: make renderAxis a prototype function
+ this._renderAxis(this.element);
+
+ this._handles = $('.ui-resizable-handle', this.element)
+ .disableSelection();
+
+ //Matching axis name
+ this._handles.mouseover(function() {
+ if (!self.resizing) {
+ if (this.className)
+ var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+ //Axis, default = se
+ self.axis = axis && axis[1] ? axis[1] : 'se';
+ }
+ });
+
+ //If we want to auto hide the elements
+ if (o.autoHide) {
+ this._handles.hide();
+ $(this.element)
+ .addClass("ui-resizable-autohide")
+ .hover(function() {
+ if (o.disabled) return;
+ $(this).removeClass("ui-resizable-autohide");
+ self._handles.show();
+ },
+ function(){
+ if (o.disabled) return;
+ if (!self.resizing) {
+ $(this).addClass("ui-resizable-autohide");
+ self._handles.hide();
+ }
+ });
+ }
+
+ //Initialize the mouse interaction
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+
+ this._mouseDestroy();
+
+ var _destroy = function(exp) {
+ $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+ .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+ };
+
+ //TODO: Unwrap at same DOM position
+ if (this.elementIsWrapper) {
+ _destroy(this.element);
+ var wrapper = this.element;
+ wrapper.after(
+ this.originalElement.css({
+ position: wrapper.css('position'),
+ width: wrapper.outerWidth(),
+ height: wrapper.outerHeight(),
+ top: wrapper.css('top'),
+ left: wrapper.css('left')
+ })
+ ).remove();
+ }
+
+ this.originalElement.css('resize', this.originalResizeStyle);
+ _destroy(this.originalElement);
+
+ return this;
+ },
+
+ _mouseCapture: function(event) {
+ var handle = false;
+ for (var i in this.handles) {
+ if ($(this.handles[i])[0] == event.target) {
+ handle = true;
+ }
+ }
+
+ return !this.options.disabled && handle;
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options, iniPos = this.element.position(), el = this.element;
+
+ this.resizing = true;
+ this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
+
+ // bugfix for http://dev.jquery.com/ticket/1749
+ if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
+ el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
+ }
+
+ //Opera fixing relative position
+ if ($.browser.opera && (/relative/).test(el.css('position')))
+ el.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ this._renderProxy();
+
+ var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
+
+ if (o.containment) {
+ curleft += $(o.containment).scrollLeft() || 0;
+ curtop += $(o.containment).scrollTop() || 0;
+ }
+
+ //Store needed variables
+ this.offset = this.helper.offset();
+ this.position = { left: curleft, top: curtop };
+ this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+ this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+ this.originalPosition = { left: curleft, top: curtop };
+ this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
+ this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+ //Aspect Ratio
+ this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
+
+ var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+ $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+
+ el.addClass("ui-resizable-resizing");
+ this._propagate("start", event);
+ return true;
+ },
+
+ _mouseDrag: function(event) {
+
+ //Increase performance, avoid regex
+ var el = this.helper, o = this.options, props = {},
+ self = this, smp = this.originalMousePosition, a = this.axis;
+
+ var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
+ var trigger = this._change[a];
+ if (!trigger) return false;
+
+ // Calculate the attrs that will be change
+ var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+
+ // Put this in the mouseDrag handler since the user can start pressing shift while resizing
+ this._updateVirtualBoundaries(event.shiftKey);
+ if (this._aspectRatio || event.shiftKey)
+ data = this._updateRatio(data, event);
+
+ data = this._respectSize(data, event);
+
+ // plugins callbacks need to be called first
+ this._propagate("resize", event);
+
+ el.css({
+ top: this.position.top + "px", left: this.position.left + "px",
+ width: this.size.width + "px", height: this.size.height + "px"
+ });
+
+ if (!this._helper && this._proportionallyResizeElements.length)
+ this._proportionallyResize();
+
+ this._updateCache(data);
+
+ // calling the user callback at the end
+ this._trigger('resize', event, this.ui());
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ this.resizing = false;
+ var o = this.options, self = this;
+
+ if(this._helper) {
+ var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+ soffsetw = ista ? 0 : self.sizeDiff.width;
+
+ var s = { width: (self.helper.width() - soffsetw), height: (self.helper.height() - soffseth) },
+ left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+ top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+ if (!o.animate)
+ this.element.css($.extend(s, { top: top, left: left }));
+
+ self.helper.height(self.size.height);
+ self.helper.width(self.size.width);
+
+ if (this._helper && !o.animate) this._proportionallyResize();
+ }
+
+ $('body').css('cursor', 'auto');
+
+ this.element.removeClass("ui-resizable-resizing");
+
+ this._propagate("stop", event);
+
+ if (this._helper) this.helper.remove();
+ return false;
+
+ },
+
+ _updateVirtualBoundaries: function(forceAspectRatio) {
+ var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
+
+ b = {
+ minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
+ maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+ minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
+ maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
+ };
+
+ if(this._aspectRatio || forceAspectRatio) {
+ // We want to create an enclosing box whose aspect ration is the requested one
+ // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
+ pMinWidth = b.minHeight * this.aspectRatio;
+ pMinHeight = b.minWidth / this.aspectRatio;
+ pMaxWidth = b.maxHeight * this.aspectRatio;
+ pMaxHeight = b.maxWidth / this.aspectRatio;
+
+ if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
+ if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
+ if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
+ if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
+ }
+ this._vBoundaries = b;
+ },
+
+ _updateCache: function(data) {
+ var o = this.options;
+ this.offset = this.helper.offset();
+ if (isNumber(data.left)) this.position.left = data.left;
+ if (isNumber(data.top)) this.position.top = data.top;
+ if (isNumber(data.height)) this.size.height = data.height;
+ if (isNumber(data.width)) this.size.width = data.width;
+ },
+
+ _updateRatio: function(data, event) {
+
+ var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
+
+ if (isNumber(data.height)) data.width = (data.height * this.aspectRatio);
+ else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio);
+
+ if (a == 'sw') {
+ data.left = cpos.left + (csize.width - data.width);
+ data.top = null;
+ }
+ if (a == 'nw') {
+ data.top = cpos.top + (csize.height - data.height);
+ data.left = cpos.left + (csize.width - data.width);
+ }
+
+ return data;
+ },
+
+ _respectSize: function(data, event) {
+
+ var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
+ ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
+ isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
+
+ if (isminw) data.width = o.minWidth;
+ if (isminh) data.height = o.minHeight;
+ if (ismaxw) data.width = o.maxWidth;
+ if (ismaxh) data.height = o.maxHeight;
+
+ var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
+ var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+
+ if (isminw && cw) data.left = dw - o.minWidth;
+ if (ismaxw && cw) data.left = dw - o.maxWidth;
+ if (isminh && ch) data.top = dh - o.minHeight;
+ if (ismaxh && ch) data.top = dh - o.maxHeight;
+
+ // fixing jump error on top/left - bug #2330
+ var isNotwh = !data.width && !data.height;
+ if (isNotwh && !data.left && data.top) data.top = null;
+ else if (isNotwh && !data.top && data.left) data.left = null;
+
+ return data;
+ },
+
+ _proportionallyResize: function() {
+
+ var o = this.options;
+ if (!this._proportionallyResizeElements.length) return;
+ var element = this.helper || this.element;
+
+ for (var i=0; i < this._proportionallyResizeElements.length; i++) {
+
+ var prel = this._proportionallyResizeElements[i];
+
+ if (!this.borderDif) {
+ var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
+ p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
+
+ this.borderDif = $.map(b, function(v, i) {
+ var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
+ return border + padding;
+ });
+ }
+
+ if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
+ continue;
+
+ prel.css({
+ height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
+ width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
+ });
+
+ };
+
+ },
+
+ _renderProxy: function() {
+
+ var el = this.element, o = this.options;
+ this.elementOffset = el.offset();
+
+ if(this._helper) {
+
+ this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
+
+ // fix ie6 offset TODO: This seems broken
+ var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
+ pxyoffset = ( ie6 ? 2 : -1 );
+
+ this.helper.addClass(this._helper).css({
+ width: this.element.outerWidth() + pxyoffset,
+ height: this.element.outerHeight() + pxyoffset,
+ position: 'absolute',
+ left: this.elementOffset.left - ie6offset +'px',
+ top: this.elementOffset.top - ie6offset +'px',
+ zIndex: ++o.zIndex //TODO: Don't modify option
+ });
+
+ this.helper
+ .appendTo("body")
+ .disableSelection();
+
+ } else {
+ this.helper = this.element;
+ }
+
+ },
+
+ _change: {
+ e: function(event, dx, dy) {
+ return { width: this.originalSize.width + dx };
+ },
+ w: function(event, dx, dy) {
+ var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+ return { left: sp.left + dx, width: cs.width - dx };
+ },
+ n: function(event, dx, dy) {
+ var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+ return { top: sp.top + dy, height: cs.height - dy };
+ },
+ s: function(event, dx, dy) {
+ return { height: this.originalSize.height + dy };
+ },
+ se: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+ },
+ sw: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+ },
+ ne: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+ },
+ nw: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+ }
+ },
+
+ _propagate: function(n, event) {
+ $.ui.plugin.call(this, n, [event, this.ui()]);
+ (n != "resize" && this._trigger(n, event, this.ui()));
+ },
+
+ plugins: {},
+
+ ui: function() {
+ return {
+ originalElement: this.originalElement,
+ element: this.element,
+ helper: this.helper,
+ position: this.position,
+ size: this.size,
+ originalSize: this.originalSize,
+ originalPosition: this.originalPosition
+ };
+ }
+
+});
+
+$.extend($.ui.resizable, {
+ version: "1.8.16"
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+ start: function (event, ui) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var _store = function (exp) {
+ $(exp).each(function() {
+ var el = $(this);
+ el.data("resizable-alsoresize", {
+ width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
+ left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10),
+ position: el.css('position') // to reset Opera on stop()
+ });
+ });
+ };
+
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
+ if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
+ else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
+ }else{
+ _store(o.alsoResize);
+ }
+ },
+
+ resize: function (event, ui) {
+ var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+
+ var delta = {
+ height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
+ top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+ },
+
+ _alsoResize = function (exp, c) {
+ $(exp).each(function() {
+ var el = $(this), start = $(this).data("resizable-alsoresize"), style = {},
+ css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
+
+ $.each(css, function (i, prop) {
+ var sum = (start[prop]||0) + (delta[prop]||0);
+ if (sum && sum >= 0)
+ style[prop] = sum || null;
+ });
+
+ // Opera fixing relative position
+ if ($.browser.opera && /relative/.test(el.css('position'))) {
+ self._revertToRelativePosition = true;
+ el.css({ position: 'absolute', top: 'auto', left: 'auto' });
+ }
+
+ el.css(style);
+ });
+ };
+
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+ $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
+ }else{
+ _alsoResize(o.alsoResize);
+ }
+ },
+
+ stop: function (event, ui) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var _reset = function (exp) {
+ $(exp).each(function() {
+ var el = $(this);
+ // reset position for Opera - no need to verify it was changed
+ el.css({ position: el.data("resizable-alsoresize").position });
+ });
+ };
+
+ if (self._revertToRelativePosition) {
+ self._revertToRelativePosition = false;
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+ $.each(o.alsoResize, function (exp) { _reset(exp); });
+ }else{
+ _reset(o.alsoResize);
+ }
+ }
+
+ $(this).removeData("resizable-alsoresize");
+ }
+});
+
+$.ui.plugin.add("resizable", "animate", {
+
+ stop: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+ soffsetw = ista ? 0 : self.sizeDiff.width;
+
+ var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+ left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+ top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+ self.element.animate(
+ $.extend(style, top && left ? { top: top, left: left } : {}), {
+ duration: o.animateDuration,
+ easing: o.animateEasing,
+ step: function() {
+
+ var data = {
+ width: parseInt(self.element.css('width'), 10),
+ height: parseInt(self.element.css('height'), 10),
+ top: parseInt(self.element.css('top'), 10),
+ left: parseInt(self.element.css('left'), 10)
+ };
+
+ if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
+
+ // propagating resize, and updating values for each animation step
+ self._updateCache(data);
+ self._propagate("resize", event);
+
+ }
+ }
+ );
+ }
+
+});
+
+$.ui.plugin.add("resizable", "containment", {
+
+ start: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options, el = self.element;
+ var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
+ if (!ce) return;
+
+ self.containerElement = $(ce);
+
+ if (/document/.test(oc) || oc == document) {
+ self.containerOffset = { left: 0, top: 0 };
+ self.containerPosition = { left: 0, top: 0 };
+
+ self.parentData = {
+ element: $(document), left: 0, top: 0,
+ width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
+ };
+ }
+
+ // i'm a node, so compute top, left, right, bottom
+ else {
+ var element = $(ce), p = [];
+ $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
+
+ self.containerOffset = element.offset();
+ self.containerPosition = element.position();
+ self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+
+ var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width,
+ width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
+
+ self.parentData = {
+ element: ce, left: co.left, top: co.top, width: width, height: height
+ };
+ }
+ },
+
+ resize: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options,
+ ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
+ pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+
+ if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
+
+ if (cp.left < (self._helper ? co.left : 0)) {
+ self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
+ if (pRatio) self.size.height = self.size.width / o.aspectRatio;
+ self.position.left = o.helper ? co.left : 0;
+ }
+
+ if (cp.top < (self._helper ? co.top : 0)) {
+ self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
+ if (pRatio) self.size.width = self.size.height * o.aspectRatio;
+ self.position.top = self._helper ? co.top : 0;
+ }
+
+ self.offset.left = self.parentData.left+self.position.left;
+ self.offset.top = self.parentData.top+self.position.top;
+
+ var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
+ hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+
+ var isParent = self.containerElement.get(0) == self.element.parent().get(0),
+ isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+
+ if(isParent && isOffsetRelative) woset -= self.parentData.left;
+
+ if (woset + self.size.width >= self.parentData.width) {
+ self.size.width = self.parentData.width - woset;
+ if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+ }
+
+ if (hoset + self.size.height >= self.parentData.height) {
+ self.size.height = self.parentData.height - hoset;
+ if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+ }
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options, cp = self.position,
+ co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+
+ var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+
+ if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+ $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+ if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+ $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+ }
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+ start: function(event, ui) {
+
+ var self = $(this).data("resizable"), o = self.options, cs = self.size;
+
+ self.ghost = self.originalElement.clone();
+ self.ghost
+ .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
+ .addClass('ui-resizable-ghost')
+ .addClass(typeof o.ghost == 'string' ? o.ghost : '');
+
+ self.ghost.appendTo(self.helper);
+
+ },
+
+ resize: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options;
+ if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options;
+ if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+ }
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+ resize: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+ o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
+ var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
+
+ if (/^(se|s|e)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ }
+ else if (/^(ne)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.top = op.top - oy;
+ }
+ else if (/^(sw)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.left = op.left - ox;
+ }
+ else {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.top = op.top - oy;
+ self.position.left = op.left - ox;
+ }
+ }
+
+});
+
+var num = function(v) {
+ return parseInt(v, 10) || 0;
+};
+
+var isNumber = function(value) {
+ return !isNaN(parseInt(value, 10));
+};
+
+})(jQuery);
+/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.selectable", $.ui.mouse, {
+ options: {
+ appendTo: 'body',
+ autoRefresh: true,
+ distance: 0,
+ filter: '*',
+ tolerance: 'touch'
+ },
+ _create: function() {
+ var self = this;
+
+ this.element.addClass("ui-selectable");
+
+ this.dragged = false;
+
+ // cache selectee children based on filter
+ var selectees;
+ this.refresh = function() {
+ selectees = $(self.options.filter, self.element[0]);
+ selectees.each(function() {
+ var $this = $(this);
+ var pos = $this.offset();
+ $.data(this, "selectable-item", {
+ element: this,
+ $element: $this,
+ left: pos.left,
+ top: pos.top,
+ right: pos.left + $this.outerWidth(),
+ bottom: pos.top + $this.outerHeight(),
+ startselected: false,
+ selected: $this.hasClass('ui-selected'),
+ selecting: $this.hasClass('ui-selecting'),
+ unselecting: $this.hasClass('ui-unselecting')
+ });
+ });
+ };
+ this.refresh();
+
+ this.selectees = selectees.addClass("ui-selectee");
+
+ this._mouseInit();
+
+ this.helper = $("<div class='ui-selectable-helper'></div>");
+ },
+
+ destroy: function() {
+ this.selectees
+ .removeClass("ui-selectee")
+ .removeData("selectable-item");
+ this.element
+ .removeClass("ui-selectable ui-selectable-disabled")
+ .removeData("selectable")
+ .unbind(".selectable");
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseStart: function(event) {
+ var self = this;
+
+ this.opos = [event.pageX, event.pageY];
+
+ if (this.options.disabled)
+ return;
+
+ var options = this.options;
+
+ this.selectees = $(options.filter, this.element[0]);
+
+ this._trigger("start", event);
+
+ $(options.appendTo).append(this.helper);
+ // position helper (lasso)
+ this.helper.css({
+ "left": event.clientX,
+ "top": event.clientY,
+ "width": 0,
+ "height": 0
+ });
+
+ if (options.autoRefresh) {
+ this.refresh();
+ }
+
+ this.selectees.filter('.ui-selected').each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.startselected = true;
+ if (!event.metaKey) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ });
+
+ $(event.target).parents().andSelf().each(function() {
+ var selectee = $.data(this, "selectable-item");
+ if (selectee) {
+ var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
+ selectee.$element
+ .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
+ .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
+ selectee.unselecting = !doSelect;
+ selectee.selecting = doSelect;
+ selectee.selected = doSelect;
+ // selectable (UN)SELECTING callback
+ if (doSelect) {
+ self._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ } else {
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ return false;
+ }
+ });
+
+ },
+
+ _mouseDrag: function(event) {
+ var self = this;
+ this.dragged = true;
+
+ if (this.options.disabled)
+ return;
+
+ var options = this.options;
+
+ var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
+ if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
+ if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
+ this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
+
+ this.selectees.each(function() {
+ var selectee = $.data(this, "selectable-item");
+ //prevent helper from being selected if appendTo: selectable
+ if (!selectee || selectee.element == self.element[0])
+ return;
+ var hit = false;
+ if (options.tolerance == 'touch') {
+ hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
+ } else if (options.tolerance == 'fit') {
+ hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
+ }
+
+ if (hit) {
+ // SELECT
+ if (selectee.selected) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+ }
+ if (selectee.unselecting) {
+ selectee.$element.removeClass('ui-unselecting');
+ selectee.unselecting = false;
+ }
+ if (!selectee.selecting) {
+ selectee.$element.addClass('ui-selecting');
+ selectee.selecting = true;
+ // selectable SELECTING callback
+ self._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ }
+ } else {
+ // UNSELECT
+ if (selectee.selecting) {
+ if (event.metaKey && selectee.startselected) {
+ selectee.$element.removeClass('ui-selecting');
+ selectee.selecting = false;
+ selectee.$element.addClass('ui-selected');
+ selectee.selected = true;
+ } else {
+ selectee.$element.removeClass('ui-selecting');
+ selectee.selecting = false;
+ if (selectee.startselected) {
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ }
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ if (selectee.selected) {
+ if (!event.metaKey && !selectee.startselected) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ }
+ });
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+ var self = this;
+
+ this.dragged = false;
+
+ var options = this.options;
+
+ $('.ui-unselecting', this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass('ui-unselecting');
+ selectee.unselecting = false;
+ selectee.startselected = false;
+ self._trigger("unselected", event, {
+ unselected: selectee.element
+ });
+ });
+ $('.ui-selecting', this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
+ selectee.selecting = false;
+ selectee.selected = true;
+ selectee.startselected = true;
+ self._trigger("selected", event, {
+ selected: selectee.element
+ });
+ });
+ this._trigger("stop", event);
+
+ this.helper.remove();
+
+ return false;
+ }
+
+});
+
+$.extend($.ui.selectable, {
+ version: "1.8.16"
+});
+
+})(jQuery);
+/*
+ * jQuery UI Sortable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.sortable", $.ui.mouse, {
+ widgetEventPrefix: "sort",
+ options: {
+ appendTo: "parent",
+ axis: false,
+ connectWith: false,
+ containment: false,
+ cursor: 'auto',
+ cursorAt: false,
+ dropOnEmpty: true,
+ forcePlaceholderSize: false,
+ forceHelperSize: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ items: '> *',
+ opacity: false,
+ placeholder: false,
+ revert: false,
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ scope: "default",
+ tolerance: "intersect",
+ zIndex: 1000
+ },
+ _create: function() {
+
+ var o = this.options;
+ this.containerCache = {};
+ this.element.addClass("ui-sortable");
+
+ //Get the items
+ this.refresh();
+
+ //Let's determine if the items are being displayed horizontally
+ this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
+
+ //Let's determine the parent's offset
+ this.offset = this.element.offset();
+
+ //Initialize mouse events for interaction
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass("ui-sortable ui-sortable-disabled")
+ .removeData("sortable")
+ .unbind(".sortable");
+ this._mouseDestroy();
+
+ for ( var i = this.items.length - 1; i >= 0; i-- )
+ this.items[i].item.removeData("sortable-item");
+
+ return this;
+ },
+
+ _setOption: function(key, value){
+ if ( key === "disabled" ) {
+ this.options[ key ] = value;
+
+ this.widget()
+ [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
+ } else {
+ // Don't call widget base _setOption for disable as it adds ui-state-disabled class
+ $.Widget.prototype._setOption.apply(this, arguments);
+ }
+ },
+
+ _mouseCapture: function(event, overrideHandle) {
+
+ if (this.reverting) {
+ return false;
+ }
+
+ if(this.options.disabled || this.options.type == 'static') return false;
+
+ //We have to refresh the items data once first
+ this._refreshItems(event);
+
+ //Find out if the clicked node (or one of its parents) is a actual item in this.items
+ var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
+ if($.data(this, 'sortable-item') == self) {
+ currentItem = $(this);
+ return false;
+ }
+ });
+ if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);
+
+ if(!currentItem) return false;
+ if(this.options.handle && !overrideHandle) {
+ var validHandle = false;
+
+ $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
+ if(!validHandle) return false;
+ }
+
+ this.currentItem = currentItem;
+ this._removeCurrentsFromItems();
+ return true;
+
+ },
+
+ _mouseStart: function(event, overrideHandle, noActivation) {
+
+ var o = this.options, self = this;
+ this.currentContainer = this;
+
+ //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
+ this.refreshPositions();
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Get the next scrolling parent
+ this.scrollParent = this.helper.scrollParent();
+
+ //The element's absolute position on the page minus margins
+ this.offset = this.currentItem.offset();
+ this.offset = {
+ top: this.offset.top - this.margins.top,
+ left: this.offset.left - this.margins.left
+ };
+
+ // Only after we got the offset, we can change the helper's position to absolute
+ // TODO: Still need to figure out a way to make relative sorting possible
+ this.helper.css("position", "absolute");
+ this.cssPosition = this.helper.css("position");
+
+ $.extend(this.offset, {
+ click: { //Where the click happened, relative to the element
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ },
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+ });
+
+ //Generate the original position
+ this.originalPosition = this._generatePosition(event);
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Cache the former DOM position
+ this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
+
+ //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
+ if(this.helper[0] != this.currentItem[0]) {
+ this.currentItem.hide();
+ }
+
+ //Create the placeholder
+ this._createPlaceholder();
+
+ //Set a containment if given in the options
+ if(o.containment)
+ this._setContainment();
+
+ if(o.cursor) { // cursor option
+ if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
+ $('body').css("cursor", o.cursor);
+ }
+
+ if(o.opacity) { // opacity option
+ if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
+ this.helper.css("opacity", o.opacity);
+ }
+
+ if(o.zIndex) { // zIndex option
+ if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
+ this.helper.css("zIndex", o.zIndex);
+ }
+
+ //Prepare scrolling
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
+ this.overflowOffset = this.scrollParent.offset();
+
+ //Call callbacks
+ this._trigger("start", event, this._uiHash());
+
+ //Recache the helper size
+ if(!this._preserveHelperProportions)
+ this._cacheHelperProportions();
+
+
+ //Post 'activate' events to possible containers
+ if(!noActivation) {
+ for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
+ }
+
+ //Prepare possible droppables
+ if($.ui.ddmanager)
+ $.ui.ddmanager.current = this;
+
+ if ($.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+
+ this.dragging = true;
+
+ this.helper.addClass("ui-sortable-helper");
+ this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+ return true;
+
+ },
+
+ _mouseDrag: function(event) {
+
+ //Compute the helpers position
+ this.position = this._generatePosition(event);
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ if (!this.lastPositionAbs) {
+ this.lastPositionAbs = this.positionAbs;
+ }
+
+ //Do scrolling
+ if(this.options.scroll) {
+ var o = this.options, scrolled = false;
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
+
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
+ else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
+
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
+ else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
+
+ } else {
+
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+
+ }
+
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+ }
+
+ //Regenerate the absolute position used for position checks
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Set the helper position
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+
+ //Rearrange
+ for (var i = this.items.length - 1; i >= 0; i--) {
+
+ //Cache variables and intersection, continue if no intersection
+ var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
+ if (!intersection) continue;
+
+ if(itemElement != this.currentItem[0] //cannot intersect with itself
+ && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
+ && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
+ && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
+ //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
+ ) {
+
+ this.direction = intersection == 1 ? "down" : "up";
+
+ if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
+ this._rearrange(event, item);
+ } else {
+ break;
+ }
+
+ this._trigger("change", event, this._uiHash());
+ break;
+ }
+ }
+
+ //Post events to containers
+ this._contactContainers(event);
+
+ //Interconnect with droppables
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+ //Call callbacks
+ this._trigger('sort', event, this._uiHash());
+
+ this.lastPositionAbs = this.positionAbs;
+ return false;
+
+ },
+
+ _mouseStop: function(event, noPropagation) {
+
+ if(!event) return;
+
+ //If we are using droppables, inform the manager about the drop
+ if ($.ui.ddmanager && !this.options.dropBehaviour)
+ $.ui.ddmanager.drop(this, event);
+
+ if(this.options.revert) {
+ var self = this;
+ var cur = self.placeholder.offset();
+
+ self.reverting = true;
+
+ $(this.helper).animate({
+ left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
+ top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
+ }, parseInt(this.options.revert, 10) || 500, function() {
+ self._clear(event);
+ });
+ } else {
+ this._clear(event, noPropagation);
+ }
+
+ return false;
+
+ },
+
+ cancel: function() {
+
+ var self = this;
+
+ if(this.dragging) {
+
+ this._mouseUp({ target: null });
+
+ if(this.options.helper == "original")
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ else
+ this.currentItem.show();
+
+ //Post deactivating events to containers
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ this.containers[i]._trigger("deactivate", null, self._uiHash(this));
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", null, self._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ if (this.placeholder) {
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+ if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+ if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
+
+ $.extend(this, {
+ helper: null,
+ dragging: false,
+ reverting: false,
+ _noFinalSort: null
+ });
+
+ if(this.domPosition.prev) {
+ $(this.domPosition.prev).after(this.currentItem);
+ } else {
+ $(this.domPosition.parent).prepend(this.currentItem);
+ }
+ }
+
+ return this;
+
+ },
+
+ serialize: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected);
+ var str = []; o = o || {};
+
+ $(items).each(function() {
+ var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
+ if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
+ });
+
+ if(!str.length && o.key) {
+ str.push(o.key + '=');
+ }
+
+ return str.join('&');
+
+ },
+
+ toArray: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected);
+ var ret = []; o = o || {};
+
+ items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
+ return ret;
+
+ },
+
+ /* Be careful with the following core functions */
+ _intersectsWith: function(item) {
+
+ var x1 = this.positionAbs.left,
+ x2 = x1 + this.helperProportions.width,
+ y1 = this.positionAbs.top,
+ y2 = y1 + this.helperProportions.height;
+
+ var l = item.left,
+ r = l + item.width,
+ t = item.top,
+ b = t + item.height;
+
+ var dyClick = this.offset.click.top,
+ dxClick = this.offset.click.left;
+
+ var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
+
+ if( this.options.tolerance == "pointer"
+ || this.options.forcePointerForContainers
+ || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
+ ) {
+ return isOverElement;
+ } else {
+
+ return (l < x1 + (this.helperProportions.width / 2) // Right Half
+ && x2 - (this.helperProportions.width / 2) < r // Left Half
+ && t < y1 + (this.helperProportions.height / 2) // Bottom Half
+ && y2 - (this.helperProportions.height / 2) < b ); // Top Half
+
+ }
+ },
+
+ _intersectsWithPointer: function(item) {
+
+ var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+ isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+ isOverElement = isOverElementHeight && isOverElementWidth,
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (!isOverElement)
+ return false;
+
+ return this.floating ?
+ ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
+ : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
+
+ },
+
+ _intersectsWithSides: function(item) {
+
+ var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
+ isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (this.floating && horizontalDirection) {
+ return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
+ } else {
+ return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
+ }
+
+ },
+
+ _getDragVerticalDirection: function() {
+ var delta = this.positionAbs.top - this.lastPositionAbs.top;
+ return delta != 0 && (delta > 0 ? "down" : "up");
+ },
+
+ _getDragHorizontalDirection: function() {
+ var delta = this.positionAbs.left - this.lastPositionAbs.left;
+ return delta != 0 && (delta > 0 ? "right" : "left");
+ },
+
+ refresh: function(event) {
+ this._refreshItems(event);
+ this.refreshPositions();
+ return this;
+ },
+
+ _connectWith: function() {
+ var options = this.options;
+ return options.connectWith.constructor == String
+ ? [options.connectWith]
+ : options.connectWith;
+ },
+
+ _getItemsAsjQuery: function(connected) {
+
+ var self = this;
+ var items = [];
+ var queries = [];
+ var connectWith = this._connectWith();
+
+ if(connectWith && connected) {
+ for (var i = connectWith.length - 1; i >= 0; i--){
+ var cur = $(connectWith[i]);
+ for (var j = cur.length - 1; j >= 0; j--){
+ var inst = $.data(cur[j], 'sortable');
+ if(inst && inst != this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
+ }
+ };
+ };
+ }
+
+ queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
+
+ for (var i = queries.length - 1; i >= 0; i--){
+ queries[i][0].each(function() {
+ items.push(this);
+ });
+ };
+
+ return $(items);
+
+ },
+
+ _removeCurrentsFromItems: function() {
+
+ var list = this.currentItem.find(":data(sortable-item)");
+
+ for (var i=0; i < this.items.length; i++) {
+
+ for (var j=0; j < list.length; j++) {
+ if(list[j] == this.items[i].item[0])
+ this.items.splice(i,1);
+ };
+
+ };
+
+ },
+
+ _refreshItems: function(event) {
+
+ this.items = [];
+ this.containers = [this];
+ var items = this.items;
+ var self = this;
+ var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
+ var connectWith = this._connectWith();
+
+ if(connectWith) {
+ for (var i = connectWith.length - 1; i >= 0; i--){
+ var cur = $(connectWith[i]);
+ for (var j = cur.length - 1; j >= 0; j--){
+ var inst = $.data(cur[j], 'sortable');
+ if(inst && inst != this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
+ this.containers.push(inst);
+ }
+ };
+ };
+ }
+
+ for (var i = queries.length - 1; i >= 0; i--) {
+ var targetData = queries[i][1];
+ var _queries = queries[i][0];
+
+ for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
+ var item = $(_queries[j]);
+
+ item.data('sortable-item', targetData); // Data for target checking (mouse manager)
+
+ items.push({
+ item: item,
+ instance: targetData,
+ width: 0, height: 0,
+ left: 0, top: 0
+ });
+ };
+ };
+
+ },
+
+ refreshPositions: function(fast) {
+
+ //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
+ if(this.offsetParent && this.helper) {
+ this.offset.parent = this._getParentOffset();
+ }
+
+ for (var i = this.items.length - 1; i >= 0; i--){
+ var item = this.items[i];
+
+ //We ignore calculating positions of all connected containers when we're not over them
+ if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
+ continue;
+
+ var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
+
+ if (!fast) {
+ item.width = t.outerWidth();
+ item.height = t.outerHeight();
+ }
+
+ var p = t.offset();
+ item.left = p.left;
+ item.top = p.top;
+ };
+
+ if(this.options.custom && this.options.custom.refreshContainers) {
+ this.options.custom.refreshContainers.call(this);
+ } else {
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ var p = this.containers[i].element.offset();
+ this.containers[i].containerCache.left = p.left;
+ this.containers[i].containerCache.top = p.top;
+ this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
+ this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
+ };
+ }
+
+ return this;
+ },
+
+ _createPlaceholder: function(that) {
+
+ var self = that || this, o = self.options;
+
+ if(!o.placeholder || o.placeholder.constructor == String) {
+ var className = o.placeholder;
+ o.placeholder = {
+ element: function() {
+
+ var el = $(document.createElement(self.currentItem[0].nodeName))
+ .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
+ .removeClass("ui-sortable-helper")[0];
+
+ if(!className)
+ el.style.visibility = "hidden";
+
+ return el;
+ },
+ update: function(container, p) {
+
+ // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
+ if(className && !o.forcePlaceholderSize) return;
+
+ //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
+ if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
+ if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
+ }
+ };
+ }
+
+ //Create the placeholder
+ self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
+
+ //Append it after the actual current item
+ self.currentItem.after(self.placeholder);
+
+ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+ o.placeholder.update(self, self.placeholder);
+
+ },
+
+ _contactContainers: function(event) {
+
+ // get innermost container that intersects with item
+ var innermostContainer = null, innermostIndex = null;
+
+
+ for (var i = this.containers.length - 1; i >= 0; i--){
+
+ // never consider a container that's located within the item itself
+ if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
+ continue;
+
+ if(this._intersectsWith(this.containers[i].containerCache)) {
+
+ // if we've already found a container and it's more "inner" than this, then continue
+ if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
+ continue;
+
+ innermostContainer = this.containers[i];
+ innermostIndex = i;
+
+ } else {
+ // container doesn't intersect. trigger "out" event if necessary
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", event, this._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ // if no intersecting containers found, return
+ if(!innermostContainer) return;
+
+ // move the item into the container if it's not there already
+ if(this.containers.length === 1) {
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ } else if(this.currentContainer != this.containers[innermostIndex]) {
+
+ //When entering a new container, we will find the item with the least distance and append our item near it
+ var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
+ for (var j = this.items.length - 1; j >= 0; j--) {
+ if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
+ var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top'];
+ if(Math.abs(cur - base) < dist) {
+ dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
+ }
+ }
+
+ if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
+ return;
+
+ this.currentContainer = this.containers[innermostIndex];
+ itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
+ this._trigger("change", event, this._uiHash());
+ this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
+
+ //Update the placeholder
+ this.options.placeholder.update(this.currentContainer, this.placeholder);
+
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ }
+
+
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options;
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
+
+ if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
+ $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+
+ if(helper[0] == this.currentItem[0])
+ this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
+
+ if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
+ if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
+
+ return helper;
+
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj == 'string') {
+ obj = obj.split(' ');
+ }
+ if ($.isArray(obj)) {
+ obj = {left: +obj[0], top: +obj[1] || 0};
+ }
+ if ('left' in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ('right' in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+ }
+ if ('top' in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ('bottom' in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+ }
+ },
+
+ _getParentOffset: function() {
+
+
+ //Get the offsetParent and cache its position
+ this.offsetParent = this.helper.offsetParent();
+ var po = this.offsetParent.offset();
+
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+ if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+ || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+ po = { top: 0, left: 0 };
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+
+ if(this.cssPosition == "relative") {
+ var p = this.currentItem.position();
+ return {
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+ };
+ } else {
+ return { top: 0, left: 0 };
+ }
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
+ top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var o = this.options;
+ if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+ if(o.containment == 'document' || o.containment == 'window') this.containment = [
+ 0 - this.offset.relative.left - this.offset.parent.left,
+ 0 - this.offset.relative.top - this.offset.parent.top,
+ $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+ ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+ ];
+
+ if(!(/^(document|window|parent)$/).test(o.containment)) {
+ var ce = $(o.containment)[0];
+ var co = $(o.containment).offset();
+ var over = ($(ce).css("overflow") != 'hidden');
+
+ this.containment = [
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+ ];
+ }
+
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if(!pos) pos = this.position;
+ var mod = d == "absolute" ? 1 : -1;
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ return {
+ top: (
+ pos.top // The absolute mouse position
+ + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+ ),
+ left: (
+ pos.left // The absolute mouse position
+ + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function(event) {
+
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ // This is another very weird special case that only happens for relative elements:
+ // 1. If the css position is relative
+ // 2. and the scroll parent is the document or similar to the offset parent
+ // we have to refresh the relative offset during the scroll so there are no jumps
+ if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
+ this.offset.relative = this._getRelativeOffset();
+ }
+
+ var pageX = event.pageX;
+ var pageY = event.pageY;
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+ if(this.containment) {
+ if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+ if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+ }
+
+ if(o.grid) {
+ var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+ pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+ var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+ pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ }
+
+ }
+
+ return {
+ top: (
+ pageY // The absolute mouse position
+ - this.offset.click.top // Click offset (relative to the element)
+ - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+ ),
+ left: (
+ pageX // The absolute mouse position
+ - this.offset.click.left // Click offset (relative to the element)
+ - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+ )
+ };
+
+ },
+
+ _rearrange: function(event, i, a, hardRefresh) {
+
+ a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
+
+ //Various things done here to improve the performance:
+ // 1. we create a setTimeout, that calls refreshPositions
+ // 2. on the instance, we have a counter variable, that get's higher after every append
+ // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
+ // 4. this lets only the last addition to the timeout stack through
+ this.counter = this.counter ? ++this.counter : 1;
+ var self = this, counter = this.counter;
+
+ window.setTimeout(function() {
+ if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
+ },0);
+
+ },
+
+ _clear: function(event, noPropagation) {
+
+ this.reverting = false;
+ // We delay all events that have to be triggered to after the point where the placeholder has been removed and
+ // everything else normalized again
+ var delayedTriggers = [], self = this;
+
+ // We first have to update the dom position of the actual currentItem
+ // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
+ if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
+ this._noFinalSort = null;
+
+ if(this.helper[0] == this.currentItem[0]) {
+ for(var i in this._storedCSS) {
+ if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
+ }
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ } else {
+ this.currentItem.show();
+ }
+
+ if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
+ if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
+ if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
+ if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ }
+ };
+ };
+
+ //Post events to containers
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ if(this.containers[i].containerCache.over) {
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ //Do what was originally in plugins
+ if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
+ if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
+ if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
+
+ this.dragging = false;
+ if(this.cancelHelperRemoval) {
+ if(!noPropagation) {
+ this._trigger("beforeStop", event, this._uiHash());
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+ this._trigger("stop", event, this._uiHash());
+ }
+ return false;
+ }
+
+ if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
+
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+
+ if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
+
+ if(!noPropagation) {
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+ this._trigger("stop", event, this._uiHash());
+ }
+
+ this.fromOutside = false;
+ return true;
+
+ },
+
+ _trigger: function() {
+ if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
+ this.cancel();
+ }
+ },
+
+ _uiHash: function(inst) {
+ var self = inst || this;
+ return {
+ helper: self.helper,
+ placeholder: self.placeholder || $([]),
+ position: self.position,
+ originalPosition: self.originalPosition,
+ offset: self.positionAbs,
+ item: self.currentItem,
+ sender: inst ? inst.element : null
+ };
+ }
+
+});
+
+$.extend($.ui.sortable, {
+ version: "1.8.16"
+});
+
+})(jQuery);
+/*
+ * jQuery UI Effects 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+;jQuery.effects || (function($, undefined) {
+
+$.effects = {};
+
+
+
+/******************************************************************************/
+/****************************** COLOR ANIMATIONS ******************************/
+/******************************************************************************/
+
+// override the animation for color styles
+$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
+ 'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
+function(i, attr) {
+ $.fx.step[attr] = function(fx) {
+ if (!fx.colorInit) {
+ fx.start = getColor(fx.elem, attr);
+ fx.end = getRGB(fx.end);
+ fx.colorInit = true;
+ }
+
+ fx.elem.style[attr] = 'rgb(' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
+ };
+});
+
+// Color Conversion functions from highlightFade
+// By Blair Mitchelmore
+// http://jquery.offput.ca/highlightFade/
+
+// Parse strings looking for color tuples [255,255,255]
+function getRGB(color) {
+ var result;
+
+ // Check if we're already dealing with an array of colors
+ if ( color && color.constructor == Array && color.length == 3 )
+ return color;
+
+ // Look for rgb(num,num,num)
+ if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
+ return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
+
+ // Look for rgb(num%,num%,num%)
+ if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
+ return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
+
+ // Look for #a0b1c2
+ if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
+ return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+
+ // Look for #fff
+ if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
+ return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+
+ // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+ if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
+ return colors['transparent'];
+
+ // Otherwise, we're most likely dealing with a named color
+ return colors[$.trim(color).toLowerCase()];
+}
+
+function getColor(elem, attr) {
+ var color;
+
+ do {
+ color = $.curCSS(elem, attr);
+
+ // Keep going until we find an element that has color, or we hit the body
+ if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
+ break;
+
+ attr = "backgroundColor";
+ } while ( elem = elem.parentNode );
+
+ return getRGB(color);
+};
+
+// Some named colors to work with
+// From Interface by Stefan Petre
+// http://interface.eyecon.ro/
+
+var colors = {
+ aqua:[0,255,255],
+ azure:[240,255,255],
+ beige:[245,245,220],
+ black:[0,0,0],
+ blue:[0,0,255],
+ brown:[165,42,42],
+ cyan:[0,255,255],
+ darkblue:[0,0,139],
+ darkcyan:[0,139,139],
+ darkgrey:[169,169,169],
+ darkgreen:[0,100,0],
+ darkkhaki:[189,183,107],
+ darkmagenta:[139,0,139],
+ darkolivegreen:[85,107,47],
+ darkorange:[255,140,0],
+ darkorchid:[153,50,204],
+ darkred:[139,0,0],
+ darksalmon:[233,150,122],
+ darkviolet:[148,0,211],
+ fuchsia:[255,0,255],
+ gold:[255,215,0],
+ green:[0,128,0],
+ indigo:[75,0,130],
+ khaki:[240,230,140],
+ lightblue:[173,216,230],
+ lightcyan:[224,255,255],
+ lightgreen:[144,238,144],
+ lightgrey:[211,211,211],
+ lightpink:[255,182,193],
+ lightyellow:[255,255,224],
+ lime:[0,255,0],
+ magenta:[255,0,255],
+ maroon:[128,0,0],
+ navy:[0,0,128],
+ olive:[128,128,0],
+ orange:[255,165,0],
+ pink:[255,192,203],
+ purple:[128,0,128],
+ violet:[128,0,128],
+ red:[255,0,0],
+ silver:[192,192,192],
+ white:[255,255,255],
+ yellow:[255,255,0],
+ transparent: [255,255,255]
+};
+
+
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+
+var classAnimationActions = ['add', 'remove', 'toggle'],
+ shorthandStyles = {
+ border: 1,
+ borderBottom: 1,
+ borderColor: 1,
+ borderLeft: 1,
+ borderRight: 1,
+ borderTop: 1,
+ borderWidth: 1,
+ margin: 1,
+ padding: 1
+ };
+
+function getElementStyles() {
+ var style = document.defaultView
+ ? document.defaultView.getComputedStyle(this, null)
+ : this.currentStyle,
+ newStyle = {},
+ key,
+ camelCase;
+
+ // webkit enumerates style porperties
+ if (style && style.length && style[0] && style[style[0]]) {
+ var len = style.length;
+ while (len--) {
+ key = style[len];
+ if (typeof style[key] == 'string') {
+ camelCase = key.replace(/\-(\w)/g, function(all, letter){
+ return letter.toUpperCase();
+ });
+ newStyle[camelCase] = style[key];
+ }
+ }
+ } else {
+ for (key in style) {
+ if (typeof style[key] === 'string') {
+ newStyle[key] = style[key];
+ }
+ }
+ }
+
+ return newStyle;
+}
+
+function filterStyles(styles) {
+ var name, value;
+ for (name in styles) {
+ value = styles[name];
+ if (
+ // ignore null and undefined values
+ value == null ||
+ // ignore functions (when does this occur?)
+ $.isFunction(value) ||
+ // shorthand styles that need to be expanded
+ name in shorthandStyles ||
+ // ignore scrollbars (break in IE)
+ (/scrollbar/).test(name) ||
+
+ // only colors or values that can be converted to numbers
+ (!(/color/i).test(name) && isNaN(parseFloat(value)))
+ ) {
+ delete styles[name];
+ }
+ }
+
+ return styles;
+}
+
+function styleDifference(oldStyle, newStyle) {
+ var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
+ name;
+
+ for (name in newStyle) {
+ if (oldStyle[name] != newStyle[name]) {
+ diff[name] = newStyle[name];
+ }
+ }
+
+ return diff;
+}
+
+$.effects.animateClass = function(value, duration, easing, callback) {
+ if ($.isFunction(easing)) {
+ callback = easing;
+ easing = null;
+ }
+
+ return this.queue(function() {
+ var that = $(this),
+ originalStyleAttr = that.attr('style') || ' ',
+ originalStyle = filterStyles(getElementStyles.call(this)),
+ newStyle,
+ className = that.attr('class');
+
+ $.each(classAnimationActions, function(i, action) {
+ if (value[action]) {
+ that[action + 'Class'](value[action]);
+ }
+ });
+ newStyle = filterStyles(getElementStyles.call(this));
+ that.attr('class', className);
+
+ that.animate(styleDifference(originalStyle, newStyle), {
+ queue: false,
+ duration: duration,
+ easing: easing,
+ complete: function() {
+ $.each(classAnimationActions, function(i, action) {
+ if (value[action]) { that[action + 'Class'](value[action]); }
+ });
+ // work around bug in IE by clearing the cssText before setting it
+ if (typeof that.attr('style') == 'object') {
+ that.attr('style').cssText = '';
+ that.attr('style').cssText = originalStyleAttr;
+ } else {
+ that.attr('style', originalStyleAttr);
+ }
+ if (callback) { callback.apply(this, arguments); }
+ $.dequeue( this );
+ }
+ });
+ });
+};
+
+$.fn.extend({
+ _addClass: $.fn.addClass,
+ addClass: function(classNames, speed, easing, callback) {
+ return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
+ },
+
+ _removeClass: $.fn.removeClass,
+ removeClass: function(classNames,speed,easing,callback) {
+ return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
+ },
+
+ _toggleClass: $.fn.toggleClass,
+ toggleClass: function(classNames, force, speed, easing, callback) {
+ if ( typeof force == "boolean" || force === undefined ) {
+ if ( !speed ) {
+ // without speed parameter;
+ return this._toggleClass(classNames, force);
+ } else {
+ return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
+ }
+ } else {
+ // without switch parameter;
+ return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
+ }
+ },
+
+ switchClass: function(remove,add,speed,easing,callback) {
+ return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
+ }
+});
+
+
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+$.extend($.effects, {
+ version: "1.8.16",
+
+ // Saves a set of properties in a data storage
+ save: function(element, set) {
+ for(var i=0; i < set.length; i++) {
+ if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
+ }
+ },
+
+ // Restores a set of previously saved properties from a data storage
+ restore: function(element, set) {
+ for(var i=0; i < set.length; i++) {
+ if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
+ }
+ },
+
+ setMode: function(el, mode) {
+ if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
+ return mode;
+ },
+
+ getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
+ // this should be a little more flexible in the future to handle a string & hash
+ var y, x;
+ switch (origin[0]) {
+ case 'top': y = 0; break;
+ case 'middle': y = 0.5; break;
+ case 'bottom': y = 1; break;
+ default: y = origin[0] / original.height;
+ };
+ switch (origin[1]) {
+ case 'left': x = 0; break;
+ case 'center': x = 0.5; break;
+ case 'right': x = 1; break;
+ default: x = origin[1] / original.width;
+ };
+ return {x: x, y: y};
+ },
+
+ // Wraps the element around a wrapper that copies position properties
+ createWrapper: function(element) {
+
+ // if the element is already wrapped, return it
+ if (element.parent().is('.ui-effects-wrapper')) {
+ return element.parent();
+ }
+
+ // wrap the element
+ var props = {
+ width: element.outerWidth(true),
+ height: element.outerHeight(true),
+ 'float': element.css('float')
+ },
+ wrapper = $('<div></div>')
+ .addClass('ui-effects-wrapper')
+ .css({
+ fontSize: '100%',
+ background: 'transparent',
+ border: 'none',
+ margin: 0,
+ padding: 0
+ }),
+ active = document.activeElement;
+
+ element.wrap(wrapper);
+
+ // Fixes #7595 - Elements lose focus when wrapped.
+ if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+ $( active ).focus();
+ }
+
+ wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
+
+ // transfer positioning properties to the wrapper
+ if (element.css('position') == 'static') {
+ wrapper.css({ position: 'relative' });
+ element.css({ position: 'relative' });
+ } else {
+ $.extend(props, {
+ position: element.css('position'),
+ zIndex: element.css('z-index')
+ });
+ $.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
+ props[pos] = element.css(pos);
+ if (isNaN(parseInt(props[pos], 10))) {
+ props[pos] = 'auto';
+ }
+ });
+ element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
+ }
+
+ return wrapper.css(props).show();
+ },
+
+ removeWrapper: function(element) {
+ var parent,
+ active = document.activeElement;
+
+ if (element.parent().is('.ui-effects-wrapper')) {
+ parent = element.parent().replaceWith(element);
+ // Fixes #7595 - Elements lose focus when wrapped.
+ if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+ $( active ).focus();
+ }
+ return parent;
+ }
+
+ return element;
+ },
+
+ setTransition: function(element, list, factor, value) {
+ value = value || {};
+ $.each(list, function(i, x){
+ unit = element.cssUnit(x);
+ if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
+ });
+ return value;
+ }
+});
+
+
+function _normalizeArguments(effect, options, speed, callback) {
+ // shift params for method overloading
+ if (typeof effect == 'object') {
+ callback = options;
+ speed = null;
+ options = effect;
+ effect = options.effect;
+ }
+ if ($.isFunction(options)) {
+ callback = options;
+ speed = null;
+ options = {};
+ }
+ if (typeof options == 'number' || $.fx.speeds[options]) {
+ callback = speed;
+ speed = options;
+ options = {};
+ }
+ if ($.isFunction(speed)) {
+ callback = speed;
+ speed = null;
+ }
+
+ options = options || {};
+
+ speed = speed || options.duration;
+ speed = $.fx.off ? 0 : typeof speed == 'number'
+ ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
+
+ callback = callback || options.complete;
+
+ return [effect, options, speed, callback];
+}
+
+function standardSpeed( speed ) {
+ // valid standard speeds
+ if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
+ return true;
+ }
+
+ // invalid strings - treat as "normal" speed
+ if ( typeof speed === "string" && !$.effects[ speed ] ) {
+ return true;
+ }
+
+ return false;
+}
+
+$.fn.extend({
+ effect: function(effect, options, speed, callback) {
+ var args = _normalizeArguments.apply(this, arguments),
+ // TODO: make effects take actual parameters instead of a hash
+ args2 = {
+ options: args[1],
+ duration: args[2],
+ callback: args[3]
+ },
+ mode = args2.options.mode,
+ effectMethod = $.effects[effect];
+
+ if ( $.fx.off || !effectMethod ) {
+ // delegate to the original method (e.g., .show()) if possible
+ if ( mode ) {
+ return this[ mode ]( args2.duration, args2.callback );
+ } else {
+ return this.each(function() {
+ if ( args2.callback ) {
+ args2.callback.call( this );
+ }
+ });
+ }
+ }
+
+ return effectMethod.call(this, args2);
+ },
+
+ _show: $.fn.show,
+ show: function(speed) {
+ if ( standardSpeed( speed ) ) {
+ return this._show.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'show';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ _hide: $.fn.hide,
+ hide: function(speed) {
+ if ( standardSpeed( speed ) ) {
+ return this._hide.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'hide';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ // jQuery core overloads toggle and creates _toggle
+ __toggle: $.fn.toggle,
+ toggle: function(speed) {
+ if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
+ return this.__toggle.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'toggle';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ // helper functions
+ cssUnit: function(key) {
+ var style = this.css(key), val = [];
+ $.each( ['em','px','%','pt'], function(i, unit){
+ if(style.indexOf(unit) > 0)
+ val = [parseFloat(style), unit];
+ });
+ return val;
+ }
+});
+
+
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2008 George McGinley Smith
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+$.easing.jswing = $.easing.swing;
+
+$.extend($.easing,
+{
+ def: 'easeOutQuad',
+ swing: function (x, t, b, c, d) {
+ //alert($.easing.default);
+ return $.easing[$.easing.def](x, t, b, c, d);
+ },
+ easeInQuad: function (x, t, b, c, d) {
+ return c*(t/=d)*t + b;
+ },
+ easeOutQuad: function (x, t, b, c, d) {
+ return -c *(t/=d)*(t-2) + b;
+ },
+ easeInOutQuad: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t + b;
+ return -c/2 * ((--t)*(t-2) - 1) + b;
+ },
+ easeInCubic: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t + b;
+ },
+ easeOutCubic: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t + 1) + b;
+ },
+ easeInOutCubic: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t + b;
+ return c/2*((t-=2)*t*t + 2) + b;
+ },
+ easeInQuart: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t + b;
+ },
+ easeOutQuart: function (x, t, b, c, d) {
+ return -c * ((t=t/d-1)*t*t*t - 1) + b;
+ },
+ easeInOutQuart: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+ return -c/2 * ((t-=2)*t*t*t - 2) + b;
+ },
+ easeInQuint: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t*t + b;
+ },
+ easeOutQuint: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t*t*t + 1) + b;
+ },
+ easeInOutQuint: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+ return c/2*((t-=2)*t*t*t*t + 2) + b;
+ },
+ easeInSine: function (x, t, b, c, d) {
+ return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+ },
+ easeOutSine: function (x, t, b, c, d) {
+ return c * Math.sin(t/d * (Math.PI/2)) + b;
+ },
+ easeInOutSine: function (x, t, b, c, d) {
+ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+ },
+ easeInExpo: function (x, t, b, c, d) {
+ return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+ },
+ easeOutExpo: function (x, t, b, c, d) {
+ return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+ },
+ easeInOutExpo: function (x, t, b, c, d) {
+ if (t==0) return b;
+ if (t==d) return b+c;
+ if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+ return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+ },
+ easeInCirc: function (x, t, b, c, d) {
+ return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+ },
+ easeOutCirc: function (x, t, b, c, d) {
+ return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+ },
+ easeInOutCirc: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+ return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+ },
+ easeInElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ },
+ easeOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+ },
+ easeInOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+ },
+ easeInBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*(t/=d)*t*((s+1)*t - s) + b;
+ },
+ easeOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+ },
+ easeInOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+ return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+ },
+ easeInBounce: function (x, t, b, c, d) {
+ return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+ },
+ easeOutBounce: function (x, t, b, c, d) {
+ if ((t/=d) < (1/2.75)) {
+ return c*(7.5625*t*t) + b;
+ } else if (t < (2/2.75)) {
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+ } else if (t < (2.5/2.75)) {
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+ } else {
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+ }
+ },
+ easeInOutBounce: function (x, t, b, c, d) {
+ if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+ return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+ }
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2001 Robert Penner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+})(jQuery);
+/*
+ * jQuery UI Effects Blind 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.blind = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'vertical'; // Default direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var ref = (direction == 'vertical') ? 'height' : 'width';
+ var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
+ if(mode == 'show') wrapper.css(ref, 0); // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref] = mode == 'show' ? distance : 0;
+
+ // Animate
+ wrapper.animate(animation, o.duration, o.options.easing, function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ });
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Bounce 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.bounce = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var direction = o.options.direction || 'up'; // Default direction
+ var distance = o.options.distance || 20; // Default distance
+ var times = o.options.times || 5; // Default # of times
+ var speed = o.duration || 250; // Default speed per bounce
+ if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
+ if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+ if (mode == 'hide') distance = distance / (times * 2);
+ if (mode != 'hide') times--;
+
+ // Animate
+ if (mode == 'show') { // Show Bounce
+ var animation = {opacity: 1};
+ animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation, speed / 2, o.options.easing);
+ distance = distance / 2;
+ times--;
+ };
+ for (var i = 0; i < times; i++) { // Bounces
+ var animation1 = {}, animation2 = {};
+ animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
+ distance = (mode == 'hide') ? distance * 2 : distance / 2;
+ };
+ if (mode == 'hide') { // Last Bounce
+ var animation = {opacity: 0};
+ animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ el.animate(animation, speed / 2, o.options.easing, function(){
+ el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ } else {
+ var animation1 = {}, animation2 = {};
+ animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ };
+ el.queue('fx', function() { el.dequeue(); });
+ el.dequeue();
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Clip 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.clip = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right','height','width'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'vertical'; // Default direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var animate = el[0].tagName == 'IMG' ? wrapper : el;
+ var ref = {
+ size: (direction == 'vertical') ? 'height' : 'width',
+ position: (direction == 'vertical') ? 'top' : 'left'
+ };
+ var distance = (direction == 'vertical') ? animate.height() : animate.width();
+ if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref.size] = mode == 'show' ? distance : 0;
+ animation[ref.position] = mode == 'show' ? 0 : distance / 2;
+
+ // Animate
+ animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Drop 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.drop = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right','opacity'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default Direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
+ if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+
+ // Animation
+ var animation = {opacity: mode == 'show' ? 1 : 0};
+ animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+ // Animate
+ el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Explode 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.explode = function(o) {
+
+ return this.queue(function() {
+
+ var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+ var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+
+ o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
+ var el = $(this).show().css('visibility', 'hidden');
+ var offset = el.offset();
+
+ //Substract the margins - not fixing the problem yet.
+ offset.top -= parseInt(el.css("marginTop"),10) || 0;
+ offset.left -= parseInt(el.css("marginLeft"),10) || 0;
+
+ var width = el.outerWidth(true);
+ var height = el.outerHeight(true);
+
+ for(var i=0;i<rows;i++) { // =
+ for(var j=0;j<cells;j++) { // ||
+ el
+ .clone()
+ .appendTo('body')
+ .wrap('<div></div>')
+ .css({
+ position: 'absolute',
+ visibility: 'visible',
+ left: -j*(width/cells),
+ top: -i*(height/rows)
+ })
+ .parent()
+ .addClass('ui-effects-explode')
+ .css({
+ position: 'absolute',
+ overflow: 'hidden',
+ width: width/cells,
+ height: height/rows,
+ left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
+ top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
+ opacity: o.options.mode == 'show' ? 0 : 1
+ }).animate({
+ left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
+ top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
+ opacity: o.options.mode == 'show' ? 1 : 0
+ }, o.duration || 500);
+ }
+ }
+
+ // Set a timeout, to call the callback approx. when the other animations have finished
+ setTimeout(function() {
+
+ o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
+ if(o.callback) o.callback.apply(el[0]); // Callback
+ el.dequeue();
+
+ $('div.ui-effects-explode').remove();
+
+ }, o.duration || 500);
+
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Fade 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fade = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ mode = $.effects.setMode(elem, o.options.mode || 'hide');
+
+ elem.animate({ opacity: mode }, {
+ queue: false,
+ duration: o.duration,
+ easing: o.options.easing,
+ complete: function() {
+ (o.callback && o.callback.apply(this, arguments));
+ elem.dequeue();
+ }
+ });
+ });
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Fold 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fold = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var size = o.options.size || 15; // Default fold size
+ var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
+ var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var widthFirst = ((mode == 'show') != horizFirst);
+ var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
+ var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
+ var percent = /([0-9]+)%/.exec(size);
+ if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
+ if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
+
+ // Animation
+ var animation1 = {}, animation2 = {};
+ animation1[ref[0]] = mode == 'show' ? distance[0] : size;
+ animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
+
+ // Animate
+ wrapper.animate(animation1, duration, o.options.easing)
+ .animate(animation2, duration, o.options.easing, function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ });
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Highlight 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.highlight = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ props = ['backgroundImage', 'backgroundColor', 'opacity'],
+ mode = $.effects.setMode(elem, o.options.mode || 'show'),
+ animation = {
+ backgroundColor: elem.css('backgroundColor')
+ };
+
+ if (mode == 'hide') {
+ animation.opacity = 0;
+ }
+
+ $.effects.save(elem, props);
+ elem
+ .show()
+ .css({
+ backgroundImage: 'none',
+ backgroundColor: o.options.color || '#ffff99'
+ })
+ .animate(animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.options.easing,
+ complete: function() {
+ (mode == 'hide' && elem.hide());
+ $.effects.restore(elem, props);
+ (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
+ (o.callback && o.callback.apply(this, arguments));
+ elem.dequeue();
+ }
+ });
+ });
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Pulsate 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.pulsate = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ mode = $.effects.setMode(elem, o.options.mode || 'show');
+ times = ((o.options.times || 5) * 2) - 1;
+ duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
+ isVisible = elem.is(':visible'),
+ animateTo = 0;
+
+ if (!isVisible) {
+ elem.css('opacity', 0).show();
+ animateTo = 1;
+ }
+
+ if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
+ times--;
+ }
+
+ for (var i = 0; i < times; i++) {
+ elem.animate({ opacity: animateTo }, duration, o.options.easing);
+ animateTo = (animateTo + 1) % 2;
+ }
+
+ elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
+ if (animateTo == 0) {
+ elem.hide();
+ }
+ (o.callback && o.callback.apply(this, arguments));
+ });
+
+ elem
+ .queue('fx', function() { elem.dequeue(); })
+ .dequeue();
+ });
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Scale 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.puff = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ mode = $.effects.setMode(elem, o.options.mode || 'hide'),
+ percent = parseInt(o.options.percent, 10) || 150,
+ factor = percent / 100,
+ original = { height: elem.height(), width: elem.width() };
+
+ $.extend(o.options, {
+ fade: true,
+ mode: mode,
+ percent: mode == 'hide' ? percent : 100,
+ from: mode == 'hide'
+ ? original
+ : {
+ height: original.height * factor,
+ width: original.width * factor
+ }
+ });
+
+ elem.effect('scale', o.options, o.duration, o.callback);
+ elem.dequeue();
+ });
+};
+
+$.effects.scale = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this);
+
+ // Set options
+ var options = $.extend(true, {}, o.options);
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
+ var direction = o.options.direction || 'both'; // Set default axis
+ var origin = o.options.origin; // The origin of the scaling
+ if (mode != 'effect') { // Set default origin and restore for show/hide
+ options.origin = origin || ['middle','center'];
+ options.restore = true;
+ }
+ var original = {height: el.height(), width: el.width()}; // Save original
+ el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
+
+ // Adjust
+ var factor = { // Set scaling factor
+ y: direction != 'horizontal' ? (percent / 100) : 1,
+ x: direction != 'vertical' ? (percent / 100) : 1
+ };
+ el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
+
+ if (o.options.fade) { // Fade option to support puff
+ if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
+ if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
+ };
+
+ // Animation
+ options.from = el.from; options.to = el.to; options.mode = mode;
+
+ // Animate
+ el.effect('size', options, o.duration, o.callback);
+ el.dequeue();
+ });
+
+};
+
+$.effects.size = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
+ var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
+ var props2 = ['width','height','overflow']; // Copy for children
+ var cProps = ['fontSize'];
+ var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
+ var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var restore = o.options.restore || false; // Default restore
+ var scale = o.options.scale || 'both'; // Default scale mode
+ var origin = o.options.origin; // The origin of the sizing
+ var original = {height: el.height(), width: el.width()}; // Save original
+ el.from = o.options.from || original; // Default from state
+ el.to = o.options.to || original; // Default to state
+ // Adjust
+ if (origin) { // Calculate baseline shifts
+ var baseline = $.effects.getBaseline(origin, original);
+ el.from.top = (original.height - el.from.height) * baseline.y;
+ el.from.left = (original.width - el.from.width) * baseline.x;
+ el.to.top = (original.height - el.to.height) * baseline.y;
+ el.to.left = (original.width - el.to.width) * baseline.x;
+ };
+ var factor = { // Set scaling factor
+ from: {y: el.from.height / original.height, x: el.from.width / original.width},
+ to: {y: el.to.height / original.height, x: el.to.width / original.width}
+ };
+ if (scale == 'box' || scale == 'both') { // Scale the css box
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ props = props.concat(vProps);
+ el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
+ el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
+ };
+ if (factor.from.x != factor.to.x) { // Horizontal props scaling
+ props = props.concat(hProps);
+ el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
+ el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
+ };
+ };
+ if (scale == 'content' || scale == 'both') { // Scale the content
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ props = props.concat(cProps);
+ el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
+ el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
+ };
+ };
+ $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ el.css('overflow','hidden').css(el.from); // Shift
+
+ // Animate
+ if (scale == 'content' || scale == 'both') { // Scale the children
+ vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
+ hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
+ props2 = props.concat(vProps).concat(hProps); // Concat
+ el.find("*[width]").each(function(){
+ child = $(this);
+ if (restore) $.effects.save(child, props2);
+ var c_original = {height: child.height(), width: child.width()}; // Save original
+ child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
+ child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
+ child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
+ };
+ if (factor.from.x != factor.to.x) { // Horizontal props scaling
+ child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
+ child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
+ };
+ child.css(child.from); // Shift children
+ child.animate(child.to, o.duration, o.options.easing, function(){
+ if (restore) $.effects.restore(child, props2); // Restore children
+ }); // Animate children
+ });
+ };
+
+ // Animate
+ el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if (el.to.opacity === 0) {
+ el.css('opacity', el.from.opacity);
+ }
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Shake 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.shake = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default direction
+ var distance = o.options.distance || 20; // Default distance
+ var times = o.options.times || 3; // Default # of times
+ var speed = o.duration || o.options.duration || 140; // Default speed per shake
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+
+ // Animation
+ var animation = {}, animation1 = {}, animation2 = {};
+ animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation1[ref] = (motion == 'pos' ? '+=' : '-=') + distance * 2;
+ animation2[ref] = (motion == 'pos' ? '-=' : '+=') + distance * 2;
+
+ // Animate
+ el.animate(animation, speed, o.options.easing);
+ for (var i = 1; i < times; i++) { // Shakes
+ el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
+ };
+ el.animate(animation1, speed, o.options.easing).
+ animate(animation, speed / 2, o.options.easing, function(){ // Last shake
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ el.queue('fx', function() { el.dequeue(); });
+ el.dequeue();
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Slide 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.slide = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default Direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
+ if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+ // Animate
+ el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Transfer 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.transfer = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ target = $(o.options.to),
+ endPosition = target.offset(),
+ animation = {
+ top: endPosition.top,
+ left: endPosition.left,
+ height: target.innerHeight(),
+ width: target.innerWidth()
+ },
+ startPosition = elem.offset(),
+ transfer = $('<div class="ui-effects-transfer"></div>')
+ .appendTo(document.body)
+ .addClass(o.options.className)
+ .css({
+ top: startPosition.top,
+ left: startPosition.left,
+ height: elem.innerHeight(),
+ width: elem.innerWidth(),
+ position: 'absolute'
+ })
+ .animate(animation, o.duration, o.options.easing, function() {
+ transfer.remove();
+ (o.callback && o.callback.apply(elem[0], arguments));
+ elem.dequeue();
+ });
+ });
+};
+
+})(jQuery);
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.accordion", {
+ options: {
+ active: 0,
+ animated: "slide",
+ autoHeight: true,
+ clearStyle: false,
+ collapsible: false,
+ event: "click",
+ fillSpace: false,
+ header: "> li > :first-child,> :not(li):even",
+ icons: {
+ header: "ui-icon-triangle-1-e",
+ headerSelected: "ui-icon-triangle-1-s"
+ },
+ navigation: false,
+ navigationFilter: function() {
+ return this.href.toLowerCase() === location.href.toLowerCase();
+ }
+ },
+
+ _create: function() {
+ var self = this,
+ options = self.options;
+
+ self.running = 0;
+
+ self.element
+ .addClass( "ui-accordion ui-widget ui-helper-reset" )
+ // in lack of child-selectors in CSS
+ // we need to mark top-LIs in a UL-accordion for some IE-fix
+ .children( "li" )
+ .addClass( "ui-accordion-li-fix" );
+
+ self.headers = self.element.find( options.header )
+ .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
+ .bind( "mouseenter.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).addClass( "ui-state-hover" );
+ })
+ .bind( "mouseleave.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( "ui-state-hover" );
+ })
+ .bind( "focus.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).addClass( "ui-state-focus" );
+ })
+ .bind( "blur.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( "ui-state-focus" );
+ });
+
+ self.headers.next()
+ .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
+
+ if ( options.navigation ) {
+ var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
+ if ( current.length ) {
+ var header = current.closest( ".ui-accordion-header" );
+ if ( header.length ) {
+ // anchor within header
+ self.active = header;
+ } else {
+ // anchor within content
+ self.active = current.closest( ".ui-accordion-content" ).prev();
+ }
+ }
+ }
+
+ self.active = self._findActive( self.active || options.active )
+ .addClass( "ui-state-default ui-state-active" )
+ .toggleClass( "ui-corner-all" )
+ .toggleClass( "ui-corner-top" );
+ self.active.next().addClass( "ui-accordion-content-active" );
+
+ self._createIcons();
+ self.resize();
+
+ // ARIA
+ self.element.attr( "role", "tablist" );
+
+ self.headers
+ .attr( "role", "tab" )
+ .bind( "keydown.accordion", function( event ) {
+ return self._keydown( event );
+ })
+ .next()
+ .attr( "role", "tabpanel" );
+
+ self.headers
+ .not( self.active || "" )
+ .attr({
+ "aria-expanded": "false",
+ "aria-selected": "false",
+ tabIndex: -1
+ })
+ .next()
+ .hide();
+
+ // make sure at least one header is in the tab order
+ if ( !self.active.length ) {
+ self.headers.eq( 0 ).attr( "tabIndex", 0 );
+ } else {
+ self.active
+ .attr({
+ "aria-expanded": "true",
+ "aria-selected": "true",
+ tabIndex: 0
+ });
+ }
+
+ // only need links in tab order for Safari
+ if ( !$.browser.safari ) {
+ self.headers.find( "a" ).attr( "tabIndex", -1 );
+ }
+
+ if ( options.event ) {
+ self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
+ self._clickHandler.call( self, event, this );
+ event.preventDefault();
+ });
+ }
+ },
+
+ _createIcons: function() {
+ var options = this.options;
+ if ( options.icons ) {
+ $( "<span></span>" )
+ .addClass( "ui-icon " + options.icons.header )
+ .prependTo( this.headers );
+ this.active.children( ".ui-icon" )
+ .toggleClass(options.icons.header)
+ .toggleClass(options.icons.headerSelected);
+ this.element.addClass( "ui-accordion-icons" );
+ }
+ },
+
+ _destroyIcons: function() {
+ this.headers.children( ".ui-icon" ).remove();
+ this.element.removeClass( "ui-accordion-icons" );
+ },
+
+ destroy: function() {
+ var options = this.options;
+
+ this.element
+ .removeClass( "ui-accordion ui-widget ui-helper-reset" )
+ .removeAttr( "role" );
+
+ this.headers
+ .unbind( ".accordion" )
+ .removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-expanded" )
+ .removeAttr( "aria-selected" )
+ .removeAttr( "tabIndex" );
+
+ this.headers.find( "a" ).removeAttr( "tabIndex" );
+ this._destroyIcons();
+ var contents = this.headers.next()
+ .css( "display", "" )
+ .removeAttr( "role" )
+ .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
+ if ( options.autoHeight || options.fillHeight ) {
+ contents.css( "height", "" );
+ }
+
+ return $.Widget.prototype.destroy.call( this );
+ },
+
+ _setOption: function( key, value ) {
+ $.Widget.prototype._setOption.apply( this, arguments );
+
+ if ( key == "active" ) {
+ this.activate( value );
+ }
+ if ( key == "icons" ) {
+ this._destroyIcons();
+ if ( value ) {
+ this._createIcons();
+ }
+ }
+ // #5332 - opacity doesn't cascade to positioned elements in IE
+ // so we need to add the disabled class to the headers and panels
+ if ( key == "disabled" ) {
+ this.headers.add(this.headers.next())
+ [ value ? "addClass" : "removeClass" ](
+ "ui-accordion-disabled ui-state-disabled" );
+ }
+ },
+
+ _keydown: function( event ) {
+ if ( this.options.disabled || event.altKey || event.ctrlKey ) {
+ return;
+ }
+
+ var keyCode = $.ui.keyCode,
+ length = this.headers.length,
+ currentIndex = this.headers.index( event.target ),
+ toFocus = false;
+
+ switch ( event.keyCode ) {
+ case keyCode.RIGHT:
+ case keyCode.DOWN:
+ toFocus = this.headers[ ( currentIndex + 1 ) % length ];
+ break;
+ case keyCode.LEFT:
+ case keyCode.UP:
+ toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
+ break;
+ case keyCode.SPACE:
+ case keyCode.ENTER:
+ this._clickHandler( { target: event.target }, event.target );
+ event.preventDefault();
+ }
+
+ if ( toFocus ) {
+ $( event.target ).attr( "tabIndex", -1 );
+ $( toFocus ).attr( "tabIndex", 0 );
+ toFocus.focus();
+ return false;
+ }
+
+ return true;
+ },
+
+ resize: function() {
+ var options = this.options,
+ maxHeight;
+
+ if ( options.fillSpace ) {
+ if ( $.browser.msie ) {
+ var defOverflow = this.element.parent().css( "overflow" );
+ this.element.parent().css( "overflow", "hidden");
+ }
+ maxHeight = this.element.parent().height();
+ if ($.browser.msie) {
+ this.element.parent().css( "overflow", defOverflow );
+ }
+
+ this.headers.each(function() {
+ maxHeight -= $( this ).outerHeight( true );
+ });
+
+ this.headers.next()
+ .each(function() {
+ $( this ).height( Math.max( 0, maxHeight -
+ $( this ).innerHeight() + $( this ).height() ) );
+ })
+ .css( "overflow", "auto" );
+ } else if ( options.autoHeight ) {
+ maxHeight = 0;
+ this.headers.next()
+ .each(function() {
+ maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+ })
+ .height( maxHeight );
+ }
+
+ return this;
+ },
+
+ activate: function( index ) {
+ // TODO this gets called on init, changing the option without an explicit call for that
+ this.options.active = index;
+ // call clickHandler with custom event
+ var active = this._findActive( index )[ 0 ];
+ this._clickHandler( { target: active }, active );
+
+ return this;
+ },
+
+ _findActive: function( selector ) {
+ return selector
+ ? typeof selector === "number"
+ ? this.headers.filter( ":eq(" + selector + ")" )
+ : this.headers.not( this.headers.not( selector ) )
+ : selector === false
+ ? $( [] )
+ : this.headers.filter( ":eq(0)" );
+ },
+
+ // TODO isn't event.target enough? why the separate target argument?
+ _clickHandler: function( event, target ) {
+ var options = this.options;
+ if ( options.disabled ) {
+ return;
+ }
+
+ // called only when using activate(false) to close all parts programmatically
+ if ( !event.target ) {
+ if ( !options.collapsible ) {
+ return;
+ }
+ this.active
+ .removeClass( "ui-state-active ui-corner-top" )
+ .addClass( "ui-state-default ui-corner-all" )
+ .children( ".ui-icon" )
+ .removeClass( options.icons.headerSelected )
+ .addClass( options.icons.header );
+ this.active.next().addClass( "ui-accordion-content-active" );
+ var toHide = this.active.next(),
+ data = {
+ options: options,
+ newHeader: $( [] ),
+ oldHeader: options.active,
+ newContent: $( [] ),
+ oldContent: toHide
+ },
+ toShow = ( this.active = $( [] ) );
+ this._toggle( toShow, toHide, data );
+ return;
+ }
+
+ // get the click target
+ var clicked = $( event.currentTarget || target ),
+ clickedIsActive = clicked[0] === this.active[0];
+
+ // TODO the option is changed, is that correct?
+ // TODO if it is correct, shouldn't that happen after determining that the click is valid?
+ options.active = options.collapsible && clickedIsActive ?
+ false :
+ this.headers.index( clicked );
+
+ // if animations are still active, or the active header is the target, ignore click
+ if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
+ return;
+ }
+
+ // find elements to show and hide
+ var active = this.active,
+ toShow = clicked.next(),
+ toHide = this.active.next(),
+ data = {
+ options: options,
+ newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
+ oldHeader: this.active,
+ newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
+ oldContent: toHide
+ },
+ down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
+
+ // when the call to ._toggle() comes after the class changes
+ // it causes a very odd bug in IE 8 (see #6720)
+ this.active = clickedIsActive ? $([]) : clicked;
+ this._toggle( toShow, toHide, data, clickedIsActive, down );
+
+ // switch classes
+ active
+ .removeClass( "ui-state-active ui-corner-top" )
+ .addClass( "ui-state-default ui-corner-all" )
+ .children( ".ui-icon" )
+ .removeClass( options.icons.headerSelected )
+ .addClass( options.icons.header );
+ if ( !clickedIsActive ) {
+ clicked
+ .removeClass( "ui-state-default ui-corner-all" )
+ .addClass( "ui-state-active ui-corner-top" )
+ .children( ".ui-icon" )
+ .removeClass( options.icons.header )
+ .addClass( options.icons.headerSelected );
+ clicked
+ .next()
+ .addClass( "ui-accordion-content-active" );
+ }
+
+ return;
+ },
+
+ _toggle: function( toShow, toHide, data, clickedIsActive, down ) {
+ var self = this,
+ options = self.options;
+
+ self.toShow = toShow;
+ self.toHide = toHide;
+ self.data = data;
+
+ var complete = function() {
+ if ( !self ) {
+ return;
+ }
+ return self._completed.apply( self, arguments );
+ };
+
+ // trigger changestart event
+ self._trigger( "changestart", null, self.data );
+
+ // count elements to animate
+ self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
+
+ if ( options.animated ) {
+ var animOptions = {};
+
+ if ( options.collapsible && clickedIsActive ) {
+ animOptions = {
+ toShow: $( [] ),
+ toHide: toHide,
+ complete: complete,
+ down: down,
+ autoHeight: options.autoHeight || options.fillSpace
+ };
+ } else {
+ animOptions = {
+ toShow: toShow,
+ toHide: toHide,
+ complete: complete,
+ down: down,
+ autoHeight: options.autoHeight || options.fillSpace
+ };
+ }
+
+ if ( !options.proxied ) {
+ options.proxied = options.animated;
+ }
+
+ if ( !options.proxiedDuration ) {
+ options.proxiedDuration = options.duration;
+ }
+
+ options.animated = $.isFunction( options.proxied ) ?
+ options.proxied( animOptions ) :
+ options.proxied;
+
+ options.duration = $.isFunction( options.proxiedDuration ) ?
+ options.proxiedDuration( animOptions ) :
+ options.proxiedDuration;
+
+ var animations = $.ui.accordion.animations,
+ duration = options.duration,
+ easing = options.animated;
+
+ if ( easing && !animations[ easing ] && !$.easing[ easing ] ) {
+ easing = "slide";
+ }
+ if ( !animations[ easing ] ) {
+ animations[ easing ] = function( options ) {
+ this.slide( options, {
+ easing: easing,
+ duration: duration || 700
+ });
+ };
+ }
+
+ animations[ easing ]( animOptions );
+ } else {
+ if ( options.collapsible && clickedIsActive ) {
+ toShow.toggle();
+ } else {
+ toHide.hide();
+ toShow.show();
+ }
+
+ complete( true );
+ }
+
+ // TODO assert that the blur and focus triggers are really necessary, remove otherwise
+ toHide.prev()
+ .attr({
+ "aria-expanded": "false",
+ "aria-selected": "false",
+ tabIndex: -1
+ })
+ .blur();
+ toShow.prev()
+ .attr({
+ "aria-expanded": "true",
+ "aria-selected": "true",
+ tabIndex: 0
+ })
+ .focus();
+ },
+
+ _completed: function( cancel ) {
+ this.running = cancel ? 0 : --this.running;
+ if ( this.running ) {
+ return;
+ }
+
+ if ( this.options.clearStyle ) {
+ this.toShow.add( this.toHide ).css({
+ height: "",
+ overflow: ""
+ });
+ }
+
+ // other classes are removed before the animation; this one needs to stay until completed
+ this.toHide.removeClass( "ui-accordion-content-active" );
+ // Work around for rendering bug in IE (#5421)
+ if ( this.toHide.length ) {
+ this.toHide.parent()[0].className = this.toHide.parent()[0].className;
+ }
+
+ this._trigger( "change", null, this.data );
+ }
+});
+
+$.extend( $.ui.accordion, {
+ version: "1.8.16",
+ animations: {
+ slide: function( options, additions ) {
+ options = $.extend({
+ easing: "swing",
+ duration: 300
+ }, options, additions );
+ if ( !options.toHide.size() ) {
+ options.toShow.animate({
+ height: "show",
+ paddingTop: "show",
+ paddingBottom: "show"
+ }, options );
+ return;
+ }
+ if ( !options.toShow.size() ) {
+ options.toHide.animate({
+ height: "hide",
+ paddingTop: "hide",
+ paddingBottom: "hide"
+ }, options );
+ return;
+ }
+ var overflow = options.toShow.css( "overflow" ),
+ percentDone = 0,
+ showProps = {},
+ hideProps = {},
+ fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
+ originalWidth;
+ // fix width before calculating height of hidden element
+ var s = options.toShow;
+ originalWidth = s[0].style.width;
+ s.width( parseInt( s.parent().width(), 10 )
+ - parseInt( s.css( "paddingLeft" ), 10 )
+ - parseInt( s.css( "paddingRight" ), 10 )
+ - ( parseInt( s.css( "borderLeftWidth" ), 10 ) || 0 )
+ - ( parseInt( s.css( "borderRightWidth" ), 10) || 0 ) );
+
+ $.each( fxAttrs, function( i, prop ) {
+ hideProps[ prop ] = "hide";
+
+ var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ );
+ showProps[ prop ] = {
+ value: parts[ 1 ],
+ unit: parts[ 2 ] || "px"
+ };
+ });
+ options.toShow.css({ height: 0, overflow: "hidden" }).show();
+ options.toHide
+ .filter( ":hidden" )
+ .each( options.complete )
+ .end()
+ .filter( ":visible" )
+ .animate( hideProps, {
+ step: function( now, settings ) {
+ // only calculate the percent when animating height
+ // IE gets very inconsistent results when animating elements
+ // with small values, which is common for padding
+ if ( settings.prop == "height" ) {
+ percentDone = ( settings.end - settings.start === 0 ) ? 0 :
+ ( settings.now - settings.start ) / ( settings.end - settings.start );
+ }
+
+ options.toShow[ 0 ].style[ settings.prop ] =
+ ( percentDone * showProps[ settings.prop ].value )
+ + showProps[ settings.prop ].unit;
+ },
+ duration: options.duration,
+ easing: options.easing,
+ complete: function() {
+ if ( !options.autoHeight ) {
+ options.toShow.css( "height", "" );
+ }
+ options.toShow.css({
+ width: originalWidth,
+ overflow: overflow
+ });
+ options.complete();
+ }
+ });
+ },
+ bounceslide: function( options ) {
+ this.slide( options, {
+ easing: options.down ? "easeOutBounce" : "swing",
+ duration: options.down ? 1000 : 200
+ });
+ }
+ }
+});
+
+})( jQuery );
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.position.js
+ */
+(function( $, undefined ) {
+
+// used to prevent race conditions with remote data sources
+var requestIndex = 0;
+
+$.widget( "ui.autocomplete", {
+ options: {
+ appendTo: "body",
+ autoFocus: false,
+ delay: 300,
+ minLength: 1,
+ position: {
+ my: "left top",
+ at: "left bottom",
+ collision: "none"
+ },
+ source: null
+ },
+
+ pending: 0,
+
+ _create: function() {
+ var self = this,
+ doc = this.element[ 0 ].ownerDocument,
+ suppressKeyPress;
+
+ this.element
+ .addClass( "ui-autocomplete-input" )
+ .attr( "autocomplete", "off" )
+ // TODO verify these actually work as intended
+ .attr({
+ role: "textbox",
+ "aria-autocomplete": "list",
+ "aria-haspopup": "true"
+ })
+ .bind( "keydown.autocomplete", function( event ) {
+ if ( self.options.disabled || self.element.propAttr( "readOnly" ) ) {
+ return;
+ }
+
+ suppressKeyPress = false;
+ var keyCode = $.ui.keyCode;
+ switch( event.keyCode ) {
+ case keyCode.PAGE_UP:
+ self._move( "previousPage", event );
+ break;
+ case keyCode.PAGE_DOWN:
+ self._move( "nextPage", event );
+ break;
+ case keyCode.UP:
+ self._move( "previous", event );
+ // prevent moving cursor to beginning of text field in some browsers
+ event.preventDefault();
+ break;
+ case keyCode.DOWN:
+ self._move( "next", event );
+ // prevent moving cursor to end of text field in some browsers
+ event.preventDefault();
+ break;
+ case keyCode.ENTER:
+ case keyCode.NUMPAD_ENTER:
+ // when menu is open and has focus
+ if ( self.menu.active ) {
+ // #6055 - Opera still allows the keypress to occur
+ // which causes forms to submit
+ suppressKeyPress = true;
+ event.preventDefault();
+ }
+ //passthrough - ENTER and TAB both select the current element
+ case keyCode.TAB:
+ if ( !self.menu.active ) {
+ return;
+ }
+ self.menu.select( event );
+ break;
+ case keyCode.ESCAPE:
+ self.element.val( self.term );
+ self.close( event );
+ break;
+ default:
+ // keypress is triggered before the input value is changed
+ clearTimeout( self.searching );
+ self.searching = setTimeout(function() {
+ // only search if the value has changed
+ if ( self.term != self.element.val() ) {
+ self.selectedItem = null;
+ self.search( null, event );
+ }
+ }, self.options.delay );
+ break;
+ }
+ })
+ .bind( "keypress.autocomplete", function( event ) {
+ if ( suppressKeyPress ) {
+ suppressKeyPress = false;
+ event.preventDefault();
+ }
+ })
+ .bind( "focus.autocomplete", function() {
+ if ( self.options.disabled ) {
+ return;
+ }
+
+ self.selectedItem = null;
+ self.previous = self.element.val();
+ })
+ .bind( "blur.autocomplete", function( event ) {
+ if ( self.options.disabled ) {
+ return;
+ }
+
+ clearTimeout( self.searching );
+ // clicks on the menu (or a button to trigger a search) will cause a blur event
+ self.closing = setTimeout(function() {
+ self.close( event );
+ self._change( event );
+ }, 150 );
+ });
+ this._initSource();
+ this.response = function() {
+ return self._response.apply( self, arguments );
+ };
+ this.menu = $( "<ul></ul>" )
+ .addClass( "ui-autocomplete" )
+ .appendTo( $( this.options.appendTo || "body", doc )[0] )
+ // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
+ .mousedown(function( event ) {
+ // clicking on the scrollbar causes focus to shift to the body
+ // but we can't detect a mouseup or a click immediately afterward
+ // so we have to track the next mousedown and close the menu if
+ // the user clicks somewhere outside of the autocomplete
+ var menuElement = self.menu.element[ 0 ];
+ if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
+ setTimeout(function() {
+ $( document ).one( 'mousedown', function( event ) {
+ if ( event.target !== self.element[ 0 ] &&
+ event.target !== menuElement &&
+ !$.ui.contains( menuElement, event.target ) ) {
+ self.close();
+ }
+ });
+ }, 1 );
+ }
+
+ // use another timeout to make sure the blur-event-handler on the input was already triggered
+ setTimeout(function() {
+ clearTimeout( self.closing );
+ }, 13);
+ })
+ .menu({
+ focus: function( event, ui ) {
+ var item = ui.item.data( "item.autocomplete" );
+ if ( false !== self._trigger( "focus", event, { item: item } ) ) {
+ // use value to match what will end up in the input, if it was a key event
+ if ( /^key/.test(event.originalEvent.type) ) {
+ self.element.val( item.value );
+ }
+ }
+ },
+ selected: function( event, ui ) {
+ var item = ui.item.data( "item.autocomplete" ),
+ previous = self.previous;
+
+ // only trigger when focus was lost (click on menu)
+ if ( self.element[0] !== doc.activeElement ) {
+ self.element.focus();
+ self.previous = previous;
+ // #6109 - IE triggers two focus events and the second
+ // is asynchronous, so we need to reset the previous
+ // term synchronously and asynchronously :-(
+ setTimeout(function() {
+ self.previous = previous;
+ self.selectedItem = item;
+ }, 1);
+ }
+
+ if ( false !== self._trigger( "select", event, { item: item } ) ) {
+ self.element.val( item.value );
+ }
+ // reset the term after the select event
+ // this allows custom select handling to work properly
+ self.term = self.element.val();
+
+ self.close( event );
+ self.selectedItem = item;
+ },
+ blur: function( event, ui ) {
+ // don't set the value of the text field if it's already correct
+ // this prevents moving the cursor unnecessarily
+ if ( self.menu.element.is(":visible") &&
+ ( self.element.val() !== self.term ) ) {
+ self.element.val( self.term );
+ }
+ }
+ })
+ .zIndex( this.element.zIndex() + 1 )
+ // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+ .css({ top: 0, left: 0 })
+ .hide()
+ .data( "menu" );
+ if ( $.fn.bgiframe ) {
+ this.menu.element.bgiframe();
+ }
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-autocomplete-input" )
+ .removeAttr( "autocomplete" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-autocomplete" )
+ .removeAttr( "aria-haspopup" );
+ this.menu.element.remove();
+ $.Widget.prototype.destroy.call( this );
+ },
+
+ _setOption: function( key, value ) {
+ $.Widget.prototype._setOption.apply( this, arguments );
+ if ( key === "source" ) {
+ this._initSource();
+ }
+ if ( key === "appendTo" ) {
+ this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
+ }
+ if ( key === "disabled" && value && this.xhr ) {
+ this.xhr.abort();
+ }
+ },
+
+ _initSource: function() {
+ var self = this,
+ array,
+ url;
+ if ( $.isArray(this.options.source) ) {
+ array = this.options.source;
+ this.source = function( request, response ) {
+ response( $.ui.autocomplete.filter(array, request.term) );
+ };
+ } else if ( typeof this.options.source === "string" ) {
+ url = this.options.source;
+ this.source = function( request, response ) {
+ if ( self.xhr ) {
+ self.xhr.abort();
+ }
+ self.xhr = $.ajax({
+ url: url,
+ data: request,
+ dataType: "json",
+ autocompleteRequest: ++requestIndex,
+ success: function( data, status ) {
+ if ( this.autocompleteRequest === requestIndex ) {
+ response( data );
+ }
+ },
+ error: function() {
+ if ( this.autocompleteRequest === requestIndex ) {
+ response( [] );
+ }
+ }
+ });
+ };
+ } else {
+ this.source = this.options.source;
+ }
+ },
+
+ search: function( value, event ) {
+ value = value != null ? value : this.element.val();
+
+ // always save the actual value, not the one passed as an argument
+ this.term = this.element.val();
+
+ if ( value.length < this.options.minLength ) {
+ return this.close( event );
+ }
+
+ clearTimeout( this.closing );
+ if ( this._trigger( "search", event ) === false ) {
+ return;
+ }
+
+ return this._search( value );
+ },
+
+ _search: function( value ) {
+ this.pending++;
+ this.element.addClass( "ui-autocomplete-loading" );
+
+ this.source( { term: value }, this.response );
+ },
+
+ _response: function( content ) {
+ if ( !this.options.disabled && content && content.length ) {
+ content = this._normalize( content );
+ this._suggest( content );
+ this._trigger( "open" );
+ } else {
+ this.close();
+ }
+ this.pending--;
+ if ( !this.pending ) {
+ this.element.removeClass( "ui-autocomplete-loading" );
+ }
+ },
+
+ close: function( event ) {
+ clearTimeout( this.closing );
+ if ( this.menu.element.is(":visible") ) {
+ this.menu.element.hide();
+ this.menu.deactivate();
+ this._trigger( "close", event );
+ }
+ },
+
+ _change: function( event ) {
+ if ( this.previous !== this.element.val() ) {
+ this._trigger( "change", event, { item: this.selectedItem } );
+ }
+ },
+
+ _normalize: function( items ) {
+ // assume all items have the right format when the first item is complete
+ if ( items.length && items[0].label && items[0].value ) {
+ return items;
+ }
+ return $.map( items, function(item) {
+ if ( typeof item === "string" ) {
+ return {
+ label: item,
+ value: item
+ };
+ }
+ return $.extend({
+ label: item.label || item.value,
+ value: item.value || item.label
+ }, item );
+ });
+ },
+
+ _suggest: function( items ) {
+ var ul = this.menu.element
+ .empty()
+ .zIndex( this.element.zIndex() + 1 );
+ this._renderMenu( ul, items );
+ // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
+ this.menu.deactivate();
+ this.menu.refresh();
+
+ // size and position menu
+ ul.show();
+ this._resizeMenu();
+ ul.position( $.extend({
+ of: this.element
+ }, this.options.position ));
+
+ if ( this.options.autoFocus ) {
+ this.menu.next( new $.Event("mouseover") );
+ }
+ },
+
+ _resizeMenu: function() {
+ var ul = this.menu.element;
+ ul.outerWidth( Math.max(
+ ul.width( "" ).outerWidth(),
+ this.element.outerWidth()
+ ) );
+ },
+
+ _renderMenu: function( ul, items ) {
+ var self = this;
+ $.each( items, function( index, item ) {
+ self._renderItem( ul, item );
+ });
+ },
+
+ _renderItem: function( ul, item) {
+ return $( "<li></li>" )
+ .data( "item.autocomplete", item )
+ .append( $( "<a></a>" ).text( item.label ) )
+ .appendTo( ul );
+ },
+
+ _move: function( direction, event ) {
+ if ( !this.menu.element.is(":visible") ) {
+ this.search( null, event );
+ return;
+ }
+ if ( this.menu.first() && /^previous/.test(direction) ||
+ this.menu.last() && /^next/.test(direction) ) {
+ this.element.val( this.term );
+ this.menu.deactivate();
+ return;
+ }
+ this.menu[ direction ]( event );
+ },
+
+ widget: function() {
+ return this.menu.element;
+ }
+});
+
+$.extend( $.ui.autocomplete, {
+ escapeRegex: function( value ) {
+ return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+ },
+ filter: function(array, term) {
+ var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
+ return $.grep( array, function(value) {
+ return matcher.test( value.label || value.value || value );
+ });
+ }
+});
+
+}( jQuery ));
+
+/*
+ * jQuery UI Menu (not officially released)
+ *
+ * This widget isn't yet finished and the API is subject to change. We plan to finish
+ * it for the next release. You're welcome to give it a try anyway and give us feedback,
+ * as long as you're okay with migrating your code later on. We can help with that, too.
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.menu", {
+ _create: function() {
+ var self = this;
+ this.element
+ .addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
+ .attr({
+ role: "listbox",
+ "aria-activedescendant": "ui-active-menuitem"
+ })
+ .click(function( event ) {
+ if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
+ return;
+ }
+ // temporary
+ event.preventDefault();
+ self.select( event );
+ });
+ this.refresh();
+ },
+
+ refresh: function() {
+ var self = this;
+
+ // don't refresh list items that are already adapted
+ var items = this.element.children("li:not(.ui-menu-item):has(a)")
+ .addClass("ui-menu-item")
+ .attr("role", "menuitem");
+
+ items.children("a")
+ .addClass("ui-corner-all")
+ .attr("tabindex", -1)
+ // mouseenter doesn't work with event delegation
+ .mouseenter(function( event ) {
+ self.activate( event, $(this).parent() );
+ })
+ .mouseleave(function() {
+ self.deactivate();
+ });
+ },
+
+ activate: function( event, item ) {
+ this.deactivate();
+ if (this.hasScroll()) {
+ var offset = item.offset().top - this.element.offset().top,
+ scroll = this.element.scrollTop(),
+ elementHeight = this.element.height();
+ if (offset < 0) {
+ this.element.scrollTop( scroll + offset);
+ } else if (offset >= elementHeight) {
+ this.element.scrollTop( scroll + offset - elementHeight + item.height());
+ }
+ }
+ this.active = item.eq(0)
+ .children("a")
+ .addClass("ui-state-hover")
+ .attr("id", "ui-active-menuitem")
+ .end();
+ this._trigger("focus", event, { item: item });
+ },
+
+ deactivate: function() {
+ if (!this.active) { return; }
+
+ this.active.children("a")
+ .removeClass("ui-state-hover")
+ .removeAttr("id");
+ this._trigger("blur");
+ this.active = null;
+ },
+
+ next: function(event) {
+ this.move("next", ".ui-menu-item:first", event);
+ },
+
+ previous: function(event) {
+ this.move("prev", ".ui-menu-item:last", event);
+ },
+
+ first: function() {
+ return this.active && !this.active.prevAll(".ui-menu-item").length;
+ },
+
+ last: function() {
+ return this.active && !this.active.nextAll(".ui-menu-item").length;
+ },
+
+ move: function(direction, edge, event) {
+ if (!this.active) {
+ this.activate(event, this.element.children(edge));
+ return;
+ }
+ var next = this.active[direction + "All"](".ui-menu-item").eq(0);
+ if (next.length) {
+ this.activate(event, next);
+ } else {
+ this.activate(event, this.element.children(edge));
+ }
+ },
+
+ // TODO merge with previousPage
+ nextPage: function(event) {
+ if (this.hasScroll()) {
+ // TODO merge with no-scroll-else
+ if (!this.active || this.last()) {
+ this.activate(event, this.element.children(".ui-menu-item:first"));
+ return;
+ }
+ var base = this.active.offset().top,
+ height = this.element.height(),
+ result = this.element.children(".ui-menu-item").filter(function() {
+ var close = $(this).offset().top - base - height + $(this).height();
+ // TODO improve approximation
+ return close < 10 && close > -10;
+ });
+
+ // TODO try to catch this earlier when scrollTop indicates the last page anyway
+ if (!result.length) {
+ result = this.element.children(".ui-menu-item:last");
+ }
+ this.activate(event, result);
+ } else {
+ this.activate(event, this.element.children(".ui-menu-item")
+ .filter(!this.active || this.last() ? ":first" : ":last"));
+ }
+ },
+
+ // TODO merge with nextPage
+ previousPage: function(event) {
+ if (this.hasScroll()) {
+ // TODO merge with no-scroll-else
+ if (!this.active || this.first()) {
+ this.activate(event, this.element.children(".ui-menu-item:last"));
+ return;
+ }
+
+ var base = this.active.offset().top,
+ height = this.element.height();
+ result = this.element.children(".ui-menu-item").filter(function() {
+ var close = $(this).offset().top - base + height - $(this).height();
+ // TODO improve approximation
+ return close < 10 && close > -10;
+ });
+
+ // TODO try to catch this earlier when scrollTop indicates the last page anyway
+ if (!result.length) {
+ result = this.element.children(".ui-menu-item:first");
+ }
+ this.activate(event, result);
+ } else {
+ this.activate(event, this.element.children(".ui-menu-item")
+ .filter(!this.active || this.first() ? ":last" : ":first"));
+ }
+ },
+
+ hasScroll: function() {
+ return this.element.height() < this.element[ $.fn.prop ? "prop" : "attr" ]("scrollHeight");
+ },
+
+ select: function( event ) {
+ this._trigger("selected", event, { item: this.active });
+ }
+});
+
+}(jQuery));
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var lastActive, startXPos, startYPos, clickDragged,
+ baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
+ stateClasses = "ui-state-hover ui-state-active ",
+ typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
+ formResetHandler = function() {
+ var buttons = $( this ).find( ":ui-button" );
+ setTimeout(function() {
+ buttons.button( "refresh" );
+ }, 1 );
+ },
+ radioGroup = function( radio ) {
+ var name = radio.name,
+ form = radio.form,
+ radios = $( [] );
+ if ( name ) {
+ if ( form ) {
+ radios = $( form ).find( "[name='" + name + "']" );
+ } else {
+ radios = $( "[name='" + name + "']", radio.ownerDocument )
+ .filter(function() {
+ return !this.form;
+ });
+ }
+ }
+ return radios;
+ };
+
+$.widget( "ui.button", {
+ options: {
+ disabled: null,
+ text: true,
+ label: null,
+ icons: {
+ primary: null,
+ secondary: null
+ }
+ },
+ _create: function() {
+ this.element.closest( "form" )
+ .unbind( "reset.button" )
+ .bind( "reset.button", formResetHandler );
+
+ if ( typeof this.options.disabled !== "boolean" ) {
+ this.options.disabled = this.element.propAttr( "disabled" );
+ }
+
+ this._determineButtonType();
+ this.hasTitle = !!this.buttonElement.attr( "title" );
+
+ var self = this,
+ options = this.options,
+ toggleButton = this.type === "checkbox" || this.type === "radio",
+ hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
+ focusClass = "ui-state-focus";
+
+ if ( options.label === null ) {
+ options.label = this.buttonElement.html();
+ }
+
+ if ( this.element.is( ":disabled" ) ) {
+ options.disabled = true;
+ }
+
+ this.buttonElement
+ .addClass( baseClasses )
+ .attr( "role", "button" )
+ .bind( "mouseenter.button", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).addClass( "ui-state-hover" );
+ if ( this === lastActive ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ .bind( "mouseleave.button", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( hoverClass );
+ })
+ .bind( "click.button", function( event ) {
+ if ( options.disabled ) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ }
+ });
+
+ this.element
+ .bind( "focus.button", function() {
+ // no need to check disabled, focus won't be triggered anyway
+ self.buttonElement.addClass( focusClass );
+ })
+ .bind( "blur.button", function() {
+ self.buttonElement.removeClass( focusClass );
+ });
+
+ if ( toggleButton ) {
+ this.element.bind( "change.button", function() {
+ if ( clickDragged ) {
+ return;
+ }
+ self.refresh();
+ });
+ // if mouse moves between mousedown and mouseup (drag) set clickDragged flag
+ // prevents issue where button state changes but checkbox/radio checked state
+ // does not in Firefox (see ticket #6970)
+ this.buttonElement
+ .bind( "mousedown.button", function( event ) {
+ if ( options.disabled ) {
+ return;
+ }
+ clickDragged = false;
+ startXPos = event.pageX;
+ startYPos = event.pageY;
+ })
+ .bind( "mouseup.button", function( event ) {
+ if ( options.disabled ) {
+ return;
+ }
+ if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
+ clickDragged = true;
+ }
+ });
+ }
+
+ if ( this.type === "checkbox" ) {
+ this.buttonElement.bind( "click.button", function() {
+ if ( options.disabled || clickDragged ) {
+ return false;
+ }
+ $( this ).toggleClass( "ui-state-active" );
+ self.buttonElement.attr( "aria-pressed", self.element[0].checked );
+ });
+ } else if ( this.type === "radio" ) {
+ this.buttonElement.bind( "click.button", function() {
+ if ( options.disabled || clickDragged ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ self.buttonElement.attr( "aria-pressed", "true" );
+
+ var radio = self.element[ 0 ];
+ radioGroup( radio )
+ .not( radio )
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ });
+ } else {
+ this.buttonElement
+ .bind( "mousedown.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ lastActive = this;
+ $( document ).one( "mouseup", function() {
+ lastActive = null;
+ });
+ })
+ .bind( "mouseup.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).removeClass( "ui-state-active" );
+ })
+ .bind( "keydown.button", function(event) {
+ if ( options.disabled ) {
+ return false;
+ }
+ if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ .bind( "keyup.button", function() {
+ $( this ).removeClass( "ui-state-active" );
+ });
+
+ if ( this.buttonElement.is("a") ) {
+ this.buttonElement.keyup(function(event) {
+ if ( event.keyCode === $.ui.keyCode.SPACE ) {
+ // TODO pass through original event correctly (just as 2nd argument doesn't work)
+ $( this ).click();
+ }
+ });
+ }
+ }
+
+ // TODO: pull out $.Widget's handling for the disabled option into
+ // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
+ // be overridden by individual plugins
+ this._setOption( "disabled", options.disabled );
+ this._resetButton();
+ },
+
+ _determineButtonType: function() {
+
+ if ( this.element.is(":checkbox") ) {
+ this.type = "checkbox";
+ } else if ( this.element.is(":radio") ) {
+ this.type = "radio";
+ } else if ( this.element.is("input") ) {
+ this.type = "input";
+ } else {
+ this.type = "button";
+ }
+
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ // we don't search against the document in case the element
+ // is disconnected from the DOM
+ var ancestor = this.element.parents().filter(":last"),
+ labelSelector = "label[for='" + this.element.attr("id") + "']";
+ this.buttonElement = ancestor.find( labelSelector );
+ if ( !this.buttonElement.length ) {
+ ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
+ this.buttonElement = ancestor.filter( labelSelector );
+ if ( !this.buttonElement.length ) {
+ this.buttonElement = ancestor.find( labelSelector );
+ }
+ }
+ this.element.addClass( "ui-helper-hidden-accessible" );
+
+ var checked = this.element.is( ":checked" );
+ if ( checked ) {
+ this.buttonElement.addClass( "ui-state-active" );
+ }
+ this.buttonElement.attr( "aria-pressed", checked );
+ } else {
+ this.buttonElement = this.element;
+ }
+ },
+
+ widget: function() {
+ return this.buttonElement;
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-helper-hidden-accessible" );
+ this.buttonElement
+ .removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
+ .removeAttr( "role" )
+ .removeAttr( "aria-pressed" )
+ .html( this.buttonElement.find(".ui-button-text").html() );
+
+ if ( !this.hasTitle ) {
+ this.buttonElement.removeAttr( "title" );
+ }
+
+ $.Widget.prototype.destroy.call( this );
+ },
+
+ _setOption: function( key, value ) {
+ $.Widget.prototype._setOption.apply( this, arguments );
+ if ( key === "disabled" ) {
+ if ( value ) {
+ this.element.propAttr( "disabled", true );
+ } else {
+ this.element.propAttr( "disabled", false );
+ }
+ return;
+ }
+ this._resetButton();
+ },
+
+ refresh: function() {
+ var isDisabled = this.element.is( ":disabled" );
+ if ( isDisabled !== this.options.disabled ) {
+ this._setOption( "disabled", isDisabled );
+ }
+ if ( this.type === "radio" ) {
+ radioGroup( this.element[0] ).each(function() {
+ if ( $( this ).is( ":checked" ) ) {
+ $( this ).button( "widget" )
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", "true" );
+ } else {
+ $( this ).button( "widget" )
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ }
+ });
+ } else if ( this.type === "checkbox" ) {
+ if ( this.element.is( ":checked" ) ) {
+ this.buttonElement
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", "true" );
+ } else {
+ this.buttonElement
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", "false" );
+ }
+ }
+ },
+
+ _resetButton: function() {
+ if ( this.type === "input" ) {
+ if ( this.options.label ) {
+ this.element.val( this.options.label );
+ }
+ return;
+ }
+ var buttonElement = this.buttonElement.removeClass( typeClasses ),
+ buttonText = $( "<span></span>" )
+ .addClass( "ui-button-text" )
+ .html( this.options.label )
+ .appendTo( buttonElement.empty() )
+ .text(),
+ icons = this.options.icons,
+ multipleIcons = icons.primary && icons.secondary,
+ buttonClasses = [];
+
+ if ( icons.primary || icons.secondary ) {
+ if ( this.options.text ) {
+ buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
+ }
+
+ if ( icons.primary ) {
+ buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
+ }
+
+ if ( icons.secondary ) {
+ buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
+ }
+
+ if ( !this.options.text ) {
+ buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
+
+ if ( !this.hasTitle ) {
+ buttonElement.attr( "title", buttonText );
+ }
+ }
+ } else {
+ buttonClasses.push( "ui-button-text-only" );
+ }
+ buttonElement.addClass( buttonClasses.join( " " ) );
+ }
+});
+
+$.widget( "ui.buttonset", {
+ options: {
+ items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
+ },
+
+ _create: function() {
+ this.element.addClass( "ui-buttonset" );
+ },
+
+ _init: function() {
+ this.refresh();
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "disabled" ) {
+ this.buttons.button( "option", key, value );
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+ },
+
+ refresh: function() {
+ var ltr = this.element.css( "direction" ) === "ltr";
+
+ this.buttons = this.element.find( this.options.items )
+ .filter( ":ui-button" )
+ .button( "refresh" )
+ .end()
+ .not( ":ui-button" )
+ .button()
+ .end()
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+ .filter( ":first" )
+ .addClass( ltr ? "ui-corner-left" : "ui-corner-right" )
+ .end()
+ .filter( ":last" )
+ .addClass( ltr ? "ui-corner-right" : "ui-corner-left" )
+ .end()
+ .end();
+ },
+
+ destroy: function() {
+ this.element.removeClass( "ui-buttonset" );
+ this.buttons
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-left ui-corner-right" )
+ .end()
+ .button( "destroy" );
+
+ $.Widget.prototype.destroy.call( this );
+ }
+});
+
+}( jQuery ) );
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ * jquery.ui.core.js
+ */
+(function( $, undefined ) {
+
+$.extend($.ui, { datepicker: { version: "1.8.16" } });
+
+var PROP_NAME = 'datepicker';
+var dpuuid = new Date().getTime();
+var instActive;
+
+/* Date picker manager.
+ Use the singleton instance of this class, $.datepicker, to interact with the date picker.
+ Settings for (groups of) date pickers are maintained in an instance object,
+ allowing multiple different settings on the same page. */
+
+function Datepicker() {
+ this.debug = false; // Change this to true to start debugging
+ this._curInst = null; // The current instance in use
+ this._keyEvent = false; // If the last event was a key event
+ this._disabledInputs = []; // List of date picker inputs that have been disabled
+ this._datepickerShowing = false; // True if the popup picker is showing , false if not
+ this._inDialog = false; // True if showing within a "dialog", false if not
+ this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
+ this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
+ this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
+ this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
+ this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
+ this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
+ this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
+ this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
+ this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
+ this.regional = []; // Available regional settings, indexed by language code
+ this.regional[''] = { // Default regional settings
+ closeText: 'Done', // Display text for close link
+ prevText: 'Prev', // Display text for previous month link
+ nextText: 'Next', // Display text for next month link
+ currentText: 'Today', // Display text for current month link
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'], // Names of months for drop-down and formatting
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
+ weekHeader: 'Wk', // Column header for week of the year
+ dateFormat: 'mm/dd/yy', // See format options on parseDate
+ firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+ isRTL: false, // True if right-to-left language, false if left-to-right
+ showMonthAfterYear: false, // True if the year select precedes month, false for month then year
+ yearSuffix: '' // Additional text to append to the year in the month headers
+ };
+ this._defaults = { // Global defaults for all the date picker instances
+ showOn: 'focus', // 'focus' for popup on focus,
+ // 'button' for trigger button, or 'both' for either
+ showAnim: 'fadeIn', // Name of jQuery animation for popup
+ showOptions: {}, // Options for enhanced animations
+ defaultDate: null, // Used when field is blank: actual date,
+ // +/-number for offset from today, null for today
+ appendText: '', // Display text following the input box, e.g. showing the format
+ buttonText: '...', // Text for trigger button
+ buttonImage: '', // URL for trigger button image
+ buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
+ hideIfNoPrevNext: false, // True to hide next/previous month links
+ // if not applicable, false to just disable them
+ navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
+ gotoCurrent: false, // True if today link goes back to current selection instead
+ changeMonth: false, // True if month can be selected directly, false if only prev/next
+ changeYear: false, // True if year can be selected directly, false if only prev/next
+ yearRange: 'c-10:c+10', // Range of years to display in drop-down,
+ // either relative to today's year (-nn:+nn), relative to currently displayed year
+ // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+ showOtherMonths: false, // True to show dates in other months, false to leave blank
+ selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
+ showWeek: false, // True to show week of the year, false to not show it
+ calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+ // takes a Date and returns the number of the week for it
+ shortYearCutoff: '+10', // Short year values < this are in the current century,
+ // > this are in the previous century,
+ // string value starting with '+' for current year + value
+ minDate: null, // The earliest selectable date, or null for no limit
+ maxDate: null, // The latest selectable date, or null for no limit
+ duration: 'fast', // Duration of display/closure
+ beforeShowDay: null, // Function that takes a date and returns an array with
+ // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
+ // [2] = cell title (optional), e.g. $.datepicker.noWeekends
+ beforeShow: null, // Function that takes an input field and
+ // returns a set of custom settings for the date picker
+ onSelect: null, // Define a callback function when a date is selected
+ onChangeMonthYear: null, // Define a callback function when the month or year is changed
+ onClose: null, // Define a callback function when the datepicker is closed
+ numberOfMonths: 1, // Number of months to show at a time
+ showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
+ stepMonths: 1, // Number of months to step back/forward
+ stepBigMonths: 12, // Number of months to step back/forward for the big links
+ altField: '', // Selector for an alternate field to store selected dates into
+ altFormat: '', // The date format to use for the alternate field
+ constrainInput: true, // The input is constrained by the current date format
+ showButtonPanel: false, // True to show button panel, false to not show it
+ autoSize: false, // True to size the input for the date format, false to leave as is
+ disabled: false // The initial disabled state
+ };
+ $.extend(this._defaults, this.regional['']);
+ this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'));
+}
+
+$.extend(Datepicker.prototype, {
+ /* Class name added to elements to indicate already configured with a date picker. */
+ markerClassName: 'hasDatepicker',
+
+ //Keep track of the maximum number of rows displayed (see #7043)
+ maxRows: 4,
+
+ /* Debug logging (if enabled). */
+ log: function () {
+ if (this.debug)
+ console.log.apply('', arguments);
+ },
+
+ // TODO rename to "widget" when switching to widget factory
+ _widgetDatepicker: function() {
+ return this.dpDiv;
+ },
+
+ /* Override the default settings for all instances of the date picker.
+ @param settings object - the new settings to use as defaults (anonymous object)
+ @return the manager object */
+ setDefaults: function(settings) {
+ extendRemove(this._defaults, settings || {});
+ return this;
+ },
+
+ /* Attach the date picker to a jQuery selection.
+ @param target element - the target input field or division or span
+ @param settings object - the new settings to use for this date picker instance (anonymous) */
+ _attachDatepicker: function(target, settings) {
+ // check for settings on the control itself - in namespace 'date:'
+ var inlineSettings = null;
+ for (var attrName in this._defaults) {
+ var attrValue = target.getAttribute('date:' + attrName);
+ if (attrValue) {
+ inlineSettings = inlineSettings || {};
+ try {
+ inlineSettings[attrName] = eval(attrValue);
+ } catch (err) {
+ inlineSettings[attrName] = attrValue;
+ }
+ }
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ var inline = (nodeName == 'div' || nodeName == 'span');
+ if (!target.id) {
+ this.uuid += 1;
+ target.id = 'dp' + this.uuid;
+ }
+ var inst = this._newInst($(target), inline);
+ inst.settings = $.extend({}, settings || {}, inlineSettings || {});
+ if (nodeName == 'input') {
+ this._connectDatepicker(target, inst);
+ } else if (inline) {
+ this._inlineDatepicker(target, inst);
+ }
+ },
+
+ /* Create a new instance object. */
+ _newInst: function(target, inline) {
+ var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
+ return {id: id, input: target, // associated target
+ selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+ drawMonth: 0, drawYear: 0, // month being drawn
+ inline: inline, // is datepicker inline or not
+ dpDiv: (!inline ? this.dpDiv : // presentation div
+ bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))};
+ },
+
+ /* Attach the date picker to an input field. */
+ _connectDatepicker: function(target, inst) {
+ var input = $(target);
+ inst.append = $([]);
+ inst.trigger = $([]);
+ if (input.hasClass(this.markerClassName))
+ return;
+ this._attachments(input, inst);
+ input.addClass(this.markerClassName).keydown(this._doKeyDown).
+ keypress(this._doKeyPress).keyup(this._doKeyUp).
+ bind("setData.datepicker", function(event, key, value) {
+ inst.settings[key] = value;
+ }).bind("getData.datepicker", function(event, key) {
+ return this._get(inst, key);
+ });
+ this._autoSize(inst);
+ $.data(target, PROP_NAME, inst);
+ //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
+ if( inst.settings.disabled ) {
+ this._disableDatepicker( target );
+ }
+ },
+
+ /* Make attachments based on settings. */
+ _attachments: function(input, inst) {
+ var appendText = this._get(inst, 'appendText');
+ var isRTL = this._get(inst, 'isRTL');
+ if (inst.append)
+ inst.append.remove();
+ if (appendText) {
+ inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
+ input[isRTL ? 'before' : 'after'](inst.append);
+ }
+ input.unbind('focus', this._showDatepicker);
+ if (inst.trigger)
+ inst.trigger.remove();
+ var showOn = this._get(inst, 'showOn');
+ if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
+ input.focus(this._showDatepicker);
+ if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
+ var buttonText = this._get(inst, 'buttonText');
+ var buttonImage = this._get(inst, 'buttonImage');
+ inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
+ $('<img/>').addClass(this._triggerClass).
+ attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
+ $('<button type="button"></button>').addClass(this._triggerClass).
+ html(buttonImage == '' ? buttonText : $('<img/>').attr(
+ { src:buttonImage, alt:buttonText, title:buttonText })));
+ input[isRTL ? 'before' : 'after'](inst.trigger);
+ inst.trigger.click(function() {
+ if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
+ $.datepicker._hideDatepicker();
+ else
+ $.datepicker._showDatepicker(input[0]);
+ return false;
+ });
+ }
+ },
+
+ /* Apply the maximum length for the date format. */
+ _autoSize: function(inst) {
+ if (this._get(inst, 'autoSize') && !inst.inline) {
+ var date = new Date(2009, 12 - 1, 20); // Ensure double digits
+ var dateFormat = this._get(inst, 'dateFormat');
+ if (dateFormat.match(/[DM]/)) {
+ var findMax = function(names) {
+ var max = 0;
+ var maxI = 0;
+ for (var i = 0; i < names.length; i++) {
+ if (names[i].length > max) {
+ max = names[i].length;
+ maxI = i;
+ }
+ }
+ return maxI;
+ };
+ date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
+ 'monthNames' : 'monthNamesShort'))));
+ date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
+ 'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
+ }
+ inst.input.attr('size', this._formatDate(inst, date).length);
+ }
+ },
+
+ /* Attach an inline date picker to a div. */
+ _inlineDatepicker: function(target, inst) {
+ var divSpan = $(target);
+ if (divSpan.hasClass(this.markerClassName))
+ return;
+ divSpan.addClass(this.markerClassName).append(inst.dpDiv).
+ bind("setData.datepicker", function(event, key, value){
+ inst.settings[key] = value;
+ }).bind("getData.datepicker", function(event, key){
+ return this._get(inst, key);
+ });
+ $.data(target, PROP_NAME, inst);
+ this._setDate(inst, this._getDefaultDate(inst), true);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
+ if( inst.settings.disabled ) {
+ this._disableDatepicker( target );
+ }
+ // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
+ // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
+ inst.dpDiv.css( "display", "block" );
+ },
+
+ /* Pop-up the date picker in a "dialog" box.
+ @param input element - ignored
+ @param date string or Date - the initial date to display
+ @param onSelect function - the function to call when a date is selected
+ @param settings object - update the dialog date picker instance's settings (anonymous object)
+ @param pos int[2] - coordinates for the dialog's position within the screen or
+ event - with x/y coordinates or
+ leave empty for default (screen centre)
+ @return the manager object */
+ _dialogDatepicker: function(input, date, onSelect, settings, pos) {
+ var inst = this._dialogInst; // internal instance
+ if (!inst) {
+ this.uuid += 1;
+ var id = 'dp' + this.uuid;
+ this._dialogInput = $('<input type="text" id="' + id +
+ '" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');
+ this._dialogInput.keydown(this._doKeyDown);
+ $('body').append(this._dialogInput);
+ inst = this._dialogInst = this._newInst(this._dialogInput, false);
+ inst.settings = {};
+ $.data(this._dialogInput[0], PROP_NAME, inst);
+ }
+ extendRemove(inst.settings, settings || {});
+ date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
+ this._dialogInput.val(date);
+
+ this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
+ if (!this._pos) {
+ var browserWidth = document.documentElement.clientWidth;
+ var browserHeight = document.documentElement.clientHeight;
+ var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+ var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+ this._pos = // should use actual width/height below
+ [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
+ }
+
+ // move input on screen for focus, but hidden behind dialog
+ this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
+ inst.settings.onSelect = onSelect;
+ this._inDialog = true;
+ this.dpDiv.addClass(this._dialogClass);
+ this._showDatepicker(this._dialogInput[0]);
+ if ($.blockUI)
+ $.blockUI(this.dpDiv);
+ $.data(this._dialogInput[0], PROP_NAME, inst);
+ return this;
+ },
+
+ /* Detach a datepicker from its control.
+ @param target element - the target input field or division or span */
+ _destroyDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ $.removeData(target, PROP_NAME);
+ if (nodeName == 'input') {
+ inst.append.remove();
+ inst.trigger.remove();
+ $target.removeClass(this.markerClassName).
+ unbind('focus', this._showDatepicker).
+ unbind('keydown', this._doKeyDown).
+ unbind('keypress', this._doKeyPress).
+ unbind('keyup', this._doKeyUp);
+ } else if (nodeName == 'div' || nodeName == 'span')
+ $target.removeClass(this.markerClassName).empty();
+ },
+
+ /* Enable the date picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _enableDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = false;
+ inst.trigger.filter('button').
+ each(function() { this.disabled = false; }).end().
+ filter('img').css({opacity: '1.0', cursor: ''});
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().removeClass('ui-state-disabled');
+ inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+ removeAttr("disabled");
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target ? null : value); }); // delete entry
+ },
+
+ /* Disable the date picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _disableDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = true;
+ inst.trigger.filter('button').
+ each(function() { this.disabled = true; }).end().
+ filter('img').css({opacity: '0.5', cursor: 'default'});
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().addClass('ui-state-disabled');
+ inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+ attr("disabled", "disabled");
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target ? null : value); }); // delete entry
+ this._disabledInputs[this._disabledInputs.length] = target;
+ },
+
+ /* Is the first field in a jQuery collection disabled as a datepicker?
+ @param target element - the target input field or division or span
+ @return boolean - true if disabled, false if enabled */
+ _isDisabledDatepicker: function(target) {
+ if (!target) {
+ return false;
+ }
+ for (var i = 0; i < this._disabledInputs.length; i++) {
+ if (this._disabledInputs[i] == target)
+ return true;
+ }
+ return false;
+ },
+
+ /* Retrieve the instance data for the target control.
+ @param target element - the target input field or division or span
+ @return object - the associated instance data
+ @throws error if a jQuery problem getting data */
+ _getInst: function(target) {
+ try {
+ return $.data(target, PROP_NAME);
+ }
+ catch (err) {
+ throw 'Missing instance data for this datepicker';
+ }
+ },
+
+ /* Update or retrieve the settings for a date picker attached to an input field or division.
+ @param target element - the target input field or division or span
+ @param name object - the new settings to update or
+ string - the name of the setting to change or retrieve,
+ when retrieving also 'all' for all instance settings or
+ 'defaults' for all global defaults
+ @param value any - the new value for the setting
+ (omit if above is an object or to retrieve a value) */
+ _optionDatepicker: function(target, name, value) {
+ var inst = this._getInst(target);
+ if (arguments.length == 2 && typeof name == 'string') {
+ return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
+ (inst ? (name == 'all' ? $.extend({}, inst.settings) :
+ this._get(inst, name)) : null));
+ }
+ var settings = name || {};
+ if (typeof name == 'string') {
+ settings = {};
+ settings[name] = value;
+ }
+ if (inst) {
+ if (this._curInst == inst) {
+ this._hideDatepicker();
+ }
+ var date = this._getDateDatepicker(target, true);
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ extendRemove(inst.settings, settings);
+ // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
+ if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
+ inst.settings.minDate = this._formatDate(inst, minDate);
+ if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
+ inst.settings.maxDate = this._formatDate(inst, maxDate);
+ this._attachments($(target), inst);
+ this._autoSize(inst);
+ this._setDate(inst, date);
+ this._updateAlternate(inst);
+ this._updateDatepicker(inst);
+ }
+ },
+
+ // change method deprecated
+ _changeDatepicker: function(target, name, value) {
+ this._optionDatepicker(target, name, value);
+ },
+
+ /* Redraw the date picker attached to an input field or division.
+ @param target element - the target input field or division or span */
+ _refreshDatepicker: function(target) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._updateDatepicker(inst);
+ }
+ },
+
+ /* Set the dates for a jQuery selection.
+ @param target element - the target input field or division or span
+ @param date Date - the new date */
+ _setDateDatepicker: function(target, date) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._setDate(inst, date);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ }
+ },
+
+ /* Get the date(s) for the first entry in a jQuery selection.
+ @param target element - the target input field or division or span
+ @param noDefault boolean - true if no default date is to be used
+ @return Date - the current date */
+ _getDateDatepicker: function(target, noDefault) {
+ var inst = this._getInst(target);
+ if (inst && !inst.inline)
+ this._setDateFromField(inst, noDefault);
+ return (inst ? this._getDate(inst) : null);
+ },
+
+ /* Handle keystrokes. */
+ _doKeyDown: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ var handled = true;
+ var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
+ inst._keyEvent = true;
+ if ($.datepicker._datepickerShowing)
+ switch (event.keyCode) {
+ case 9: $.datepicker._hideDatepicker();
+ handled = false;
+ break; // hide on tab out
+ case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' +
+ $.datepicker._currentClass + ')', inst.dpDiv);
+ if (sel[0])
+ $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
+ var onSelect = $.datepicker._get(inst, 'onSelect');
+ if (onSelect) {
+ var dateStr = $.datepicker._formatDate(inst);
+
+ // trigger custom callback
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
+ }
+ else
+ $.datepicker._hideDatepicker();
+ return false; // don't submit the form
+ break; // select the value on enter
+ case 27: $.datepicker._hideDatepicker();
+ break; // hide on escape
+ case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, 'stepBigMonths') :
+ -$.datepicker._get(inst, 'stepMonths')), 'M');
+ break; // previous month/year on page up/+ ctrl
+ case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, 'stepBigMonths') :
+ +$.datepicker._get(inst, 'stepMonths')), 'M');
+ break; // next month/year on page down/+ ctrl
+ case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
+ handled = event.ctrlKey || event.metaKey;
+ break; // clear on ctrl or command +end
+ case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
+ handled = event.ctrlKey || event.metaKey;
+ break; // current on ctrl or command +home
+ case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
+ handled = event.ctrlKey || event.metaKey;
+ // -1 day on ctrl or command +left
+ if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, 'stepBigMonths') :
+ -$.datepicker._get(inst, 'stepMonths')), 'M');
+ // next month/year on alt +left on Mac
+ break;
+ case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
+ handled = event.ctrlKey || event.metaKey;
+ break; // -1 week on ctrl or command +up
+ case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
+ handled = event.ctrlKey || event.metaKey;
+ // +1 day on ctrl or command +right
+ if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, 'stepBigMonths') :
+ +$.datepicker._get(inst, 'stepMonths')), 'M');
+ // next month/year on alt +right
+ break;
+ case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
+ handled = event.ctrlKey || event.metaKey;
+ break; // +1 week on ctrl or command +down
+ default: handled = false;
+ }
+ else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
+ $.datepicker._showDatepicker(this);
+ else {
+ handled = false;
+ }
+ if (handled) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /* Filter entered characters - based on date format. */
+ _doKeyPress: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ if ($.datepicker._get(inst, 'constrainInput')) {
+ var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
+ var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
+ return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
+ }
+ },
+
+ /* Synchronise manual entry and field/alternate field. */
+ _doKeyUp: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ if (inst.input.val() != inst.lastVal) {
+ try {
+ var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+ (inst.input ? inst.input.val() : null),
+ $.datepicker._getFormatConfig(inst));
+ if (date) { // only if valid
+ $.datepicker._setDateFromField(inst);
+ $.datepicker._updateAlternate(inst);
+ $.datepicker._updateDatepicker(inst);
+ }
+ }
+ catch (event) {
+ $.datepicker.log(event);
+ }
+ }
+ return true;
+ },
+
+ /* Pop-up the date picker for a given input field.
+ If false returned from beforeShow event handler do not show.
+ @param input element - the input field attached to the date picker or
+ event - if triggered by focus */
+ _showDatepicker: function(input) {
+ input = input.target || input;
+ if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
+ input = $('input', input.parentNode)[0];
+ if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
+ return;
+ var inst = $.datepicker._getInst(input);
+ if ($.datepicker._curInst && $.datepicker._curInst != inst) {
+ if ( $.datepicker._datepickerShowing ) {
+ $.datepicker._triggerOnClose($.datepicker._curInst);
+ }
+ $.datepicker._curInst.dpDiv.stop(true, true);
+ }
+ var beforeShow = $.datepicker._get(inst, 'beforeShow');
+ var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
+ if(beforeShowSettings === false){
+ //false
+ return;
+ }
+ extendRemove(inst.settings, beforeShowSettings);
+ inst.lastVal = null;
+ $.datepicker._lastInput = input;
+ $.datepicker._setDateFromField(inst);
+ if ($.datepicker._inDialog) // hide cursor
+ input.value = '';
+ if (!$.datepicker._pos) { // position below input
+ $.datepicker._pos = $.datepicker._findPos(input);
+ $.datepicker._pos[1] += input.offsetHeight; // add the height
+ }
+ var isFixed = false;
+ $(input).parents().each(function() {
+ isFixed |= $(this).css('position') == 'fixed';
+ return !isFixed;
+ });
+ if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
+ $.datepicker._pos[0] -= document.documentElement.scrollLeft;
+ $.datepicker._pos[1] -= document.documentElement.scrollTop;
+ }
+ var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
+ $.datepicker._pos = null;
+ //to avoid flashes on Firefox
+ inst.dpDiv.empty();
+ // determine sizing offscreen
+ inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
+ $.datepicker._updateDatepicker(inst);
+ // fix width for dynamic number of date pickers
+ // and adjust position before showing
+ offset = $.datepicker._checkOffset(inst, offset, isFixed);
+ inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
+ 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
+ left: offset.left + 'px', top: offset.top + 'px'});
+ if (!inst.inline) {
+ var showAnim = $.datepicker._get(inst, 'showAnim');
+ var duration = $.datepicker._get(inst, 'duration');
+ var postProcess = function() {
+ var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+ if( !! cover.length ){
+ var borders = $.datepicker._getBorders(inst.dpDiv);
+ cover.css({left: -borders[0], top: -borders[1],
+ width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
+ }
+ };
+ inst.dpDiv.zIndex($(input).zIndex()+1);
+ $.datepicker._datepickerShowing = true;
+ if ($.effects && $.effects[showAnim])
+ inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+ else
+ inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
+ if (!showAnim || !duration)
+ postProcess();
+ if (inst.input.is(':visible') && !inst.input.is(':disabled'))
+ inst.input.focus();
+ $.datepicker._curInst = inst;
+ }
+ },
+
+ /* Generate the date picker content. */
+ _updateDatepicker: function(inst) {
+ var self = this;
+ self.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
+ var borders = $.datepicker._getBorders(inst.dpDiv);
+ instActive = inst; // for delegate hover events
+ inst.dpDiv.empty().append(this._generateHTML(inst));
+ var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+ if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
+ cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
+ }
+ inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover();
+ var numMonths = this._getNumberOfMonths(inst);
+ var cols = numMonths[1];
+ var width = 17;
+ inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
+ if (cols > 1)
+ inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
+ inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
+ 'Class']('ui-datepicker-multi');
+ inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
+ 'Class']('ui-datepicker-rtl');
+ if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
+ // #6694 - don't focus the input if it's already focused
+ // this breaks the change event in IE
+ inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
+ inst.input.focus();
+ // deffered render of the years select (to avoid flashes on Firefox)
+ if( inst.yearshtml ){
+ var origyearshtml = inst.yearshtml;
+ setTimeout(function(){
+ //assure that inst.yearshtml didn't change.
+ if( origyearshtml === inst.yearshtml && inst.yearshtml ){
+ inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
+ }
+ origyearshtml = inst.yearshtml = null;
+ }, 0);
+ }
+ },
+
+ /* Retrieve the size of left and top borders for an element.
+ @param elem (jQuery object) the element of interest
+ @return (number[2]) the left and top borders */
+ _getBorders: function(elem) {
+ var convert = function(value) {
+ return {thin: 1, medium: 2, thick: 3}[value] || value;
+ };
+ return [parseFloat(convert(elem.css('border-left-width'))),
+ parseFloat(convert(elem.css('border-top-width')))];
+ },
+
+ /* Check positioning to remain on screen. */
+ _checkOffset: function(inst, offset, isFixed) {
+ var dpWidth = inst.dpDiv.outerWidth();
+ var dpHeight = inst.dpDiv.outerHeight();
+ var inputWidth = inst.input ? inst.input.outerWidth() : 0;
+ var inputHeight = inst.input ? inst.input.outerHeight() : 0;
+ var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
+ var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
+
+ offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
+ offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
+ offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
+
+ // now check if datepicker is showing outside window viewport - move to a better place if so.
+ offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
+ Math.abs(offset.left + dpWidth - viewWidth) : 0);
+ offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
+ Math.abs(dpHeight + inputHeight) : 0);
+
+ return offset;
+ },
+
+ /* Find an object's position on the screen. */
+ _findPos: function(obj) {
+ var inst = this._getInst(obj);
+ var isRTL = this._get(inst, 'isRTL');
+ while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
+ obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+ }
+ var position = $(obj).offset();
+ return [position.left, position.top];
+ },
+
+ /* Trigger custom callback of onClose. */
+ _triggerOnClose: function(inst) {
+ var onClose = this._get(inst, 'onClose');
+ if (onClose)
+ onClose.apply((inst.input ? inst.input[0] : null),
+ [(inst.input ? inst.input.val() : ''), inst]);
+ },
+
+ /* Hide the date picker from view.
+ @param input element - the input field attached to the date picker */
+ _hideDatepicker: function(input) {
+ var inst = this._curInst;
+ if (!inst || (input && inst != $.data(input, PROP_NAME)))
+ return;
+ if (this._datepickerShowing) {
+ var showAnim = this._get(inst, 'showAnim');
+ var duration = this._get(inst, 'duration');
+ var postProcess = function() {
+ $.datepicker._tidyDialog(inst);
+ this._curInst = null;
+ };
+ if ($.effects && $.effects[showAnim])
+ inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+ else
+ inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
+ (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
+ if (!showAnim)
+ postProcess();
+ $.datepicker._triggerOnClose(inst);
+ this._datepickerShowing = false;
+ this._lastInput = null;
+ if (this._inDialog) {
+ this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
+ if ($.blockUI) {
+ $.unblockUI();
+ $('body').append(this.dpDiv);
+ }
+ }
+ this._inDialog = false;
+ }
+ },
+
+ /* Tidy up after a dialog display. */
+ _tidyDialog: function(inst) {
+ inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
+ },
+
+ /* Close date picker if clicked elsewhere. */
+ _checkExternalClick: function(event) {
+ if (!$.datepicker._curInst)
+ return;
+ var $target = $(event.target);
+ if ($target[0].id != $.datepicker._mainDivId &&
+ $target.parents('#' + $.datepicker._mainDivId).length == 0 &&
+ !$target.hasClass($.datepicker.markerClassName) &&
+ !$target.hasClass($.datepicker._triggerClass) &&
+ $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
+ $.datepicker._hideDatepicker();
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustDate: function(id, offset, period) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (this._isDisabledDatepicker(target[0])) {
+ return;
+ }
+ this._adjustInstDate(inst, offset +
+ (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
+ period);
+ this._updateDatepicker(inst);
+ },
+
+ /* Action for current link. */
+ _gotoToday: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
+ inst.selectedDay = inst.currentDay;
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+ inst.drawYear = inst.selectedYear = inst.currentYear;
+ }
+ else {
+ var date = new Date();
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ }
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Action for selecting a new month/year. */
+ _selectMonthYear: function(id, select, period) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
+ inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
+ parseInt(select.options[select.selectedIndex].value,10);
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Action for selecting a day. */
+ _selectDay: function(id, month, year, td) {
+ var target = $(id);
+ if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
+ return;
+ }
+ var inst = this._getInst(target[0]);
+ inst.selectedDay = inst.currentDay = $('a', td).html();
+ inst.selectedMonth = inst.currentMonth = month;
+ inst.selectedYear = inst.currentYear = year;
+ this._selectDate(id, this._formatDate(inst,
+ inst.currentDay, inst.currentMonth, inst.currentYear));
+ },
+
+ /* Erase the input field and hide the date picker. */
+ _clearDate: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ this._selectDate(target, '');
+ },
+
+ /* Update the input field with the selected date. */
+ _selectDate: function(id, dateStr) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+ if (inst.input)
+ inst.input.val(dateStr);
+ this._updateAlternate(inst);
+ var onSelect = this._get(inst, 'onSelect');
+ if (onSelect)
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback
+ else if (inst.input)
+ inst.input.trigger('change'); // fire the change event
+ if (inst.inline)
+ this._updateDatepicker(inst);
+ else {
+ this._hideDatepicker();
+ this._lastInput = inst.input[0];
+ if (typeof(inst.input[0]) != 'object')
+ inst.input.focus(); // restore focus
+ this._lastInput = null;
+ }
+ },
+
+ /* Update any alternate field to synchronise with the main field. */
+ _updateAlternate: function(inst) {
+ var altField = this._get(inst, 'altField');
+ if (altField) { // update alternate field too
+ var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
+ var date = this._getDate(inst);
+ var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
+ $(altField).each(function() { $(this).val(dateStr); });
+ }
+ },
+
+ /* Set as beforeShowDay function to prevent selection of weekends.
+ @param date Date - the date to customise
+ @return [boolean, string] - is this date selectable?, what is its CSS class? */
+ noWeekends: function(date) {
+ var day = date.getDay();
+ return [(day > 0 && day < 6), ''];
+ },
+
+ /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+ @param date Date - the date to get the week for
+ @return number - the number of the week within the year that contains this date */
+ iso8601Week: function(date) {
+ var checkDate = new Date(date.getTime());
+ // Find Thursday of this week starting on Monday
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+ var time = checkDate.getTime();
+ checkDate.setMonth(0); // Compare with Jan 1
+ checkDate.setDate(1);
+ return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+ },
+
+ /* Parse a string value into a date object.
+ See formatDate below for the possible formats.
+
+ @param format string - the expected format of the date
+ @param value string - the date in the above format
+ @param settings Object - attributes include:
+ shortYearCutoff number - the cutoff year for determining the century (optional)
+ dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ dayNames string[7] - names of the days from Sunday (optional)
+ monthNamesShort string[12] - abbreviated names of the months (optional)
+ monthNames string[12] - names of the months (optional)
+ @return Date - the extracted date value or null if value is blank */
+ parseDate: function (format, value, settings) {
+ if (format == null || value == null)
+ throw 'Invalid arguments';
+ value = (typeof value == 'object' ? value.toString() : value + '');
+ if (value == '')
+ return null;
+ var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
+ shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+ var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+ var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+ var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+ var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+ var year = -1;
+ var month = -1;
+ var day = -1;
+ var doy = -1;
+ var literal = false;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ // Extract a number from the string value
+ var getNumber = function(match) {
+ var isDoubled = lookAhead(match);
+ var size = (match == '@' ? 14 : (match == '!' ? 20 :
+ (match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
+ var digits = new RegExp('^\\d{1,' + size + '}');
+ var num = value.substring(iValue).match(digits);
+ if (!num)
+ throw 'Missing number at position ' + iValue;
+ iValue += num[0].length;
+ return parseInt(num[0], 10);
+ };
+ // Extract a name from the string value and convert to an index
+ var getName = function(match, shortNames, longNames) {
+ var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
+ return [ [k, v] ];
+ }).sort(function (a, b) {
+ return -(a[1].length - b[1].length);
+ });
+ var index = -1;
+ $.each(names, function (i, pair) {
+ var name = pair[1];
+ if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
+ index = pair[0];
+ iValue += name.length;
+ return false;
+ }
+ });
+ if (index != -1)
+ return index + 1;
+ else
+ throw 'Unknown name at position ' + iValue;
+ };
+ // Confirm that a literal character matches the string value
+ var checkLiteral = function() {
+ if (value.charAt(iValue) != format.charAt(iFormat))
+ throw 'Unexpected literal at position ' + iValue;
+ iValue++;
+ };
+ var iValue = 0;
+ for (var iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ checkLiteral();
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd':
+ day = getNumber('d');
+ break;
+ case 'D':
+ getName('D', dayNamesShort, dayNames);
+ break;
+ case 'o':
+ doy = getNumber('o');
+ break;
+ case 'm':
+ month = getNumber('m');
+ break;
+ case 'M':
+ month = getName('M', monthNamesShort, monthNames);
+ break;
+ case 'y':
+ year = getNumber('y');
+ break;
+ case '@':
+ var date = new Date(getNumber('@'));
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case '!':
+ var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case "'":
+ if (lookAhead("'"))
+ checkLiteral();
+ else
+ literal = true;
+ break;
+ default:
+ checkLiteral();
+ }
+ }
+ if (iValue < value.length){
+ throw "Extra/unparsed characters found in date: " + value.substring(iValue);
+ }
+ if (year == -1)
+ year = new Date().getFullYear();
+ else if (year < 100)
+ year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+ (year <= shortYearCutoff ? 0 : -100);
+ if (doy > -1) {
+ month = 1;
+ day = doy;
+ do {
+ var dim = this._getDaysInMonth(year, month - 1);
+ if (day <= dim)
+ break;
+ month++;
+ day -= dim;
+ } while (true);
+ }
+ var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
+ if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
+ throw 'Invalid date'; // E.g. 31/02/00
+ return date;
+ },
+
+ /* Standard date formats. */
+ ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
+ COOKIE: 'D, dd M yy',
+ ISO_8601: 'yy-mm-dd',
+ RFC_822: 'D, d M y',
+ RFC_850: 'DD, dd-M-y',
+ RFC_1036: 'D, d M y',
+ RFC_1123: 'D, d M yy',
+ RFC_2822: 'D, d M yy',
+ RSS: 'D, d M y', // RFC 822
+ TICKS: '!',
+ TIMESTAMP: '@',
+ W3C: 'yy-mm-dd', // ISO 8601
+
+ _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
+ Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
+
+ /* Format a date object into a string value.
+ The format can be combinations of the following:
+ d - day of month (no leading zero)
+ dd - day of month (two digit)
+ o - day of year (no leading zeros)
+ oo - day of year (three digit)
+ D - day name short
+ DD - day name long
+ m - month of year (no leading zero)
+ mm - month of year (two digit)
+ M - month name short
+ MM - month name long
+ y - year (two digit)
+ yy - year (four digit)
+ @ - Unix timestamp (ms since 01/01/1970)
+ ! - Windows ticks (100ns since 01/01/0001)
+ '...' - literal text
+ '' - single quote
+
+ @param format string - the desired format of the date
+ @param date Date - the date value to format
+ @param settings Object - attributes include:
+ dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ dayNames string[7] - names of the days from Sunday (optional)
+ monthNamesShort string[12] - abbreviated names of the months (optional)
+ monthNames string[12] - names of the months (optional)
+ @return string - the date in the above format */
+ formatDate: function (format, date, settings) {
+ if (!date)
+ return '';
+ var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+ var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+ var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+ var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ // Format a number, with leading zero if necessary
+ var formatNumber = function(match, value, len) {
+ var num = '' + value;
+ if (lookAhead(match))
+ while (num.length < len)
+ num = '0' + num;
+ return num;
+ };
+ // Format a name, short or long as requested
+ var formatName = function(match, value, shortNames, longNames) {
+ return (lookAhead(match) ? longNames[value] : shortNames[value]);
+ };
+ var output = '';
+ var literal = false;
+ if (date)
+ for (var iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ output += format.charAt(iFormat);
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd':
+ output += formatNumber('d', date.getDate(), 2);
+ break;
+ case 'D':
+ output += formatName('D', date.getDay(), dayNamesShort, dayNames);
+ break;
+ case 'o':
+ output += formatNumber('o',
+ Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
+ break;
+ case 'm':
+ output += formatNumber('m', date.getMonth() + 1, 2);
+ break;
+ case 'M':
+ output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
+ break;
+ case 'y':
+ output += (lookAhead('y') ? date.getFullYear() :
+ (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
+ break;
+ case '@':
+ output += date.getTime();
+ break;
+ case '!':
+ output += date.getTime() * 10000 + this._ticksTo1970;
+ break;
+ case "'":
+ if (lookAhead("'"))
+ output += "'";
+ else
+ literal = true;
+ break;
+ default:
+ output += format.charAt(iFormat);
+ }
+ }
+ return output;
+ },
+
+ /* Extract all possible characters from the date format. */
+ _possibleChars: function (format) {
+ var chars = '';
+ var literal = false;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ for (var iFormat = 0; iFormat < format.length; iFormat++)
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ chars += format.charAt(iFormat);
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd': case 'm': case 'y': case '@':
+ chars += '0123456789';
+ break;
+ case 'D': case 'M':
+ return null; // Accept anything
+ case "'":
+ if (lookAhead("'"))
+ chars += "'";
+ else
+ literal = true;
+ break;
+ default:
+ chars += format.charAt(iFormat);
+ }
+ return chars;
+ },
+
+ /* Get a setting value, defaulting if necessary. */
+ _get: function(inst, name) {
+ return inst.settings[name] !== undefined ?
+ inst.settings[name] : this._defaults[name];
+ },
+
+ /* Parse existing date and initialise date picker. */
+ _setDateFromField: function(inst, noDefault) {
+ if (inst.input.val() == inst.lastVal) {
+ return;
+ }
+ var dateFormat = this._get(inst, 'dateFormat');
+ var dates = inst.lastVal = inst.input ? inst.input.val() : null;
+ var date, defaultDate;
+ date = defaultDate = this._getDefaultDate(inst);
+ var settings = this._getFormatConfig(inst);
+ try {
+ date = this.parseDate(dateFormat, dates, settings) || defaultDate;
+ } catch (event) {
+ this.log(event);
+ dates = (noDefault ? '' : dates);
+ }
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ inst.currentDay = (dates ? date.getDate() : 0);
+ inst.currentMonth = (dates ? date.getMonth() : 0);
+ inst.currentYear = (dates ? date.getFullYear() : 0);
+ this._adjustInstDate(inst);
+ },
+
+ /* Retrieve the default date shown on opening. */
+ _getDefaultDate: function(inst) {
+ return this._restrictMinMax(inst,
+ this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
+ },
+
+ /* A date may be specified as an exact value or a relative one. */
+ _determineDate: function(inst, date, defaultDate) {
+ var offsetNumeric = function(offset) {
+ var date = new Date();
+ date.setDate(date.getDate() + offset);
+ return date;
+ };
+ var offsetString = function(offset) {
+ try {
+ return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+ offset, $.datepicker._getFormatConfig(inst));
+ }
+ catch (e) {
+ // Ignore
+ }
+ var date = (offset.toLowerCase().match(/^c/) ?
+ $.datepicker._getDate(inst) : null) || new Date();
+ var year = date.getFullYear();
+ var month = date.getMonth();
+ var day = date.getDate();
+ var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
+ var matches = pattern.exec(offset);
+ while (matches) {
+ switch (matches[2] || 'd') {
+ case 'd' : case 'D' :
+ day += parseInt(matches[1],10); break;
+ case 'w' : case 'W' :
+ day += parseInt(matches[1],10) * 7; break;
+ case 'm' : case 'M' :
+ month += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ case 'y': case 'Y' :
+ year += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ }
+ matches = pattern.exec(offset);
+ }
+ return new Date(year, month, day);
+ };
+ var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
+ (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
+ newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
+ if (newDate) {
+ newDate.setHours(0);
+ newDate.setMinutes(0);
+ newDate.setSeconds(0);
+ newDate.setMilliseconds(0);
+ }
+ return this._daylightSavingAdjust(newDate);
+ },
+
+ /* Handle switch to/from daylight saving.
+ Hours may be non-zero on daylight saving cut-over:
+ > 12 when midnight changeover, but then cannot generate
+ midnight datetime, so jump to 1AM, otherwise reset.
+ @param date (Date) the date to check
+ @return (Date) the corrected date */
+ _daylightSavingAdjust: function(date) {
+ if (!date) return null;
+ date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
+ return date;
+ },
+
+ /* Set the date(s) directly. */
+ _setDate: function(inst, date, noChange) {
+ var clear = !date;
+ var origMonth = inst.selectedMonth;
+ var origYear = inst.selectedYear;
+ var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
+ inst.selectedDay = inst.currentDay = newDate.getDate();
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+ inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
+ if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
+ this._notifyChange(inst);
+ this._adjustInstDate(inst);
+ if (inst.input) {
+ inst.input.val(clear ? '' : this._formatDate(inst));
+ }
+ },
+
+ /* Retrieve the date(s) directly. */
+ _getDate: function(inst) {
+ var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
+ this._daylightSavingAdjust(new Date(
+ inst.currentYear, inst.currentMonth, inst.currentDay)));
+ return startDate;
+ },
+
+ /* Generate the HTML for the current state of the date picker. */
+ _generateHTML: function(inst) {
+ var today = new Date();
+ today = this._daylightSavingAdjust(
+ new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
+ var isRTL = this._get(inst, 'isRTL');
+ var showButtonPanel = this._get(inst, 'showButtonPanel');
+ var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
+ var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
+ var numMonths = this._getNumberOfMonths(inst);
+ var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
+ var stepMonths = this._get(inst, 'stepMonths');
+ var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
+ var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
+ new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ var drawMonth = inst.drawMonth - showCurrentAtPos;
+ var drawYear = inst.drawYear;
+ if (drawMonth < 0) {
+ drawMonth += 12;
+ drawYear--;
+ }
+ if (maxDate) {
+ var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
+ maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
+ maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
+ while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
+ drawMonth--;
+ if (drawMonth < 0) {
+ drawMonth = 11;
+ drawYear--;
+ }
+ }
+ }
+ inst.drawMonth = drawMonth;
+ inst.drawYear = drawYear;
+ var prevText = this._get(inst, 'prevText');
+ prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
+ this._getFormatConfig(inst)));
+ var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
+ '<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
+ ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
+ (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
+ var nextText = this._get(inst, 'nextText');
+ nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
+ this._getFormatConfig(inst)));
+ var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
+ '<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
+ ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
+ (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
+ var currentText = this._get(inst, 'currentText');
+ var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
+ currentText = (!navigationAsDateFormat ? currentText :
+ this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
+ var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : '');
+ var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
+ (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._gotoToday(\'#' + inst.id + '\');"' +
+ '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
+ var firstDay = parseInt(this._get(inst, 'firstDay'),10);
+ firstDay = (isNaN(firstDay) ? 0 : firstDay);
+ var showWeek = this._get(inst, 'showWeek');
+ var dayNames = this._get(inst, 'dayNames');
+ var dayNamesShort = this._get(inst, 'dayNamesShort');
+ var dayNamesMin = this._get(inst, 'dayNamesMin');
+ var monthNames = this._get(inst, 'monthNames');
+ var monthNamesShort = this._get(inst, 'monthNamesShort');
+ var beforeShowDay = this._get(inst, 'beforeShowDay');
+ var showOtherMonths = this._get(inst, 'showOtherMonths');
+ var selectOtherMonths = this._get(inst, 'selectOtherMonths');
+ var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
+ var defaultDate = this._getDefaultDate(inst);
+ var html = '';
+ for (var row = 0; row < numMonths[0]; row++) {
+ var group = '';
+ this.maxRows = 4;
+ for (var col = 0; col < numMonths[1]; col++) {
+ var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
+ var cornerClass = ' ui-corner-all';
+ var calender = '';
+ if (isMultiMonth) {
+ calender += '<div class="ui-datepicker-group';
+ if (numMonths[1] > 1)
+ switch (col) {
+ case 0: calender += ' ui-datepicker-group-first';
+ cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
+ case numMonths[1]-1: calender += ' ui-datepicker-group-last';
+ cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
+ default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
+ }
+ calender += '">';
+ }
+ calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
+ (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
+ (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
+ this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
+ row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
+ '</div><table class="ui-datepicker-calendar"><thead>' +
+ '<tr>';
+ var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
+ for (var dow = 0; dow < 7; dow++) { // days of the week
+ var day = (dow + firstDay) % 7;
+ thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
+ '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
+ }
+ calender += thead + '</tr></thead><tbody>';
+ var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
+ if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
+ inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
+ var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
+ var curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
+ var numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
+ this.maxRows = numRows;
+ var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
+ for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
+ calender += '<tr>';
+ var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
+ this._get(inst, 'calculateWeek')(printDate) + '</td>');
+ for (var dow = 0; dow < 7; dow++) { // create date picker days
+ var daySettings = (beforeShowDay ?
+ beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
+ var otherMonth = (printDate.getMonth() != drawMonth);
+ var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
+ (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
+ tbody += '<td class="' +
+ ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
+ (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
+ ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
+ (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
+ // or defaultDate is current printedDate and defaultDate is selectedDate
+ ' ' + this._dayOverClass : '') + // highlight selected day
+ (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') + // highlight unselectable days
+ (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
+ (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
+ (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
+ ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
+ (unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
+ inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions
+ (otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
+ (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
+ (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
+ (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
+ (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
+ '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
+ printDate.setDate(printDate.getDate() + 1);
+ printDate = this._daylightSavingAdjust(printDate);
+ }
+ calender += tbody + '</tr>';
+ }
+ drawMonth++;
+ if (drawMonth > 11) {
+ drawMonth = 0;
+ drawYear++;
+ }
+ calender += '</tbody></table>' + (isMultiMonth ? '</div>' +
+ ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
+ group += calender;
+ }
+ html += group;
+ }
+ html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+ '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
+ inst._keyEvent = false;
+ return html;
+ },
+
+ /* Generate the month and year header. */
+ _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
+ secondary, monthNames, monthNamesShort) {
+ var changeMonth = this._get(inst, 'changeMonth');
+ var changeYear = this._get(inst, 'changeYear');
+ var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
+ var html = '<div class="ui-datepicker-title">';
+ var monthHtml = '';
+ // month selection
+ if (secondary || !changeMonth)
+ monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
+ else {
+ var inMinYear = (minDate && minDate.getFullYear() == drawYear);
+ var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
+ monthHtml += '<select class="ui-datepicker-month" ' +
+ 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
+ '>';
+ for (var month = 0; month < 12; month++) {
+ if ((!inMinYear || month >= minDate.getMonth()) &&
+ (!inMaxYear || month <= maxDate.getMonth()))
+ monthHtml += '<option value="' + month + '"' +
+ (month == drawMonth ? ' selected="selected"' : '') +
+ '>' + monthNamesShort[month] + '</option>';
+ }
+ monthHtml += '</select>';
+ }
+ if (!showMonthAfterYear)
+ html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
+ // year selection
+ if ( !inst.yearshtml ) {
+ inst.yearshtml = '';
+ if (secondary || !changeYear)
+ html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
+ else {
+ // determine range of years to display
+ var years = this._get(inst, 'yearRange').split(':');
+ var thisYear = new Date().getFullYear();
+ var determineYear = function(value) {
+ var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
+ (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
+ parseInt(value, 10)));
+ return (isNaN(year) ? thisYear : year);
+ };
+ var year = determineYear(years[0]);
+ var endYear = Math.max(year, determineYear(years[1] || ''));
+ year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
+ endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
+ inst.yearshtml += '<select class="ui-datepicker-year" ' +
+ 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
+ '>';
+ for (; year <= endYear; year++) {
+ inst.yearshtml += '<option value="' + year + '"' +
+ (year == drawYear ? ' selected="selected"' : '') +
+ '>' + year + '</option>';
+ }
+ inst.yearshtml += '</select>';
+
+ html += inst.yearshtml;
+ inst.yearshtml = null;
+ }
+ }
+ html += this._get(inst, 'yearSuffix');
+ if (showMonthAfterYear)
+ html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
+ html += '</div>'; // Close datepicker_header
+ return html;
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustInstDate: function(inst, offset, period) {
+ var year = inst.drawYear + (period == 'Y' ? offset : 0);
+ var month = inst.drawMonth + (period == 'M' ? offset : 0);
+ var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
+ (period == 'D' ? offset : 0);
+ var date = this._restrictMinMax(inst,
+ this._daylightSavingAdjust(new Date(year, month, day)));
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ if (period == 'M' || period == 'Y')
+ this._notifyChange(inst);
+ },
+
+ /* Ensure a date is within any min/max bounds. */
+ _restrictMinMax: function(inst, date) {
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ var newDate = (minDate && date < minDate ? minDate : date);
+ newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
+ return newDate;
+ },
+
+ /* Notify change of month/year. */
+ _notifyChange: function(inst) {
+ var onChange = this._get(inst, 'onChangeMonthYear');
+ if (onChange)
+ onChange.apply((inst.input ? inst.input[0] : null),
+ [inst.selectedYear, inst.selectedMonth + 1, inst]);
+ },
+
+ /* Determine the number of months to show. */
+ _getNumberOfMonths: function(inst) {
+ var numMonths = this._get(inst, 'numberOfMonths');
+ return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
+ },
+
+ /* Determine the current maximum date - ensure no time components are set. */
+ _getMinMaxDate: function(inst, minMax) {
+ return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
+ },
+
+ /* Find the number of days in a given month. */
+ _getDaysInMonth: function(year, month) {
+ return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
+ },
+
+ /* Find the day of the week of the first of a month. */
+ _getFirstDayOfMonth: function(year, month) {
+ return new Date(year, month, 1).getDay();
+ },
+
+ /* Determines if we should allow a "next/prev" month display change. */
+ _canAdjustMonth: function(inst, offset, curYear, curMonth) {
+ var numMonths = this._getNumberOfMonths(inst);
+ var date = this._daylightSavingAdjust(new Date(curYear,
+ curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
+ if (offset < 0)
+ date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
+ return this._isInRange(inst, date);
+ },
+
+ /* Is the given date in the accepted range? */
+ _isInRange: function(inst, date) {
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ return ((!minDate || date.getTime() >= minDate.getTime()) &&
+ (!maxDate || date.getTime() <= maxDate.getTime()));
+ },
+
+ /* Provide the configuration settings for formatting/parsing. */
+ _getFormatConfig: function(inst) {
+ var shortYearCutoff = this._get(inst, 'shortYearCutoff');
+ shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+ return {shortYearCutoff: shortYearCutoff,
+ dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
+ monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
+ },
+
+ /* Format the given date for display. */
+ _formatDate: function(inst, day, month, year) {
+ if (!day) {
+ inst.currentDay = inst.selectedDay;
+ inst.currentMonth = inst.selectedMonth;
+ inst.currentYear = inst.selectedYear;
+ }
+ var date = (day ? (typeof day == 'object' ? day :
+ this._daylightSavingAdjust(new Date(year, month, day))) :
+ this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+ return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
+ }
+});
+
+/*
+ * Bind hover events for datepicker elements.
+ * Done via delegate so the binding only occurs once in the lifetime of the parent div.
+ * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
+ */
+function bindHover(dpDiv) {
+ var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
+ return dpDiv.bind('mouseout', function(event) {
+ var elem = $( event.target ).closest( selector );
+ if ( !elem.length ) {
+ return;
+ }
+ elem.removeClass( "ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover" );
+ })
+ .bind('mouseover', function(event) {
+ var elem = $( event.target ).closest( selector );
+ if ($.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0]) ||
+ !elem.length ) {
+ return;
+ }
+ elem.parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
+ elem.addClass('ui-state-hover');
+ if (elem.hasClass('ui-datepicker-prev')) elem.addClass('ui-datepicker-prev-hover');
+ if (elem.hasClass('ui-datepicker-next')) elem.addClass('ui-datepicker-next-hover');
+ });
+}
+
+/* jQuery extend now ignores nulls! */
+function extendRemove(target, props) {
+ $.extend(target, props);
+ for (var name in props)
+ if (props[name] == null || props[name] == undefined)
+ target[name] = props[name];
+ return target;
+};
+
+/* Determine whether an object is an array. */
+function isArray(a) {
+ return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
+ (a.constructor && a.constructor.toString().match(/\Array\(\)/))));
+};
+
+/* Invoke the datepicker functionality.
+ @param options string - a command, optionally followed by additional parameters or
+ Object - settings for attaching new datepicker functionality
+ @return jQuery object */
+$.fn.datepicker = function(options){
+
+ /* Verify an empty collection wasn't passed - Fixes #6976 */
+ if ( !this.length ) {
+ return this;
+ }
+
+ /* Initialise the date picker. */
+ if (!$.datepicker.initialized) {
+ $(document).mousedown($.datepicker._checkExternalClick).
+ find('body').append($.datepicker.dpDiv);
+ $.datepicker.initialized = true;
+ }
+
+ var otherArgs = Array.prototype.slice.call(arguments, 1);
+ if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
+ return $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
+ return $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ return this.each(function() {
+ typeof options == 'string' ?
+ $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this].concat(otherArgs)) :
+ $.datepicker._attachDatepicker(this, options);
+ });
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.8.16";
+
+// Workaround for #4055
+// Add another global to avoid noConflict issues with inline event handlers
+window['DP_jQuery_' + dpuuid] = $;
+
+})(jQuery);
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.button.js
+ * jquery.ui.draggable.js
+ * jquery.ui.mouse.js
+ * jquery.ui.position.js
+ * jquery.ui.resizable.js
+ */
+(function( $, undefined ) {
+
+var uiDialogClasses =
+ 'ui-dialog ' +
+ 'ui-widget ' +
+ 'ui-widget-content ' +
+ 'ui-corner-all ',
+ sizeRelatedOptions = {
+ buttons: true,
+ height: true,
+ maxHeight: true,
+ maxWidth: true,
+ minHeight: true,
+ minWidth: true,
+ width: true
+ },
+ resizableRelatedOptions = {
+ maxHeight: true,
+ maxWidth: true,
+ minHeight: true,
+ minWidth: true
+ },
+ // support for jQuery 1.3.2 - handle common attrFn methods for dialog
+ attrFn = $.attrFn || {
+ val: true,
+ css: true,
+ html: true,
+ text: true,
+ data: true,
+ width: true,
+ height: true,
+ offset: true,
+ click: true
+ };
+
+$.widget("ui.dialog", {
+ options: {
+ autoOpen: true,
+ buttons: {},
+ closeOnEscape: true,
+ closeText: 'close',
+ dialogClass: '',
+ draggable: true,
+ hide: null,
+ height: 'auto',
+ maxHeight: false,
+ maxWidth: false,
+ minHeight: 150,
+ minWidth: 150,
+ modal: false,
+ position: {
+ my: 'center',
+ at: 'center',
+ collision: 'fit',
+ // ensure that the titlebar is never outside the document
+ using: function(pos) {
+ var topOffset = $(this).css(pos).offset().top;
+ if (topOffset < 0) {
+ $(this).css('top', pos.top - topOffset);
+ }
+ }
+ },
+ resizable: true,
+ show: null,
+ stack: true,
+ title: '',
+ width: 300,
+ zIndex: 1000
+ },
+
+ _create: function() {
+ this.originalTitle = this.element.attr('title');
+ // #5742 - .attr() might return a DOMElement
+ if ( typeof this.originalTitle !== "string" ) {
+ this.originalTitle = "";
+ }
+
+ this.options.title = this.options.title || this.originalTitle;
+ var self = this,
+ options = self.options,
+
+ title = options.title || '&#160;',
+ titleId = $.ui.dialog.getTitleId(self.element),
+
+ uiDialog = (self.uiDialog = $('<div></div>'))
+ .appendTo(document.body)
+ .hide()
+ .addClass(uiDialogClasses + options.dialogClass)
+ .css({
+ zIndex: options.zIndex
+ })
+ // setting tabIndex makes the div focusable
+ // setting outline to 0 prevents a border on focus in Mozilla
+ .attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
+ if (options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+ event.keyCode === $.ui.keyCode.ESCAPE) {
+
+ self.close(event);
+ event.preventDefault();
+ }
+ })
+ .attr({
+ role: 'dialog',
+ 'aria-labelledby': titleId
+ })
+ .mousedown(function(event) {
+ self.moveToTop(false, event);
+ }),
+
+ uiDialogContent = self.element
+ .show()
+ .removeAttr('title')
+ .addClass(
+ 'ui-dialog-content ' +
+ 'ui-widget-content')
+ .appendTo(uiDialog),
+
+ uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
+ .addClass(
+ 'ui-dialog-titlebar ' +
+ 'ui-widget-header ' +
+ 'ui-corner-all ' +
+ 'ui-helper-clearfix'
+ )
+ .prependTo(uiDialog),
+
+ uiDialogTitlebarClose = $('<a href="#"></a>')
+ .addClass(
+ 'ui-dialog-titlebar-close ' +
+ 'ui-corner-all'
+ )
+ .attr('role', 'button')
+ .hover(
+ function() {
+ uiDialogTitlebarClose.addClass('ui-state-hover');
+ },
+ function() {
+ uiDialogTitlebarClose.removeClass('ui-state-hover');
+ }
+ )
+ .focus(function() {
+ uiDialogTitlebarClose.addClass('ui-state-focus');
+ })
+ .blur(function() {
+ uiDialogTitlebarClose.removeClass('ui-state-focus');
+ })
+ .click(function(event) {
+ self.close(event);
+ return false;
+ })
+ .appendTo(uiDialogTitlebar),
+
+ uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
+ .addClass(
+ 'ui-icon ' +
+ 'ui-icon-closethick'
+ )
+ .text(options.closeText)
+ .appendTo(uiDialogTitlebarClose),
+
+ uiDialogTitle = $('<span></span>')
+ .addClass('ui-dialog-title')
+ .attr('id', titleId)
+ .html(title)
+ .prependTo(uiDialogTitlebar);
+
+ //handling of deprecated beforeclose (vs beforeClose) option
+ //Ticket #4669 http://dev.jqueryui.com/ticket/4669
+ //TODO: remove in 1.9pre
+ if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
+ options.beforeClose = options.beforeclose;
+ }
+
+ uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
+
+ if (options.draggable && $.fn.draggable) {
+ self._makeDraggable();
+ }
+ if (options.resizable && $.fn.resizable) {
+ self._makeResizable();
+ }
+
+ self._createButtons(options.buttons);
+ self._isOpen = false;
+
+ if ($.fn.bgiframe) {
+ uiDialog.bgiframe();
+ }
+ },
+
+ _init: function() {
+ if ( this.options.autoOpen ) {
+ this.open();
+ }
+ },
+
+ destroy: function() {
+ var self = this;
+
+ if (self.overlay) {
+ self.overlay.destroy();
+ }
+ self.uiDialog.hide();
+ self.element
+ .unbind('.dialog')
+ .removeData('dialog')
+ .removeClass('ui-dialog-content ui-widget-content')
+ .hide().appendTo('body');
+ self.uiDialog.remove();
+
+ if (self.originalTitle) {
+ self.element.attr('title', self.originalTitle);
+ }
+
+ return self;
+ },
+
+ widget: function() {
+ return this.uiDialog;
+ },
+
+ close: function(event) {
+ var self = this,
+ maxZ, thisZ;
+
+ if (false === self._trigger('beforeClose', event)) {
+ return;
+ }
+
+ if (self.overlay) {
+ self.overlay.destroy();
+ }
+ self.uiDialog.unbind('keypress.ui-dialog');
+
+ self._isOpen = false;
+
+ if (self.options.hide) {
+ self.uiDialog.hide(self.options.hide, function() {
+ self._trigger('close', event);
+ });
+ } else {
+ self.uiDialog.hide();
+ self._trigger('close', event);
+ }
+
+ $.ui.dialog.overlay.resize();
+
+ // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+ if (self.options.modal) {
+ maxZ = 0;
+ $('.ui-dialog').each(function() {
+ if (this !== self.uiDialog[0]) {
+ thisZ = $(this).css('z-index');
+ if(!isNaN(thisZ)) {
+ maxZ = Math.max(maxZ, thisZ);
+ }
+ }
+ });
+ $.ui.dialog.maxZ = maxZ;
+ }
+
+ return self;
+ },
+
+ isOpen: function() {
+ return this._isOpen;
+ },
+
+ // the force parameter allows us to move modal dialogs to their correct
+ // position on open
+ moveToTop: function(force, event) {
+ var self = this,
+ options = self.options,
+ saveScroll;
+
+ if ((options.modal && !force) ||
+ (!options.stack && !options.modal)) {
+ return self._trigger('focus', event);
+ }
+
+ if (options.zIndex > $.ui.dialog.maxZ) {
+ $.ui.dialog.maxZ = options.zIndex;
+ }
+ if (self.overlay) {
+ $.ui.dialog.maxZ += 1;
+ self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
+ }
+
+ //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
+ // http://ui.jquery.com/bugs/ticket/3193
+ saveScroll = { scrollTop: self.element.scrollTop(), scrollLeft: self.element.scrollLeft() };
+ $.ui.dialog.maxZ += 1;
+ self.uiDialog.css('z-index', $.ui.dialog.maxZ);
+ self.element.attr(saveScroll);
+ self._trigger('focus', event);
+
+ return self;
+ },
+
+ open: function() {
+ if (this._isOpen) { return; }
+
+ var self = this,
+ options = self.options,
+ uiDialog = self.uiDialog;
+
+ self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
+ self._size();
+ self._position(options.position);
+ uiDialog.show(options.show);
+ self.moveToTop(true);
+
+ // prevent tabbing out of modal dialogs
+ if (options.modal) {
+ uiDialog.bind('keypress.ui-dialog', function(event) {
+ if (event.keyCode !== $.ui.keyCode.TAB) {
+ return;
+ }
+
+ var tabbables = $(':tabbable', this),
+ first = tabbables.filter(':first'),
+ last = tabbables.filter(':last');
+
+ if (event.target === last[0] && !event.shiftKey) {
+ first.focus(1);
+ return false;
+ } else if (event.target === first[0] && event.shiftKey) {
+ last.focus(1);
+ return false;
+ }
+ });
+ }
+
+ // set focus to the first tabbable element in the content area or the first button
+ // if there are no tabbable elements, set focus on the dialog itself
+ $(self.element.find(':tabbable').get().concat(
+ uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
+ uiDialog.get()))).eq(0).focus();
+
+ self._isOpen = true;
+ self._trigger('open');
+
+ return self;
+ },
+
+ _createButtons: function(buttons) {
+ var self = this,
+ hasButtons = false,
+ uiDialogButtonPane = $('<div></div>')
+ .addClass(
+ 'ui-dialog-buttonpane ' +
+ 'ui-widget-content ' +
+ 'ui-helper-clearfix'
+ ),
+ uiButtonSet = $( "<div></div>" )
+ .addClass( "ui-dialog-buttonset" )
+ .appendTo( uiDialogButtonPane );
+
+ // if we already have a button pane, remove it
+ self.uiDialog.find('.ui-dialog-buttonpane').remove();
+
+ if (typeof buttons === 'object' && buttons !== null) {
+ $.each(buttons, function() {
+ return !(hasButtons = true);
+ });
+ }
+ if (hasButtons) {
+ $.each(buttons, function(name, props) {
+ props = $.isFunction( props ) ?
+ { click: props, text: name } :
+ props;
+ var button = $('<button type="button"></button>')
+ .click(function() {
+ props.click.apply(self.element[0], arguments);
+ })
+ .appendTo(uiButtonSet);
+ // can't use .attr( props, true ) with jQuery 1.3.2.
+ $.each( props, function( key, value ) {
+ if ( key === "click" ) {
+ return;
+ }
+ if ( key in attrFn ) {
+ button[ key ]( value );
+ } else {
+ button.attr( key, value );
+ }
+ });
+ if ($.fn.button) {
+ button.button();
+ }
+ });
+ uiDialogButtonPane.appendTo(self.uiDialog);
+ }
+ },
+
+ _makeDraggable: function() {
+ var self = this,
+ options = self.options,
+ doc = $(document),
+ heightBeforeDrag;
+
+ function filteredUi(ui) {
+ return {
+ position: ui.position,
+ offset: ui.offset
+ };
+ }
+
+ self.uiDialog.draggable({
+ cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
+ handle: '.ui-dialog-titlebar',
+ containment: 'document',
+ start: function(event, ui) {
+ heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
+ $(this).height($(this).height()).addClass("ui-dialog-dragging");
+ self._trigger('dragStart', event, filteredUi(ui));
+ },
+ drag: function(event, ui) {
+ self._trigger('drag', event, filteredUi(ui));
+ },
+ stop: function(event, ui) {
+ options.position = [ui.position.left - doc.scrollLeft(),
+ ui.position.top - doc.scrollTop()];
+ $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
+ self._trigger('dragStop', event, filteredUi(ui));
+ $.ui.dialog.overlay.resize();
+ }
+ });
+ },
+
+ _makeResizable: function(handles) {
+ handles = (handles === undefined ? this.options.resizable : handles);
+ var self = this,
+ options = self.options,
+ // .ui-resizable has position: relative defined in the stylesheet
+ // but dialogs have to use absolute or fixed positioning
+ position = self.uiDialog.css('position'),
+ resizeHandles = (typeof handles === 'string' ?
+ handles :
+ 'n,e,s,w,se,sw,ne,nw'
+ );
+
+ function filteredUi(ui) {
+ return {
+ originalPosition: ui.originalPosition,
+ originalSize: ui.originalSize,
+ position: ui.position,
+ size: ui.size
+ };
+ }
+
+ self.uiDialog.resizable({
+ cancel: '.ui-dialog-content',
+ containment: 'document',
+ alsoResize: self.element,
+ maxWidth: options.maxWidth,
+ maxHeight: options.maxHeight,
+ minWidth: options.minWidth,
+ minHeight: self._minHeight(),
+ handles: resizeHandles,
+ start: function(event, ui) {
+ $(this).addClass("ui-dialog-resizing");
+ self._trigger('resizeStart', event, filteredUi(ui));
+ },
+ resize: function(event, ui) {
+ self._trigger('resize', event, filteredUi(ui));
+ },
+ stop: function(event, ui) {
+ $(this).removeClass("ui-dialog-resizing");
+ options.height = $(this).height();
+ options.width = $(this).width();
+ self._trigger('resizeStop', event, filteredUi(ui));
+ $.ui.dialog.overlay.resize();
+ }
+ })
+ .css('position', position)
+ .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+ },
+
+ _minHeight: function() {
+ var options = this.options;
+
+ if (options.height === 'auto') {
+ return options.minHeight;
+ } else {
+ return Math.min(options.minHeight, options.height);
+ }
+ },
+
+ _position: function(position) {
+ var myAt = [],
+ offset = [0, 0],
+ isVisible;
+
+ if (position) {
+ // deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
+ // if (typeof position == 'string' || $.isArray(position)) {
+ // myAt = $.isArray(position) ? position : position.split(' ');
+
+ if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
+ myAt = position.split ? position.split(' ') : [position[0], position[1]];
+ if (myAt.length === 1) {
+ myAt[1] = myAt[0];
+ }
+
+ $.each(['left', 'top'], function(i, offsetPosition) {
+ if (+myAt[i] === myAt[i]) {
+ offset[i] = myAt[i];
+ myAt[i] = offsetPosition;
+ }
+ });
+
+ position = {
+ my: myAt.join(" "),
+ at: myAt.join(" "),
+ offset: offset.join(" ")
+ };
+ }
+
+ position = $.extend({}, $.ui.dialog.prototype.options.position, position);
+ } else {
+ position = $.ui.dialog.prototype.options.position;
+ }
+
+ // need to show the dialog to get the actual offset in the position plugin
+ isVisible = this.uiDialog.is(':visible');
+ if (!isVisible) {
+ this.uiDialog.show();
+ }
+ this.uiDialog
+ // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+ .css({ top: 0, left: 0 })
+ .position($.extend({ of: window }, position));
+ if (!isVisible) {
+ this.uiDialog.hide();
+ }
+ },
+
+ _setOptions: function( options ) {
+ var self = this,
+ resizableOptions = {},
+ resize = false;
+
+ $.each( options, function( key, value ) {
+ self._setOption( key, value );
+
+ if ( key in sizeRelatedOptions ) {
+ resize = true;
+ }
+ if ( key in resizableRelatedOptions ) {
+ resizableOptions[ key ] = value;
+ }
+ });
+
+ if ( resize ) {
+ this._size();
+ }
+ if ( this.uiDialog.is( ":data(resizable)" ) ) {
+ this.uiDialog.resizable( "option", resizableOptions );
+ }
+ },
+
+ _setOption: function(key, value){
+ var self = this,
+ uiDialog = self.uiDialog;
+
+ switch (key) {
+ //handling of deprecated beforeclose (vs beforeClose) option
+ //Ticket #4669 http://dev.jqueryui.com/ticket/4669
+ //TODO: remove in 1.9pre
+ case "beforeclose":
+ key = "beforeClose";
+ break;
+ case "buttons":
+ self._createButtons(value);
+ break;
+ case "closeText":
+ // ensure that we always pass a string
+ self.uiDialogTitlebarCloseText.text("" + value);
+ break;
+ case "dialogClass":
+ uiDialog
+ .removeClass(self.options.dialogClass)
+ .addClass(uiDialogClasses + value);
+ break;
+ case "disabled":
+ if (value) {
+ uiDialog.addClass('ui-dialog-disabled');
+ } else {
+ uiDialog.removeClass('ui-dialog-disabled');
+ }
+ break;
+ case "draggable":
+ var isDraggable = uiDialog.is( ":data(draggable)" );
+ if ( isDraggable && !value ) {
+ uiDialog.draggable( "destroy" );
+ }
+
+ if ( !isDraggable && value ) {
+ self._makeDraggable();
+ }
+ break;
+ case "position":
+ self._position(value);
+ break;
+ case "resizable":
+ // currently resizable, becoming non-resizable
+ var isResizable = uiDialog.is( ":data(resizable)" );
+ if (isResizable && !value) {
+ uiDialog.resizable('destroy');
+ }
+
+ // currently resizable, changing handles
+ if (isResizable && typeof value === 'string') {
+ uiDialog.resizable('option', 'handles', value);
+ }
+
+ // currently non-resizable, becoming resizable
+ if (!isResizable && value !== false) {
+ self._makeResizable(value);
+ }
+ break;
+ case "title":
+ // convert whatever was passed in o a string, for html() to not throw up
+ $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
+ break;
+ }
+
+ $.Widget.prototype._setOption.apply(self, arguments);
+ },
+
+ _size: function() {
+ /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+ * divs will both have width and height set, so we need to reset them
+ */
+ var options = this.options,
+ nonContentHeight,
+ minContentHeight,
+ isVisible = this.uiDialog.is( ":visible" );
+
+ // reset content sizing
+ this.element.show().css({
+ width: 'auto',
+ minHeight: 0,
+ height: 0
+ });
+
+ if (options.minWidth > options.width) {
+ options.width = options.minWidth;
+ }
+
+ // reset wrapper sizing
+ // determine the height of all the non-content elements
+ nonContentHeight = this.uiDialog.css({
+ height: 'auto',
+ width: options.width
+ })
+ .height();
+ minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
+
+ if ( options.height === "auto" ) {
+ // only needed for IE6 support
+ if ( $.support.minHeight ) {
+ this.element.css({
+ minHeight: minContentHeight,
+ height: "auto"
+ });
+ } else {
+ this.uiDialog.show();
+ var autoHeight = this.element.css( "height", "auto" ).height();
+ if ( !isVisible ) {
+ this.uiDialog.hide();
+ }
+ this.element.height( Math.max( autoHeight, minContentHeight ) );
+ }
+ } else {
+ this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
+ }
+
+ if (this.uiDialog.is(':data(resizable)')) {
+ this.uiDialog.resizable('option', 'minHeight', this._minHeight());
+ }
+ }
+});
+
+$.extend($.ui.dialog, {
+ version: "1.8.16",
+
+ uuid: 0,
+ maxZ: 0,
+
+ getTitleId: function($el) {
+ var id = $el.attr('id');
+ if (!id) {
+ this.uuid += 1;
+ id = this.uuid;
+ }
+ return 'ui-dialog-title-' + id;
+ },
+
+ overlay: function(dialog) {
+ this.$el = $.ui.dialog.overlay.create(dialog);
+ }
+});
+
+$.extend($.ui.dialog.overlay, {
+ instances: [],
+ // reuse old instances due to IE memory leak with alpha transparency (see #5185)
+ oldInstances: [],
+ maxZ: 0,
+ events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
+ function(event) { return event + '.dialog-overlay'; }).join(' '),
+ create: function(dialog) {
+ if (this.instances.length === 0) {
+ // prevent use of anchors and inputs
+ // we use a setTimeout in case the overlay is created from an
+ // event that we're going to be cancelling (see #2804)
+ setTimeout(function() {
+ // handle $(el).dialog().dialog('close') (see #4065)
+ if ($.ui.dialog.overlay.instances.length) {
+ $(document).bind($.ui.dialog.overlay.events, function(event) {
+ // stop events if the z-index of the target is < the z-index of the overlay
+ // we cannot return true when we don't want to cancel the event (#3523)
+ if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
+ return false;
+ }
+ });
+ }
+ }, 1);
+
+ // allow closing by pressing the escape key
+ $(document).bind('keydown.dialog-overlay', function(event) {
+ if (dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+ event.keyCode === $.ui.keyCode.ESCAPE) {
+
+ dialog.close(event);
+ event.preventDefault();
+ }
+ });
+
+ // handle window resize
+ $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
+ }
+
+ var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
+ .appendTo(document.body)
+ .css({
+ width: this.width(),
+ height: this.height()
+ });
+
+ if ($.fn.bgiframe) {
+ $el.bgiframe();
+ }
+
+ this.instances.push($el);
+ return $el;
+ },
+
+ destroy: function($el) {
+ var indexOf = $.inArray($el, this.instances);
+ if (indexOf != -1){
+ this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
+ }
+
+ if (this.instances.length === 0) {
+ $([document, window]).unbind('.dialog-overlay');
+ }
+
+ $el.remove();
+
+ // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+ var maxZ = 0;
+ $.each(this.instances, function() {
+ maxZ = Math.max(maxZ, this.css('z-index'));
+ });
+ this.maxZ = maxZ;
+ },
+
+ height: function() {
+ var scrollHeight,
+ offsetHeight;
+ // handle IE 6
+ if ($.browser.msie && $.browser.version < 7) {
+ scrollHeight = Math.max(
+ document.documentElement.scrollHeight,
+ document.body.scrollHeight
+ );
+ offsetHeight = Math.max(
+ document.documentElement.offsetHeight,
+ document.body.offsetHeight
+ );
+
+ if (scrollHeight < offsetHeight) {
+ return $(window).height() + 'px';
+ } else {
+ return scrollHeight + 'px';
+ }
+ // handle "good" browsers
+ } else {
+ return $(document).height() + 'px';
+ }
+ },
+
+ width: function() {
+ var scrollWidth,
+ offsetWidth;
+ // handle IE
+ if ( $.browser.msie ) {
+ scrollWidth = Math.max(
+ document.documentElement.scrollWidth,
+ document.body.scrollWidth
+ );
+ offsetWidth = Math.max(
+ document.documentElement.offsetWidth,
+ document.body.offsetWidth
+ );
+
+ if (scrollWidth < offsetWidth) {
+ return $(window).width() + 'px';
+ } else {
+ return scrollWidth + 'px';
+ }
+ // handle "good" browsers
+ } else {
+ return $(document).width() + 'px';
+ }
+ },
+
+ resize: function() {
+ /* If the dialog is draggable and the user drags it past the
+ * right edge of the window, the document becomes wider so we
+ * need to stretch the overlay. If the user then drags the
+ * dialog back to the left, the document will become narrower,
+ * so we need to shrink the overlay to the appropriate size.
+ * This is handled by shrinking the overlay before setting it
+ * to the full document size.
+ */
+ var $overlays = $([]);
+ $.each($.ui.dialog.overlay.instances, function() {
+ $overlays = $overlays.add(this);
+ });
+
+ $overlays.css({
+ width: 0,
+ height: 0
+ }).css({
+ width: $.ui.dialog.overlay.width(),
+ height: $.ui.dialog.overlay.height()
+ });
+ }
+});
+
+$.extend($.ui.dialog.overlay.prototype, {
+ destroy: function() {
+ $.ui.dialog.overlay.destroy(this.$el);
+ }
+});
+
+}(jQuery));
+/*
+ * jQuery UI Position 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function( $, undefined ) {
+
+$.ui = $.ui || {};
+
+var horizontalPositions = /left|center|right/,
+ verticalPositions = /top|center|bottom/,
+ center = "center",
+ _position = $.fn.position,
+ _offset = $.fn.offset;
+
+$.fn.position = function( options ) {
+ if ( !options || !options.of ) {
+ return _position.apply( this, arguments );
+ }
+
+ // make a copy, we don't want to modify arguments
+ options = $.extend( {}, options );
+
+ var target = $( options.of ),
+ targetElem = target[0],
+ collision = ( options.collision || "flip" ).split( " " ),
+ offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
+ targetWidth,
+ targetHeight,
+ basePosition;
+
+ if ( targetElem.nodeType === 9 ) {
+ targetWidth = target.width();
+ targetHeight = target.height();
+ basePosition = { top: 0, left: 0 };
+ // TODO: use $.isWindow() in 1.9
+ } else if ( targetElem.setTimeout ) {
+ targetWidth = target.width();
+ targetHeight = target.height();
+ basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
+ } else if ( targetElem.preventDefault ) {
+ // force left top to allow flipping
+ options.at = "left top";
+ targetWidth = targetHeight = 0;
+ basePosition = { top: options.of.pageY, left: options.of.pageX };
+ } else {
+ targetWidth = target.outerWidth();
+ targetHeight = target.outerHeight();
+ basePosition = target.offset();
+ }
+
+ // force my and at to have valid horizontal and veritcal positions
+ // if a value is missing or invalid, it will be converted to center
+ $.each( [ "my", "at" ], function() {
+ var pos = ( options[this] || "" ).split( " " );
+ if ( pos.length === 1) {
+ pos = horizontalPositions.test( pos[0] ) ?
+ pos.concat( [center] ) :
+ verticalPositions.test( pos[0] ) ?
+ [ center ].concat( pos ) :
+ [ center, center ];
+ }
+ pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
+ pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
+ options[ this ] = pos;
+ });
+
+ // normalize collision option
+ if ( collision.length === 1 ) {
+ collision[ 1 ] = collision[ 0 ];
+ }
+
+ // normalize offset option
+ offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
+ if ( offset.length === 1 ) {
+ offset[ 1 ] = offset[ 0 ];
+ }
+ offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
+
+ if ( options.at[0] === "right" ) {
+ basePosition.left += targetWidth;
+ } else if ( options.at[0] === center ) {
+ basePosition.left += targetWidth / 2;
+ }
+
+ if ( options.at[1] === "bottom" ) {
+ basePosition.top += targetHeight;
+ } else if ( options.at[1] === center ) {
+ basePosition.top += targetHeight / 2;
+ }
+
+ basePosition.left += offset[ 0 ];
+ basePosition.top += offset[ 1 ];
+
+ return this.each(function() {
+ var elem = $( this ),
+ elemWidth = elem.outerWidth(),
+ elemHeight = elem.outerHeight(),
+ marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
+ marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
+ collisionWidth = elemWidth + marginLeft +
+ ( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
+ collisionHeight = elemHeight + marginTop +
+ ( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
+ position = $.extend( {}, basePosition ),
+ collisionPosition;
+
+ if ( options.my[0] === "right" ) {
+ position.left -= elemWidth;
+ } else if ( options.my[0] === center ) {
+ position.left -= elemWidth / 2;
+ }
+
+ if ( options.my[1] === "bottom" ) {
+ position.top -= elemHeight;
+ } else if ( options.my[1] === center ) {
+ position.top -= elemHeight / 2;
+ }
+
+ // prevent fractions (see #5280)
+ position.left = Math.round( position.left );
+ position.top = Math.round( position.top );
+
+ collisionPosition = {
+ left: position.left - marginLeft,
+ top: position.top - marginTop
+ };
+
+ $.each( [ "left", "top" ], function( i, dir ) {
+ if ( $.ui.position[ collision[i] ] ) {
+ $.ui.position[ collision[i] ][ dir ]( position, {
+ targetWidth: targetWidth,
+ targetHeight: targetHeight,
+ elemWidth: elemWidth,
+ elemHeight: elemHeight,
+ collisionPosition: collisionPosition,
+ collisionWidth: collisionWidth,
+ collisionHeight: collisionHeight,
+ offset: offset,
+ my: options.my,
+ at: options.at
+ });
+ }
+ });
+
+ if ( $.fn.bgiframe ) {
+ elem.bgiframe();
+ }
+ elem.offset( $.extend( position, { using: options.using } ) );
+ });
+};
+
+$.ui.position = {
+ fit: {
+ left: function( position, data ) {
+ var win = $( window ),
+ over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
+ position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
+ },
+ top: function( position, data ) {
+ var win = $( window ),
+ over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
+ position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
+ }
+ },
+
+ flip: {
+ left: function( position, data ) {
+ if ( data.at[0] === center ) {
+ return;
+ }
+ var win = $( window ),
+ over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
+ myOffset = data.my[ 0 ] === "left" ?
+ -data.elemWidth :
+ data.my[ 0 ] === "right" ?
+ data.elemWidth :
+ 0,
+ atOffset = data.at[ 0 ] === "left" ?
+ data.targetWidth :
+ -data.targetWidth,
+ offset = -2 * data.offset[ 0 ];
+ position.left += data.collisionPosition.left < 0 ?
+ myOffset + atOffset + offset :
+ over > 0 ?
+ myOffset + atOffset + offset :
+ 0;
+ },
+ top: function( position, data ) {
+ if ( data.at[1] === center ) {
+ return;
+ }
+ var win = $( window ),
+ over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
+ myOffset = data.my[ 1 ] === "top" ?
+ -data.elemHeight :
+ data.my[ 1 ] === "bottom" ?
+ data.elemHeight :
+ 0,
+ atOffset = data.at[ 1 ] === "top" ?
+ data.targetHeight :
+ -data.targetHeight,
+ offset = -2 * data.offset[ 1 ];
+ position.top += data.collisionPosition.top < 0 ?
+ myOffset + atOffset + offset :
+ over > 0 ?
+ myOffset + atOffset + offset :
+ 0;
+ }
+ }
+};
+
+// offset setter from jQuery 1.4
+if ( !$.offset.setOffset ) {
+ $.offset.setOffset = function( elem, options ) {
+ // set position first, in-case top/left are set even on static elem
+ if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
+ elem.style.position = "relative";
+ }
+ var curElem = $( elem ),
+ curOffset = curElem.offset(),
+ curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0,
+ curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0,
+ props = {
+ top: (options.top - curOffset.top) + curTop,
+ left: (options.left - curOffset.left) + curLeft
+ };
+
+ if ( 'using' in options ) {
+ options.using.call( elem, props );
+ } else {
+ curElem.css( props );
+ }
+ };
+
+ $.fn.offset = function( options ) {
+ var elem = this[ 0 ];
+ if ( !elem || !elem.ownerDocument ) { return null; }
+ if ( options ) {
+ return this.each(function() {
+ $.offset.setOffset( this, options );
+ });
+ }
+ return _offset.call( this );
+ };
+}
+
+}( jQuery ));
+/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.progressbar", {
+ options: {
+ value: 0,
+ max: 100
+ },
+
+ min: 0,
+
+ _create: function() {
+ this.element
+ .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .attr({
+ role: "progressbar",
+ "aria-valuemin": this.min,
+ "aria-valuemax": this.options.max,
+ "aria-valuenow": this._value()
+ });
+
+ this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
+ .appendTo( this.element );
+
+ this.oldValue = this._value();
+ this._refreshValue();
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-valuemin" )
+ .removeAttr( "aria-valuemax" )
+ .removeAttr( "aria-valuenow" );
+
+ this.valueDiv.remove();
+
+ $.Widget.prototype.destroy.apply( this, arguments );
+ },
+
+ value: function( newValue ) {
+ if ( newValue === undefined ) {
+ return this._value();
+ }
+
+ this._setOption( "value", newValue );
+ return this;
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "value" ) {
+ this.options.value = value;
+ this._refreshValue();
+ if ( this._value() === this.options.max ) {
+ this._trigger( "complete" );
+ }
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+ },
+
+ _value: function() {
+ var val = this.options.value;
+ // normalize invalid value
+ if ( typeof val !== "number" ) {
+ val = 0;
+ }
+ return Math.min( this.options.max, Math.max( this.min, val ) );
+ },
+
+ _percentage: function() {
+ return 100 * this._value() / this.options.max;
+ },
+
+ _refreshValue: function() {
+ var value = this.value();
+ var percentage = this._percentage();
+
+ if ( this.oldValue !== value ) {
+ this.oldValue = value;
+ this._trigger( "change" );
+ }
+
+ this.valueDiv
+ .toggle( value > this.min )
+ .toggleClass( "ui-corner-right", value === this.options.max )
+ .width( percentage.toFixed(0) + "%" );
+ this.element.attr( "aria-valuenow", value );
+ }
+});
+
+$.extend( $.ui.progressbar, {
+ version: "1.8.16"
+});
+
+})( jQuery );
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+// number of pages in a slider
+// (how many times can you page up/down to go through the whole range)
+var numPages = 5;
+
+$.widget( "ui.slider", $.ui.mouse, {
+
+ widgetEventPrefix: "slide",
+
+ options: {
+ animate: false,
+ distance: 0,
+ max: 100,
+ min: 0,
+ orientation: "horizontal",
+ range: false,
+ step: 1,
+ value: 0,
+ values: null
+ },
+
+ _create: function() {
+ var self = this,
+ o = this.options,
+ existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
+ handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
+ handleCount = ( o.values && o.values.length ) || 1,
+ handles = [];
+
+ this._keySliding = false;
+ this._mouseSliding = false;
+ this._animateOff = true;
+ this._handleIndex = null;
+ this._detectOrientation();
+ this._mouseInit();
+
+ this.element
+ .addClass( "ui-slider" +
+ " ui-slider-" + this.orientation +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" +
+ ( o.disabled ? " ui-slider-disabled ui-disabled" : "" ) );
+
+ this.range = $([]);
+
+ if ( o.range ) {
+ if ( o.range === true ) {
+ if ( !o.values ) {
+ o.values = [ this._valueMin(), this._valueMin() ];
+ }
+ if ( o.values.length && o.values.length !== 2 ) {
+ o.values = [ o.values[0], o.values[0] ];
+ }
+ }
+
+ this.range = $( "<div></div>" )
+ .appendTo( this.element )
+ .addClass( "ui-slider-range" +
+ // note: this isn't the most fittingly semantic framework class for this element,
+ // but worked best visually with a variety of themes
+ " ui-widget-header" +
+ ( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
+ }
+
+ for ( var i = existingHandles.length; i < handleCount; i += 1 ) {
+ handles.push( handle );
+ }
+
+ this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( self.element ) );
+
+ this.handle = this.handles.eq( 0 );
+
+ this.handles.add( this.range ).filter( "a" )
+ .click(function( event ) {
+ event.preventDefault();
+ })
+ .hover(function() {
+ if ( !o.disabled ) {
+ $( this ).addClass( "ui-state-hover" );
+ }
+ }, function() {
+ $( this ).removeClass( "ui-state-hover" );
+ })
+ .focus(function() {
+ if ( !o.disabled ) {
+ $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
+ $( this ).addClass( "ui-state-focus" );
+ } else {
+ $( this ).blur();
+ }
+ })
+ .blur(function() {
+ $( this ).removeClass( "ui-state-focus" );
+ });
+
+ this.handles.each(function( i ) {
+ $( this ).data( "index.ui-slider-handle", i );
+ });
+
+ this.handles
+ .keydown(function( event ) {
+ var ret = true,
+ index = $( this ).data( "index.ui-slider-handle" ),
+ allowed,
+ curVal,
+ newVal,
+ step;
+
+ if ( self.options.disabled ) {
+ return;
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ case $.ui.keyCode.END:
+ case $.ui.keyCode.PAGE_UP:
+ case $.ui.keyCode.PAGE_DOWN:
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ ret = false;
+ if ( !self._keySliding ) {
+ self._keySliding = true;
+ $( this ).addClass( "ui-state-active" );
+ allowed = self._start( event, index );
+ if ( allowed === false ) {
+ return;
+ }
+ }
+ break;
+ }
+
+ step = self.options.step;
+ if ( self.options.values && self.options.values.length ) {
+ curVal = newVal = self.values( index );
+ } else {
+ curVal = newVal = self.value();
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ newVal = self._valueMin();
+ break;
+ case $.ui.keyCode.END:
+ newVal = self._valueMax();
+ break;
+ case $.ui.keyCode.PAGE_UP:
+ newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
+ break;
+ case $.ui.keyCode.PAGE_DOWN:
+ newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
+ break;
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ if ( curVal === self._valueMax() ) {
+ return;
+ }
+ newVal = self._trimAlignValue( curVal + step );
+ break;
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ if ( curVal === self._valueMin() ) {
+ return;
+ }
+ newVal = self._trimAlignValue( curVal - step );
+ break;
+ }
+
+ self._slide( event, index, newVal );
+
+ return ret;
+
+ })
+ .keyup(function( event ) {
+ var index = $( this ).data( "index.ui-slider-handle" );
+
+ if ( self._keySliding ) {
+ self._keySliding = false;
+ self._stop( event, index );
+ self._change( event, index );
+ $( this ).removeClass( "ui-state-active" );
+ }
+
+ });
+
+ this._refreshValue();
+
+ this._animateOff = false;
+ },
+
+ destroy: function() {
+ this.handles.remove();
+ this.range.remove();
+
+ this.element
+ .removeClass( "ui-slider" +
+ " ui-slider-horizontal" +
+ " ui-slider-vertical" +
+ " ui-slider-disabled" +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" )
+ .removeData( "slider" )
+ .unbind( ".slider" );
+
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseCapture: function( event ) {
+ var o = this.options,
+ position,
+ normValue,
+ distance,
+ closestHandle,
+ self,
+ index,
+ allowed,
+ offset,
+ mouseOverHandle;
+
+ if ( o.disabled ) {
+ return false;
+ }
+
+ this.elementSize = {
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight()
+ };
+ this.elementOffset = this.element.offset();
+
+ position = { x: event.pageX, y: event.pageY };
+ normValue = this._normValueFromMouse( position );
+ distance = this._valueMax() - this._valueMin() + 1;
+ self = this;
+ this.handles.each(function( i ) {
+ var thisDistance = Math.abs( normValue - self.values(i) );
+ if ( distance > thisDistance ) {
+ distance = thisDistance;
+ closestHandle = $( this );
+ index = i;
+ }
+ });
+
+ // workaround for bug #3736 (if both handles of a range are at 0,
+ // the first is always used as the one with least distance,
+ // and moving it is obviously prevented by preventing negative ranges)
+ if( o.range === true && this.values(1) === o.min ) {
+ index += 1;
+ closestHandle = $( this.handles[index] );
+ }
+
+ allowed = this._start( event, index );
+ if ( allowed === false ) {
+ return false;
+ }
+ this._mouseSliding = true;
+
+ self._handleIndex = index;
+
+ closestHandle
+ .addClass( "ui-state-active" )
+ .focus();
+
+ offset = closestHandle.offset();
+ mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
+ this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
+ left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+ top: event.pageY - offset.top -
+ ( closestHandle.height() / 2 ) -
+ ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+ ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+ ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
+ };
+
+ if ( !this.handles.hasClass( "ui-state-hover" ) ) {
+ this._slide( event, index, normValue );
+ }
+ this._animateOff = true;
+ return true;
+ },
+
+ _mouseStart: function( event ) {
+ return true;
+ },
+
+ _mouseDrag: function( event ) {
+ var position = { x: event.pageX, y: event.pageY },
+ normValue = this._normValueFromMouse( position );
+
+ this._slide( event, this._handleIndex, normValue );
+
+ return false;
+ },
+
+ _mouseStop: function( event ) {
+ this.handles.removeClass( "ui-state-active" );
+ this._mouseSliding = false;
+
+ this._stop( event, this._handleIndex );
+ this._change( event, this._handleIndex );
+
+ this._handleIndex = null;
+ this._clickOffset = null;
+ this._animateOff = false;
+
+ return false;
+ },
+
+ _detectOrientation: function() {
+ this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
+ },
+
+ _normValueFromMouse: function( position ) {
+ var pixelTotal,
+ pixelMouse,
+ percentMouse,
+ valueTotal,
+ valueMouse;
+
+ if ( this.orientation === "horizontal" ) {
+ pixelTotal = this.elementSize.width;
+ pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
+ } else {
+ pixelTotal = this.elementSize.height;
+ pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
+ }
+
+ percentMouse = ( pixelMouse / pixelTotal );
+ if ( percentMouse > 1 ) {
+ percentMouse = 1;
+ }
+ if ( percentMouse < 0 ) {
+ percentMouse = 0;
+ }
+ if ( this.orientation === "vertical" ) {
+ percentMouse = 1 - percentMouse;
+ }
+
+ valueTotal = this._valueMax() - this._valueMin();
+ valueMouse = this._valueMin() + percentMouse * valueTotal;
+
+ return this._trimAlignValue( valueMouse );
+ },
+
+ _start: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+ return this._trigger( "start", event, uiHash );
+ },
+
+ _slide: function( event, index, newVal ) {
+ var otherVal,
+ newValues,
+ allowed;
+
+ if ( this.options.values && this.options.values.length ) {
+ otherVal = this.values( index ? 0 : 1 );
+
+ if ( ( this.options.values.length === 2 && this.options.range === true ) &&
+ ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
+ ) {
+ newVal = otherVal;
+ }
+
+ if ( newVal !== this.values( index ) ) {
+ newValues = this.values();
+ newValues[ index ] = newVal;
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal,
+ values: newValues
+ } );
+ otherVal = this.values( index ? 0 : 1 );
+ if ( allowed !== false ) {
+ this.values( index, newVal, true );
+ }
+ }
+ } else {
+ if ( newVal !== this.value() ) {
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal
+ } );
+ if ( allowed !== false ) {
+ this.value( newVal );
+ }
+ }
+ }
+ },
+
+ _stop: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ this._trigger( "stop", event, uiHash );
+ },
+
+ _change: function( event, index ) {
+ if ( !this._keySliding && !this._mouseSliding ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ this._trigger( "change", event, uiHash );
+ }
+ },
+
+ value: function( newValue ) {
+ if ( arguments.length ) {
+ this.options.value = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, 0 );
+ return;
+ }
+
+ return this._value();
+ },
+
+ values: function( index, newValue ) {
+ var vals,
+ newValues,
+ i;
+
+ if ( arguments.length > 1 ) {
+ this.options.values[ index ] = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, index );
+ return;
+ }
+
+ if ( arguments.length ) {
+ if ( $.isArray( arguments[ 0 ] ) ) {
+ vals = this.options.values;
+ newValues = arguments[ 0 ];
+ for ( i = 0; i < vals.length; i += 1 ) {
+ vals[ i ] = this._trimAlignValue( newValues[ i ] );
+ this._change( null, i );
+ }
+ this._refreshValue();
+ } else {
+ if ( this.options.values && this.options.values.length ) {
+ return this._values( index );
+ } else {
+ return this.value();
+ }
+ }
+ } else {
+ return this._values();
+ }
+ },
+
+ _setOption: function( key, value ) {
+ var i,
+ valsLength = 0;
+
+ if ( $.isArray( this.options.values ) ) {
+ valsLength = this.options.values.length;
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+
+ switch ( key ) {
+ case "disabled":
+ if ( value ) {
+ this.handles.filter( ".ui-state-focus" ).blur();
+ this.handles.removeClass( "ui-state-hover" );
+ this.handles.propAttr( "disabled", true );
+ this.element.addClass( "ui-disabled" );
+ } else {
+ this.handles.propAttr( "disabled", false );
+ this.element.removeClass( "ui-disabled" );
+ }
+ break;
+ case "orientation":
+ this._detectOrientation();
+ this.element
+ .removeClass( "ui-slider-horizontal ui-slider-vertical" )
+ .addClass( "ui-slider-" + this.orientation );
+ this._refreshValue();
+ break;
+ case "value":
+ this._animateOff = true;
+ this._refreshValue();
+ this._change( null, 0 );
+ this._animateOff = false;
+ break;
+ case "values":
+ this._animateOff = true;
+ this._refreshValue();
+ for ( i = 0; i < valsLength; i += 1 ) {
+ this._change( null, i );
+ }
+ this._animateOff = false;
+ break;
+ }
+ },
+
+ //internal value getter
+ // _value() returns value trimmed by min and max, aligned by step
+ _value: function() {
+ var val = this.options.value;
+ val = this._trimAlignValue( val );
+
+ return val;
+ },
+
+ //internal values getter
+ // _values() returns array of values trimmed by min and max, aligned by step
+ // _values( index ) returns single value trimmed by min and max, aligned by step
+ _values: function( index ) {
+ var val,
+ vals,
+ i;
+
+ if ( arguments.length ) {
+ val = this.options.values[ index ];
+ val = this._trimAlignValue( val );
+
+ return val;
+ } else {
+ // .slice() creates a copy of the array
+ // this copy gets trimmed by min and max and then returned
+ vals = this.options.values.slice();
+ for ( i = 0; i < vals.length; i+= 1) {
+ vals[ i ] = this._trimAlignValue( vals[ i ] );
+ }
+
+ return vals;
+ }
+ },
+
+ // returns the step-aligned value that val is closest to, between (inclusive) min and max
+ _trimAlignValue: function( val ) {
+ if ( val <= this._valueMin() ) {
+ return this._valueMin();
+ }
+ if ( val >= this._valueMax() ) {
+ return this._valueMax();
+ }
+ var step = ( this.options.step > 0 ) ? this.options.step : 1,
+ valModStep = (val - this._valueMin()) % step,
+ alignValue = val - valModStep;
+
+ if ( Math.abs(valModStep) * 2 >= step ) {
+ alignValue += ( valModStep > 0 ) ? step : ( -step );
+ }
+
+ // Since JavaScript has problems with large floats, round
+ // the final value to 5 digits after the decimal point (see #4124)
+ return parseFloat( alignValue.toFixed(5) );
+ },
+
+ _valueMin: function() {
+ return this.options.min;
+ },
+
+ _valueMax: function() {
+ return this.options.max;
+ },
+
+ _refreshValue: function() {
+ var oRange = this.options.range,
+ o = this.options,
+ self = this,
+ animate = ( !this._animateOff ) ? o.animate : false,
+ valPercent,
+ _set = {},
+ lastValPercent,
+ value,
+ valueMin,
+ valueMax;
+
+ if ( this.options.values && this.options.values.length ) {
+ this.handles.each(function( i, j ) {
+ valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+ $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+ if ( self.options.range === true ) {
+ if ( self.orientation === "horizontal" ) {
+ if ( i === 0 ) {
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ } else {
+ if ( i === 0 ) {
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ }
+ lastValPercent = valPercent;
+ });
+ } else {
+ value = this.value();
+ valueMin = this._valueMin();
+ valueMax = this._valueMax();
+ valPercent = ( valueMax !== valueMin ) ?
+ ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+ 0;
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+ this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+
+ if ( oRange === "min" && this.orientation === "horizontal" ) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "horizontal" ) {
+ this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ if ( oRange === "min" && this.orientation === "vertical" ) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "vertical" ) {
+ this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ }
+
+});
+
+$.extend( $.ui.slider, {
+ version: "1.8.16"
+});
+
+}(jQuery));
+/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var tabId = 0,
+ listId = 0;
+
+function getNextTabId() {
+ return ++tabId;
+}
+
+function getNextListId() {
+ return ++listId;
+}
+
+$.widget( "ui.tabs", {
+ options: {
+ add: null,
+ ajaxOptions: null,
+ cache: false,
+ cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+ collapsible: false,
+ disable: null,
+ disabled: [],
+ enable: null,
+ event: "click",
+ fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
+ idPrefix: "ui-tabs-",
+ load: null,
+ panelTemplate: "<div></div>",
+ remove: null,
+ select: null,
+ show: null,
+ spinner: "<em>Loading&#8230;</em>",
+ tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
+ },
+
+ _create: function() {
+ this._tabify( true );
+ },
+
+ _setOption: function( key, value ) {
+ if ( key == "selected" ) {
+ if (this.options.collapsible && value == this.options.selected ) {
+ return;
+ }
+ this.select( value );
+ } else {
+ this.options[ key ] = value;
+ this._tabify();
+ }
+ },
+
+ _tabId: function( a ) {
+ return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) ||
+ this.options.idPrefix + getNextTabId();
+ },
+
+ _sanitizeSelector: function( hash ) {
+ // we need this because an id may contain a ":"
+ return hash.replace( /:/g, "\\:" );
+ },
+
+ _cookie: function() {
+ var cookie = this.cookie ||
+ ( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() );
+ return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) );
+ },
+
+ _ui: function( tab, panel ) {
+ return {
+ tab: tab,
+ panel: panel,
+ index: this.anchors.index( tab )
+ };
+ },
+
+ _cleanup: function() {
+ // restore all former loading tabs labels
+ this.lis.filter( ".ui-state-processing" )
+ .removeClass( "ui-state-processing" )
+ .find( "span:data(label.tabs)" )
+ .each(function() {
+ var el = $( this );
+ el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" );
+ });
+ },
+
+ _tabify: function( init ) {
+ var self = this,
+ o = this.options,
+ fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
+
+ this.list = this.element.find( "ol,ul" ).eq( 0 );
+ this.lis = $( " > li:has(a[href])", this.list );
+ this.anchors = this.lis.map(function() {
+ return $( "a", this )[ 0 ];
+ });
+ this.panels = $( [] );
+
+ this.anchors.each(function( i, a ) {
+ var href = $( a ).attr( "href" );
+ // For dynamically created HTML that contains a hash as href IE < 8 expands
+ // such href to the full page url with hash and then misinterprets tab as ajax.
+ // Same consideration applies for an added tab with a fragment identifier
+ // since a[href=#fragment-identifier] does unexpectedly not match.
+ // Thus normalize href attribute...
+ var hrefBase = href.split( "#" )[ 0 ],
+ baseEl;
+ if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
+ ( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
+ href = a.hash;
+ a.href = href;
+ }
+
+ // inline tab
+ if ( fragmentId.test( href ) ) {
+ self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) );
+ // remote tab
+ // prevent loading the page itself if href is just "#"
+ } else if ( href && href !== "#" ) {
+ // required for restore on destroy
+ $.data( a, "href.tabs", href );
+
+ // TODO until #3808 is fixed strip fragment identifier from url
+ // (IE fails to load from such url)
+ $.data( a, "load.tabs", href.replace( /#.*$/, "" ) );
+
+ var id = self._tabId( a );
+ a.href = "#" + id;
+ var $panel = self.element.find( "#" + id );
+ if ( !$panel.length ) {
+ $panel = $( o.panelTemplate )
+ .attr( "id", id )
+ .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+ .insertAfter( self.panels[ i - 1 ] || self.list );
+ $panel.data( "destroy.tabs", true );
+ }
+ self.panels = self.panels.add( $panel );
+ // invalid tab href
+ } else {
+ o.disabled.push( i );
+ }
+ });
+
+ // initialization from scratch
+ if ( init ) {
+ // attach necessary classes for styling
+ this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
+ this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+ this.lis.addClass( "ui-state-default ui-corner-top" );
+ this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
+
+ // Selected tab
+ // use "selected" option or try to retrieve:
+ // 1. from fragment identifier in url
+ // 2. from cookie
+ // 3. from selected class attribute on <li>
+ if ( o.selected === undefined ) {
+ if ( location.hash ) {
+ this.anchors.each(function( i, a ) {
+ if ( a.hash == location.hash ) {
+ o.selected = i;
+ return false;
+ }
+ });
+ }
+ if ( typeof o.selected !== "number" && o.cookie ) {
+ o.selected = parseInt( self._cookie(), 10 );
+ }
+ if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) {
+ o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+ }
+ o.selected = o.selected || ( this.lis.length ? 0 : -1 );
+ } else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release
+ o.selected = -1;
+ }
+
+ // sanity check - default to first tab...
+ o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 )
+ ? o.selected
+ : 0;
+
+ // Take disabling tabs via class attribute from HTML
+ // into account and update option properly.
+ // A selected tab cannot become disabled.
+ o.disabled = $.unique( o.disabled.concat(
+ $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
+ return self.lis.index( n );
+ })
+ ) ).sort();
+
+ if ( $.inArray( o.selected, o.disabled ) != -1 ) {
+ o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
+ }
+
+ // highlight selected tab
+ this.panels.addClass( "ui-tabs-hide" );
+ this.lis.removeClass( "ui-tabs-selected ui-state-active" );
+ // check for length avoids error when initializing empty list
+ if ( o.selected >= 0 && this.anchors.length ) {
+ self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" );
+ this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" );
+
+ // seems to be expected behavior that the show callback is fired
+ self.element.queue( "tabs", function() {
+ self._trigger( "show", null,
+ self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) );
+ });
+
+ this.load( o.selected );
+ }
+
+ // clean up to avoid memory leaks in certain versions of IE 6
+ // TODO: namespace this event
+ $( window ).bind( "unload", function() {
+ self.lis.add( self.anchors ).unbind( ".tabs" );
+ self.lis = self.anchors = self.panels = null;
+ });
+ // update selected after add/remove
+ } else {
+ o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+ }
+
+ // update collapsible
+ // TODO: use .toggleClass()
+ this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" );
+
+ // set or update cookie after init and add/remove respectively
+ if ( o.cookie ) {
+ this._cookie( o.selected, o.cookie );
+ }
+
+ // disable tabs
+ for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
+ $( li )[ $.inArray( i, o.disabled ) != -1 &&
+ // TODO: use .toggleClass()
+ !$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" );
+ }
+
+ // reset cache if switching from cached to not cached
+ if ( o.cache === false ) {
+ this.anchors.removeData( "cache.tabs" );
+ }
+
+ // remove all handlers before, tabify may run on existing tabs after add or option change
+ this.lis.add( this.anchors ).unbind( ".tabs" );
+
+ if ( o.event !== "mouseover" ) {
+ var addState = function( state, el ) {
+ if ( el.is( ":not(.ui-state-disabled)" ) ) {
+ el.addClass( "ui-state-" + state );
+ }
+ };
+ var removeState = function( state, el ) {
+ el.removeClass( "ui-state-" + state );
+ };
+ this.lis.bind( "mouseover.tabs" , function() {
+ addState( "hover", $( this ) );
+ });
+ this.lis.bind( "mouseout.tabs", function() {
+ removeState( "hover", $( this ) );
+ });
+ this.anchors.bind( "focus.tabs", function() {
+ addState( "focus", $( this ).closest( "li" ) );
+ });
+ this.anchors.bind( "blur.tabs", function() {
+ removeState( "focus", $( this ).closest( "li" ) );
+ });
+ }
+
+ // set up animations
+ var hideFx, showFx;
+ if ( o.fx ) {
+ if ( $.isArray( o.fx ) ) {
+ hideFx = o.fx[ 0 ];
+ showFx = o.fx[ 1 ];
+ } else {
+ hideFx = showFx = o.fx;
+ }
+ }
+
+ // Reset certain styles left over from animation
+ // and prevent IE's ClearType bug...
+ function resetStyle( $el, fx ) {
+ $el.css( "display", "" );
+ if ( !$.support.opacity && fx.opacity ) {
+ $el[ 0 ].style.removeAttribute( "filter" );
+ }
+ }
+
+ // Show a tab...
+ var showTab = showFx
+ ? function( clicked, $show ) {
+ $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+ $show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way
+ .animate( showFx, showFx.duration || "normal", function() {
+ resetStyle( $show, showFx );
+ self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+ });
+ }
+ : function( clicked, $show ) {
+ $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+ $show.removeClass( "ui-tabs-hide" );
+ self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+ };
+
+ // Hide a tab, $show is optional...
+ var hideTab = hideFx
+ ? function( clicked, $hide ) {
+ $hide.animate( hideFx, hideFx.duration || "normal", function() {
+ self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+ $hide.addClass( "ui-tabs-hide" );
+ resetStyle( $hide, hideFx );
+ self.element.dequeue( "tabs" );
+ });
+ }
+ : function( clicked, $hide, $show ) {
+ self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+ $hide.addClass( "ui-tabs-hide" );
+ self.element.dequeue( "tabs" );
+ };
+
+ // attach tab event handler, unbind to avoid duplicates from former tabifying...
+ this.anchors.bind( o.event + ".tabs", function() {
+ var el = this,
+ $li = $(el).closest( "li" ),
+ $hide = self.panels.filter( ":not(.ui-tabs-hide)" ),
+ $show = self.element.find( self._sanitizeSelector( el.hash ) );
+
+ // If tab is already selected and not collapsible or tab disabled or
+ // or is already loading or click callback returns false stop here.
+ // Check if click handler returns false last so that it is not executed
+ // for a disabled or loading tab!
+ if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) ||
+ $li.hasClass( "ui-state-disabled" ) ||
+ $li.hasClass( "ui-state-processing" ) ||
+ self.panels.filter( ":animated" ).length ||
+ self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) {
+ this.blur();
+ return false;
+ }
+
+ o.selected = self.anchors.index( this );
+
+ self.abort();
+
+ // if tab may be closed
+ if ( o.collapsible ) {
+ if ( $li.hasClass( "ui-tabs-selected" ) ) {
+ o.selected = -1;
+
+ if ( o.cookie ) {
+ self._cookie( o.selected, o.cookie );
+ }
+
+ self.element.queue( "tabs", function() {
+ hideTab( el, $hide );
+ }).dequeue( "tabs" );
+
+ this.blur();
+ return false;
+ } else if ( !$hide.length ) {
+ if ( o.cookie ) {
+ self._cookie( o.selected, o.cookie );
+ }
+
+ self.element.queue( "tabs", function() {
+ showTab( el, $show );
+ });
+
+ // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
+ self.load( self.anchors.index( this ) );
+
+ this.blur();
+ return false;
+ }
+ }
+
+ if ( o.cookie ) {
+ self._cookie( o.selected, o.cookie );
+ }
+
+ // show new tab
+ if ( $show.length ) {
+ if ( $hide.length ) {
+ self.element.queue( "tabs", function() {
+ hideTab( el, $hide );
+ });
+ }
+ self.element.queue( "tabs", function() {
+ showTab( el, $show );
+ });
+
+ self.load( self.anchors.index( this ) );
+ } else {
+ throw "jQuery UI Tabs: Mismatching fragment identifier.";
+ }
+
+ // Prevent IE from keeping other link focussed when using the back button
+ // and remove dotted border from clicked link. This is controlled via CSS
+ // in modern browsers; blur() removes focus from address bar in Firefox
+ // which can become a usability and annoying problem with tabs('rotate').
+ if ( $.browser.msie ) {
+ this.blur();
+ }
+ });
+
+ // disable click in any case
+ this.anchors.bind( "click.tabs", function(){
+ return false;
+ });
+ },
+
+ _getIndex: function( index ) {
+ // meta-function to give users option to provide a href string instead of a numerical index.
+ // also sanitizes numerical indexes to valid values.
+ if ( typeof index == "string" ) {
+ index = this.anchors.index( this.anchors.filter( "[href$=" + index + "]" ) );
+ }
+
+ return index;
+ },
+
+ destroy: function() {
+ var o = this.options;
+
+ this.abort();
+
+ this.element
+ .unbind( ".tabs" )
+ .removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" )
+ .removeData( "tabs" );
+
+ this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+
+ this.anchors.each(function() {
+ var href = $.data( this, "href.tabs" );
+ if ( href ) {
+ this.href = href;
+ }
+ var $this = $( this ).unbind( ".tabs" );
+ $.each( [ "href", "load", "cache" ], function( i, prefix ) {
+ $this.removeData( prefix + ".tabs" );
+ });
+ });
+
+ this.lis.unbind( ".tabs" ).add( this.panels ).each(function() {
+ if ( $.data( this, "destroy.tabs" ) ) {
+ $( this ).remove();
+ } else {
+ $( this ).removeClass([
+ "ui-state-default",
+ "ui-corner-top",
+ "ui-tabs-selected",
+ "ui-state-active",
+ "ui-state-hover",
+ "ui-state-focus",
+ "ui-state-disabled",
+ "ui-tabs-panel",
+ "ui-widget-content",
+ "ui-corner-bottom",
+ "ui-tabs-hide"
+ ].join( " " ) );
+ }
+ });
+
+ if ( o.cookie ) {
+ this._cookie( null, o.cookie );
+ }
+
+ return this;
+ },
+
+ add: function( url, label, index ) {
+ if ( index === undefined ) {
+ index = this.anchors.length;
+ }
+
+ var self = this,
+ o = this.options,
+ $li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ),
+ id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] );
+
+ $li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
+
+ // try to find an existing element before creating a new one
+ var $panel = self.element.find( "#" + id );
+ if ( !$panel.length ) {
+ $panel = $( o.panelTemplate )
+ .attr( "id", id )
+ .data( "destroy.tabs", true );
+ }
+ $panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
+
+ if ( index >= this.lis.length ) {
+ $li.appendTo( this.list );
+ $panel.appendTo( this.list[ 0 ].parentNode );
+ } else {
+ $li.insertBefore( this.lis[ index ] );
+ $panel.insertBefore( this.panels[ index ] );
+ }
+
+ o.disabled = $.map( o.disabled, function( n, i ) {
+ return n >= index ? ++n : n;
+ });
+
+ this._tabify();
+
+ if ( this.anchors.length == 1 ) {
+ o.selected = 0;
+ $li.addClass( "ui-tabs-selected ui-state-active" );
+ $panel.removeClass( "ui-tabs-hide" );
+ this.element.queue( "tabs", function() {
+ self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) );
+ });
+
+ this.load( 0 );
+ }
+
+ this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+ return this;
+ },
+
+ remove: function( index ) {
+ index = this._getIndex( index );
+ var o = this.options,
+ $li = this.lis.eq( index ).remove(),
+ $panel = this.panels.eq( index ).remove();
+
+ // If selected tab was removed focus tab to the right or
+ // in case the last tab was removed the tab to the left.
+ if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) {
+ this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
+ }
+
+ o.disabled = $.map(
+ $.grep( o.disabled, function(n, i) {
+ return n != index;
+ }),
+ function( n, i ) {
+ return n >= index ? --n : n;
+ });
+
+ this._tabify();
+
+ this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) );
+ return this;
+ },
+
+ enable: function( index ) {
+ index = this._getIndex( index );
+ var o = this.options;
+ if ( $.inArray( index, o.disabled ) == -1 ) {
+ return;
+ }
+
+ this.lis.eq( index ).removeClass( "ui-state-disabled" );
+ o.disabled = $.grep( o.disabled, function( n, i ) {
+ return n != index;
+ });
+
+ this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+ return this;
+ },
+
+ disable: function( index ) {
+ index = this._getIndex( index );
+ var self = this, o = this.options;
+ // cannot disable already selected tab
+ if ( index != o.selected ) {
+ this.lis.eq( index ).addClass( "ui-state-disabled" );
+
+ o.disabled.push( index );
+ o.disabled.sort();
+
+ this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+ }
+
+ return this;
+ },
+
+ select: function( index ) {
+ index = this._getIndex( index );
+ if ( index == -1 ) {
+ if ( this.options.collapsible && this.options.selected != -1 ) {
+ index = this.options.selected;
+ } else {
+ return this;
+ }
+ }
+ this.anchors.eq( index ).trigger( this.options.event + ".tabs" );
+ return this;
+ },
+
+ load: function( index ) {
+ index = this._getIndex( index );
+ var self = this,
+ o = this.options,
+ a = this.anchors.eq( index )[ 0 ],
+ url = $.data( a, "load.tabs" );
+
+ this.abort();
+
+ // not remote or from cache
+ if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) {
+ this.element.dequeue( "tabs" );
+ return;
+ }
+
+ // load remote from here on
+ this.lis.eq( index ).addClass( "ui-state-processing" );
+
+ if ( o.spinner ) {
+ var span = $( "span", a );
+ span.data( "label.tabs", span.html() ).html( o.spinner );
+ }
+
+ this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, {
+ url: url,
+ success: function( r, s ) {
+ self.element.find( self._sanitizeSelector( a.hash ) ).html( r );
+
+ // take care of tab labels
+ self._cleanup();
+
+ if ( o.cache ) {
+ $.data( a, "cache.tabs", true );
+ }
+
+ self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+ try {
+ o.ajaxOptions.success( r, s );
+ }
+ catch ( e ) {}
+ },
+ error: function( xhr, s, e ) {
+ // take care of tab labels
+ self._cleanup();
+
+ self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+ try {
+ // Passing index avoid a race condition when this method is
+ // called after the user has selected another tab.
+ // Pass the anchor that initiated this request allows
+ // loadError to manipulate the tab content panel via $(a.hash)
+ o.ajaxOptions.error( xhr, s, index, a );
+ }
+ catch ( e ) {}
+ }
+ } ) );
+
+ // last, so that load event is fired before show...
+ self.element.dequeue( "tabs" );
+
+ return this;
+ },
+
+ abort: function() {
+ // stop possibly running animations
+ this.element.queue( [] );
+ this.panels.stop( false, true );
+
+ // "tabs" queue must not contain more than two elements,
+ // which are the callbacks for the latest clicked tab...
+ this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
+
+ // terminate pending requests from other tabs
+ if ( this.xhr ) {
+ this.xhr.abort();
+ delete this.xhr;
+ }
+
+ // take care of tab labels
+ this._cleanup();
+ return this;
+ },
+
+ url: function( index, url ) {
+ this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url );
+ return this;
+ },
+
+ length: function() {
+ return this.anchors.length;
+ }
+});
+
+$.extend( $.ui.tabs, {
+ version: "1.8.16"
+});
+
+/*
+ * Tabs Extensions
+ */
+
+/*
+ * Rotate
+ */
+$.extend( $.ui.tabs.prototype, {
+ rotation: null,
+ rotate: function( ms, continuing ) {
+ var self = this,
+ o = this.options;
+
+ var rotate = self._rotate || ( self._rotate = function( e ) {
+ clearTimeout( self.rotation );
+ self.rotation = setTimeout(function() {
+ var t = o.selected;
+ self.select( ++t < self.anchors.length ? t : 0 );
+ }, ms );
+
+ if ( e ) {
+ e.stopPropagation();
+ }
+ });
+
+ var stop = self._unrotate || ( self._unrotate = !continuing
+ ? function(e) {
+ if (e.clientX) { // in case of a true click
+ self.rotate(null);
+ }
+ }
+ : function( e ) {
+ t = o.selected;
+ rotate();
+ });
+
+ // start rotation
+ if ( ms ) {
+ this.element.bind( "tabsshow", rotate );
+ this.anchors.bind( o.event + ".tabs", stop );
+ rotate();
+ // stop rotation
+ } else {
+ clearTimeout( self.rotation );
+ this.element.unbind( "tabsshow", rotate );
+ this.anchors.unbind( o.event + ".tabs", stop );
+ delete this._rotate;
+ delete this._unrotate;
+ }
+
+ return this;
+ }
+});
+
+})( jQuery );
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.autocomplete.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.autocomplete.js
new file mode 100644
index 0000000..4b021c1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.autocomplete.js
@@ -0,0 +1,13 @@
+/*
+ * jQuery Autocomplete plugin 1.1
+ *
+ * Copyright (c) 2009 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
+ */;(function($){$.fn.extend({autocomplete:function(urlOrData,options){var isUrl=typeof urlOrData=="string";options=$.extend({},$.Autocompleter.defaults,{url:isUrl?urlOrData:null,data:isUrl?null:urlOrData,delay:isUrl?$.Autocompleter.defaults.delay:10,max:options&&!options.scroll?10:150},options);options.highlight=options.highlight||function(value){return value;};options.formatMatch=options.formatMatch||options.formatItem;return this.each(function(){new $.Autocompleter(this,options);});},result:function(handler){return this.bind("result",handler);},search:function(handler){return this.trigger("search",[handler]);},flushCache:function(){return this.trigger("flushCache");},setOptions:function(options){return this.trigger("setOptions",[options]);},unautocomplete:function(){return this.trigger("unautocomplete");}});$.Autocompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var cache=$.Autocompleter.Cache(options);var hasFocus=0;var lastKeyPressCode;var config={mouseDownOnSelect:false};var select=$.Autocompleter.Select(options,input,selectCurrent,config);var blockSubmit;$.browser.opera&&$(input.form).bind("submit.autocomplete",function(){if(blockSubmit){blockSubmit=false;return false;}});$input.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(event){hasFocus=1;lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:event.preventDefault();if(select.visible()){select.prev();}else{onChange(0,true);}break;case KEY.DOWN:event.preventDefault();if(select.visible()){select.next();}else{onChange(0,true);}break;case KEY.PAGEUP:event.preventDefault();if(select.visible()){select.pageUp();}else{onChange(0,true);}break;case KEY.PAGEDOWN:event.preventDefault();if(select.visible()){select.pageDown();}else{onChange(0,true);}break;case options.multiple&&$.trim(options.multipleSeparator)==","&&KEY.COMMA:case KEY.TAB:case KEY.RETURN:if(selectCurrent()){event.preventDefault();blockSubmit=true;return false;}break;case KEY.ESC:select.hide();break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break;}}).focus(function(){hasFocus++;}).blur(function(){hasFocus=0;if(!config.mouseDownOnSelect){hideResults();}}).click(function(){if(hasFocus++>1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i<data.length;i++){if(data[i].result.toLowerCase()==q.toLowerCase()){result=data[i];break;}}}if(typeof fn=="function")fn(result);else $input.trigger("result",result&&[result.data,result.value]);}$.each(trimWords($input.val()),function(i,value){request(value,findValueCallback,findValueCallback);});}).bind("flushCache",function(){cache.flush();}).bind("setOptions",function(){$.extend(options,arguments[1]);if("data"in arguments[1])cache.populate();}).bind("unautocomplete",function(){select.unbind();$input.unbind();$(input.form).unbind(".autocomplete");});function selectCurrent(){var selected=select.selected();if(!selected)return false;var v=selected.result;previousValue=v;if(options.multiple){var words=trimWords($input.val());if(words.length>1){var seperator=options.multipleSeparator.length;var cursorAt=$(input).selection().start;var wordAt,progress=0;$.each(words,function(i,word){progress+=word.length;if(cursorAt<=progress){wordAt=i;return false;}progress+=seperator;});words[wordAt]=v;v=words.join(options.multipleSeparator);}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&&currentValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value)return[""];if(!options.multiple)return[$.trim(value)];return $.map(value.split(options.multipleSeparator),function(word){return $.trim(value).length?$.trim(word):null;});}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);if(words.length==1)return words[0];var cursorAt=$(input).selection().start;if(cursorAt==value.length){words=trimWords(value)}else{words=trimWords(value.replace(value.substring(cursorAt),""));}return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$(input).selection(previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else{$input.val("");$input.trigger("result",null);}}});}};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i<rows.length;i++){var row=$.trim(rows[i]);if(row){row=row.split("|");parsed[parsed.length]={data:row,value:row[0],result:options.formatResult&&options.formatResult(row,row[0])||row[0]};}}return parsed;};function stopLoading(){$input.removeClass(options.loadingClass);};};$.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(row){return row[0];},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(value,term){return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(options.matchContains=="word"){i=s.toLowerCase().search("\\b"+sub.toLowerCase());}if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i<ol;i++){var rawValue=options.data[i];rawValue=(typeof rawValue=="string")?[rawValue]:rawValue;var value=options.formatMatch(rawValue,i+1,options.data.length);if(value===false)continue;var firstChar=value.charAt(0).toLowerCase();if(!stMatchSets[firstChar])stMatchSets[firstChar]=[];var row={value:value,data:rawValue,result:options.formatResult&&options.formatResult(rawValue)||value};stMatchSets[firstChar].push(row);if(nullData++<options.max){stMatchSets[""].push(row);}};$.each(stMatchSets,function(i,value){options.cacheLength++;add(i,value);});}setTimeout(populate,25);function flush(){data={};length=0;}return{flush:flush,add:add,populate:populate,load:function(q){if(!options.cacheLength||!length)return null;if(!options.url&&options.matchContains){var csub=[];for(var k in data){if(k.length>0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else
+if(data[q]){return data[q];}else
+if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("<div/>").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("<ul/>").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset<list.scrollTop()){list.scrollTop(offset);}}};function movePosition(step){active+=step;if(active<0){active=listItems.size()-1;}else if(active>=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max<available?options.max:available;}function fillList(){list.empty();var max=limitNumberOfItems(data.length);for(var i=0;i<max;i++){if(!data[i])continue;var formatted=options.formatItem(data[i].data,i+1,max,data[i].value,term);if(formatted===false)continue;var li=$("<li/>").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.fn.selection=function(start,end){if(start!==undefined){return this.each(function(){if(this.createTextRange){var selRange=this.createTextRange();if(end===undefined||start==end){selRange.move("character",start);selRange.select();}else{selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}}else if(this.setSelectionRange){this.setSelectionRange(start,end);}else if(this.selectionStart){this.selectionStart=start;this.selectionEnd=end;}});}var field=this[0];if(field.createTextRange){var range=document.selection.createRange(),orig=field.value,teststring="<->",textLength=range.text.length;range.text=teststring;var caretAt=field.value.indexOf(teststring);field.value=orig;this.selection(caretAt,caretAt+textLength);return{start:caretAt,end:caretAt+textLength}}else if(field.selectionStart!==undefined){return{start:field.selectionStart,end:field.selectionEnd}}};})(jQuery); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.bgiframe.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.bgiframe.js
new file mode 100644
index 0000000..7faef4b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.bgiframe.js
@@ -0,0 +1,10 @@
+/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ *
+ * $LastChangedDate: 2007-07-22 01:45:56 +0200 (Son, 22 Jul 2007) $
+ * $Rev: 2447 $
+ *
+ * Version 2.1.1
+ */
+(function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+'style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+'"/>';return this.each(function(){if($('> iframe.bgiframe',this).length==0)this.insertBefore(document.createElement(html),this.firstChild);});}return this;};})(jQuery); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.js
new file mode 100644
index 0000000..8f3ca2e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.js
@@ -0,0 +1,167 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
+b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
+this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
+"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
+!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
+getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
+script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
+!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
+false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
+A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
+b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
+c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
+c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
+encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
+[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
+e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
+if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
+3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
+d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
+d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
+"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
+1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
+d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
+Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
+var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
+this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
+this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
+c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
+b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
+h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
+for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
+parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
+height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
+f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
+"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
+e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
+c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
+c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
+b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.masonry.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.masonry.js
new file mode 100644
index 0000000..f6e8a82
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.masonry.js
@@ -0,0 +1,12 @@
+/*************************************************
+** jQuery Masonry version 1.3.2
+** Copyright David DeSandro, licensed MIT
+** http://desandro.com/resources/jquery-masonry
+**************************************************/
+(function(e){var n=e.event,o;n.special.smartresize={setup:function(){e(this).bind("resize",n.special.smartresize.handler)},teardown:function(){e(this).unbind("resize",n.special.smartresize.handler)},handler:function(j,l){var g=this,d=arguments;j.type="smartresize";o&&clearTimeout(o);o=setTimeout(function(){jQuery.event.handle.apply(g,d)},l==="execAsap"?0:100)}};e.fn.smartresize=function(j){return j?this.bind("smartresize",j):this.trigger("smartresize",["execAsap"])};e.fn.masonry=function(j,l){var g=
+{getBricks:function(d,b,a){var c=a.itemSelector===undefined;b.$bricks=a.appendedContent===undefined?c?d.children():d.find(a.itemSelector):c?a.appendedContent:a.appendedContent.filter(a.itemSelector)},placeBrick:function(d,b,a,c,h){b=Math.min.apply(Math,a);for(var i=b+d.outerHeight(true),f=a.length,k=f,m=c.colCount+1-f;f--;)if(a[f]==b)k=f;d.applyStyle({left:c.colW*k+c.posLeft,top:b},e.extend(true,{},h.animationOptions));for(f=0;f<m;f++)c.colY[k+f]=i},setup:function(d,b,a){g.getBricks(d,a,b);if(a.masoned)a.previousData=
+d.data("masonry");a.colW=b.columnWidth===undefined?a.masoned?a.previousData.colW:a.$bricks.outerWidth(true):b.columnWidth;a.colCount=Math.floor(d.width()/a.colW);a.colCount=Math.max(a.colCount,1)},arrange:function(d,b,a){var c;if(!a.masoned||b.appendedContent!==undefined)a.$bricks.css("position","absolute");if(a.masoned){a.posTop=a.previousData.posTop;a.posLeft=a.previousData.posLeft}else{d.css("position","relative");var h=e(document.createElement("div"));d.prepend(h);a.posTop=Math.round(h.position().top);
+a.posLeft=Math.round(h.position().left);h.remove()}if(a.masoned&&b.appendedContent!==undefined){a.colY=a.previousData.colY;for(c=a.previousData.colCount;c<a.colCount;c++)a.colY[c]=a.posTop}else{a.colY=[];for(c=a.colCount;c--;)a.colY.push(a.posTop)}e.fn.applyStyle=a.masoned&&b.animate?e.fn.animate:e.fn.css;b.singleMode?a.$bricks.each(function(){var i=e(this);g.placeBrick(i,a.colCount,a.colY,a,b)}):a.$bricks.each(function(){var i=e(this),f=Math.ceil(i.outerWidth(true)/a.colW);f=Math.min(f,a.colCount);
+if(f===1)g.placeBrick(i,a.colCount,a.colY,a,b);else{var k=a.colCount+1-f,m=[];for(c=0;c<k;c++){var p=a.colY.slice(c,c+f);m[c]=Math.max.apply(Math,p)}g.placeBrick(i,k,m,a,b)}});a.wallH=Math.max.apply(Math,a.colY);d.applyStyle({height:a.wallH-a.posTop},e.extend(true,[],b.animationOptions));a.masoned||setTimeout(function(){d.addClass("masoned")},1);l.call(a.$bricks);d.data("masonry",a)},resize:function(d,b,a){a.masoned=!!d.data("masonry");var c=d.data("masonry").colCount;g.setup(d,b,a);a.colCount!=c&&
+g.arrange(d,b,a)}};return this.each(function(){var d=e(this),b={};b.masoned=!!d.data("masonry");var a=b.masoned?d.data("masonry").options:{},c=e.extend({},e.fn.masonry.defaults,a,j),h=a.resizeable;b.options=c.saveOptions?c:a;l=l||function(){};g.getBricks(d,b,c);if(!b.$bricks.length)return this;g.setup(d,c,b);g.arrange(d,c,b);!h&&c.resizeable&&e(window).bind("smartresize.masonry",function(){g.resize(d,c,b)});h&&!c.resizeable&&e(window).unbind("smartresize.masonry")})};e.fn.masonry.defaults={singleMode:false,
+columnWidth:undefined,itemSelector:undefined,appendedContent:undefined,saveOptions:true,resizeable:true,animate:false,animationOptions:{}}})(jQuery); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.min.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.min.js
new file mode 100644
index 0000000..48590ec
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.min.js
@@ -0,0 +1,18 @@
+/*!
+ * jQuery JavaScript Library v1.6.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Jun 30 14:16:56 2011 -0400
+ */
+(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"?"<!doctype html>":"")+"<html><body>"),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;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){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;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.
+shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j
+)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.ui.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.ui.js
new file mode 100644
index 0000000..044d307
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.ui.js
@@ -0,0 +1,68 @@
+/*!
+ * jQuery UI 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.9",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
+NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
+"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
+if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
+"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
+d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
+c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
+b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
+;/*!
+ * jQuery UI Widget 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
+a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
+e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
+this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
+widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
+;/*
+ * jQuery UI Tabs 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=
+d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
+(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+
+g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};
+this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=
+-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=
+d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b,
+e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);
+j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();
+if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null,
+this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
+load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
+"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.9"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
+a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
+; \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.ui.timepicker.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.ui.timepicker.js
new file mode 100644
index 0000000..d086b67
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/jquery.ui.timepicker.js
@@ -0,0 +1,1345 @@
+/*
+ * jQuery UI Timepicker 0.2.9
+ *
+ * Copyright 2010-2011, Francois Gelinas
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://fgelinas.com/code/timepicker
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.position.js (only if position settngs are used)
+ *
+ * Change version 0.1.0 - moved the t-rex up here
+ *
+ ____
+ ___ .-~. /_"-._
+ `-._~-. / /_ "~o\ :Y
+ \ \ / : \~x. ` ')
+ ] Y / | Y< ~-.__j
+ / ! _.--~T : l l< /.-~
+ / / ____.--~ . ` l /~\ \<|Y
+ / / .-~~" /| . ',-~\ \L|
+ / / / .^ \ Y~Y \.^>/l_ "--'
+ / Y .-"( . l__ j_j l_/ /~_.-~ .
+ Y l / \ ) ~~~." / `/"~ / \.__/l_
+ | \ _.-" ~-{__ l : l._Z~-.___.--~
+ | ~---~ / ~~"---\_ ' __[>
+ l . _.^ ___ _>-y~
+ \ \ . .-~ .-~ ~>--" /
+ \ ~---" / ./ _.-'
+ "-.,_____.,_ _.--~\ _.-~
+ ~~ ( _} -Row
+ `. ~(
+ ) \
+ /,`--'~\--'~\
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ->T-Rex<-
+*/
+
+(function ($, undefined) {
+
+ $.extend($.ui, { timepicker: { version: "0.2.9"} });
+
+ var PROP_NAME = 'timepicker';
+ var tpuuid = new Date().getTime();
+
+ /* Time picker manager.
+ Use the singleton instance of this class, $.timepicker, to interact with the time picker.
+ Settings for (groups of) time pickers are maintained in an instance object,
+ allowing multiple different settings on the same page. */
+
+ function Timepicker() {
+ this.debug = true; // Change this to true to start debugging
+ this._curInst = null; // The current instance in use
+ this._isInline = false; // true if the instance is displayed inline
+ this._disabledInputs = []; // List of time picker inputs that have been disabled
+ this._timepickerShowing = false; // True if the popup picker is showing , false if not
+ this._inDialog = false; // True if showing within a "dialog", false if not
+ this._dialogClass = 'ui-timepicker-dialog'; // The name of the dialog marker class
+ this._mainDivId = 'ui-timepicker-div'; // The ID of the main timepicker division
+ this._inlineClass = 'ui-timepicker-inline'; // The name of the inline marker class
+ this._currentClass = 'ui-timepicker-current'; // The name of the current hour / minutes marker class
+ this._dayOverClass = 'ui-timepicker-days-cell-over'; // The name of the day hover marker class
+
+ this.regional = []; // Available regional settings, indexed by language code
+ this.regional[''] = { // Default regional settings
+ hourText: 'Hour', // Display text for hours section
+ minuteText: 'Minute', // Display text for minutes link
+ amPmText: ['AM', 'PM'], // Display text for AM PM
+ closeButtonText: 'Done', // Text for the confirmation button (ok button)
+ nowButtonText: 'Now', // Text for the now button
+ deselectButtonText: 'Deselect' // Text for the deselect button
+ };
+ this._defaults = { // Global defaults for all the time picker instances
+ showOn: 'focus', // 'focus' for popup on focus,
+ // 'button' for trigger button, or 'both' for either (not yet implemented)
+ button: null, // 'button' element that will trigger the timepicker
+ showAnim: 'fadeIn', // Name of jQuery animation for popup
+ showOptions: {}, // Options for enhanced animations
+ appendText: '', // Display text following the input box, e.g. showing the format
+
+ beforeShow: null, // Define a callback function executed before the timepicker is shown
+ onSelect: null, // Define a callback function when a hour / minutes is selected
+ onClose: null, // Define a callback function when the timepicker is closed
+
+ timeSeparator: ':', // The character to use to separate hours and minutes.
+ periodSeparator: ' ', // The character to use to separate the time from the time period.
+ showPeriod: false, // Define whether or not to show AM/PM with selected time
+ showPeriodLabels: true, // Show the AM/PM labels on the left of the time picker
+ showLeadingZero: true, // Define whether or not to show a leading zero for hours < 10. [true/false]
+ showMinutesLeadingZero: true, // Define whether or not to show a leading zero for minutes < 10.
+ altField: '', // Selector for an alternate field to store selected time into
+ defaultTime: 'now', // Used as default time when input field is empty or for inline timePicker
+ // (set to 'now' for the current time, '' for no highlighted time)
+ myPosition: 'left top', // Position of the dialog relative to the input.
+ // see the position utility for more info : http://jqueryui.com/demos/position/
+ atPosition: 'left bottom', // Position of the input element to match
+ // Note : if the position utility is not loaded, the timepicker will attach left top to left bottom
+ //NEW: 2011-02-03
+ onHourShow: null, // callback for enabling / disabling on selectable hours ex : function(hour) { return true; }
+ onMinuteShow: null, // callback for enabling / disabling on time selection ex : function(hour,minute) { return true; }
+
+ hours: {
+ starts: 0, // first displayed hour
+ ends: 23 // last displayed hour
+ },
+ minutes: {
+ starts: 0, // first displayed minute
+ ends: 55, // last displayed minute
+ interval: 5 // interval of displayed minutes
+ },
+ rows: 4, // number of rows for the input tables, minimum 2, makes more sense if you use multiple of 2
+ // 2011-08-05 0.2.4
+ showHours: true, // display the hours section of the dialog
+ showMinutes: true, // display the minute section of the dialog
+ optionalMinutes: false, // optionally parse inputs of whole hours with minutes omitted
+
+ // buttons
+ showCloseButton: false, // shows an OK button to confirm the edit
+ showNowButton: false, // Shows the 'now' button
+ showDeselectButton: false // Shows the deselect time button
+
+ };
+ $.extend(this._defaults, this.regional['']);
+
+ this.tpDiv = $('<div id="' + this._mainDivId + '" class="ui-timepicker ui-widget ui-helper-clearfix ui-corner-all " style="display: none"></div>');
+ }
+
+ $.extend(Timepicker.prototype, {
+ /* Class name added to elements to indicate already configured with a time picker. */
+ markerClassName: 'hasTimepicker',
+
+ /* Debug logging (if enabled). */
+ log: function () {
+ if (this.debug)
+ console.log.apply('', arguments);
+ },
+
+ _widgetTimepicker: function () {
+ return this.tpDiv;
+ },
+
+ /* Override the default settings for all instances of the time picker.
+ @param settings object - the new settings to use as defaults (anonymous object)
+ @return the manager object */
+ setDefaults: function (settings) {
+ extendRemove(this._defaults, settings || {});
+ return this;
+ },
+
+ /* Attach the time picker to a jQuery selection.
+ @param target element - the target input field or division or span
+ @param settings object - the new settings to use for this time picker instance (anonymous) */
+ _attachTimepicker: function (target, settings) {
+ // check for settings on the control itself - in namespace 'time:'
+ var inlineSettings = null;
+ for (var attrName in this._defaults) {
+ var attrValue = target.getAttribute('time:' + attrName);
+ if (attrValue) {
+ inlineSettings = inlineSettings || {};
+ try {
+ inlineSettings[attrName] = eval(attrValue);
+ } catch (err) {
+ inlineSettings[attrName] = attrValue;
+ }
+ }
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ var inline = (nodeName == 'div' || nodeName == 'span');
+
+ if (!target.id) {
+ this.uuid += 1;
+ target.id = 'tp' + this.uuid;
+ }
+ var inst = this._newInst($(target), inline);
+ inst.settings = $.extend({}, settings || {}, inlineSettings || {});
+ if (nodeName == 'input') {
+ this._connectTimepicker(target, inst);
+ // init inst.hours and inst.minutes from the input value
+ this._setTimeFromField(inst);
+ } else if (inline) {
+ this._inlineTimepicker(target, inst);
+ }
+
+
+ },
+
+ /* Create a new instance object. */
+ _newInst: function (target, inline) {
+ var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
+ return {
+ id: id, input: target, // associated target
+ inline: inline, // is timepicker inline or not :
+ tpDiv: (!inline ? this.tpDiv : // presentation div
+ $('<div class="' + this._inlineClass + ' ui-timepicker ui-widget ui-helper-clearfix"></div>'))
+ };
+ },
+
+ /* Attach the time picker to an input field. */
+ _connectTimepicker: function (target, inst) {
+ var input = $(target);
+ inst.append = $([]);
+ inst.trigger = $([]);
+ if (input.hasClass(this.markerClassName)) { return; }
+ this._attachments(input, inst);
+ input.addClass(this.markerClassName).
+ keydown(this._doKeyDown).
+ keyup(this._doKeyUp).
+ bind("setData.timepicker", function (event, key, value) {
+ inst.settings[key] = value;
+ }).
+ bind("getData.timepicker", function (event, key) {
+ return this._get(inst, key);
+ });
+ $.data(target, PROP_NAME, inst);
+ },
+
+ /* Handle keystrokes. */
+ _doKeyDown: function (event) {
+ var inst = $.timepicker._getInst(event.target);
+ var handled = true;
+ inst._keyEvent = true;
+ if ($.timepicker._timepickerShowing) {
+ switch (event.keyCode) {
+ case 9: $.timepicker._hideTimepicker();
+ handled = false;
+ break; // hide on tab out
+ case 13:
+ $.timepicker._updateSelectedValue(inst);
+ $.timepicker._hideTimepicker();
+
+ return false; // don't submit the form
+ break; // select the value on enter
+ case 27: $.timepicker._hideTimepicker();
+ break; // hide on escape
+ default: handled = false;
+ }
+ }
+ else if (event.keyCode == 36 && event.ctrlKey) { // display the time picker on ctrl+home
+ $.timepicker._showTimepicker(this);
+ }
+ else {
+ handled = false;
+ }
+ if (handled) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /* Update selected time on keyUp */
+ /* Added verion 0.0.5 */
+ _doKeyUp: function (event) {
+ var inst = $.timepicker._getInst(event.target);
+ $.timepicker._setTimeFromField(inst);
+ $.timepicker._updateTimepicker(inst);
+ },
+
+ /* Make attachments based on settings. */
+ _attachments: function (input, inst) {
+ var appendText = this._get(inst, 'appendText');
+ var isRTL = this._get(inst, 'isRTL');
+ if (inst.append) { inst.append.remove(); }
+ if (appendText) {
+ inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
+ input[isRTL ? 'before' : 'after'](inst.append);
+ }
+ input.unbind('focus.timepicker', this._showTimepicker);
+ if (inst.trigger) { inst.trigger.remove(); }
+
+ var showOn = this._get(inst, 'showOn');
+ if (showOn == 'focus' || showOn == 'both') { // pop-up time picker when in the marked field
+ input.bind("focus.timepicker", this._showTimepicker);
+ }
+ if (showOn == 'button' || showOn == 'both') { // pop-up time picker when 'button' element is clicked
+ var button = this._get(inst, 'button');
+ $(button).bind("click.timepicker", function () {
+ if ($.timepicker._timepickerShowing && $.timepicker._lastInput == input[0]) { $.timepicker._hideTimepicker(); }
+ else { $.timepicker._showTimepicker(input[0]); }
+ return false;
+ });
+
+ }
+ },
+
+
+ /* Attach an inline time picker to a div. */
+ _inlineTimepicker: function(target, inst) {
+ var divSpan = $(target);
+ if (divSpan.hasClass(this.markerClassName))
+ return;
+ divSpan.addClass(this.markerClassName).append(inst.tpDiv).
+ bind("setData.timepicker", function(event, key, value){
+ inst.settings[key] = value;
+ }).bind("getData.timepicker", function(event, key){
+ return this._get(inst, key);
+ });
+ $.data(target, PROP_NAME, inst);
+
+ this._setTimeFromField(inst);
+ this._updateTimepicker(inst);
+ inst.tpDiv.show();
+ },
+
+ /* Pop-up the time picker for a given input field.
+ @param input element - the input field attached to the time picker or
+ event - if triggered by focus */
+ _showTimepicker: function (input) {
+ input = input.target || input;
+ if (input.nodeName.toLowerCase() != 'input') { input = $('input', input.parentNode)[0]; } // find from button/image trigger
+ if ($.timepicker._isDisabledTimepicker(input) || $.timepicker._lastInput == input) { return; } // already here
+
+ // fix v 0.0.8 - close current timepicker before showing another one
+ $.timepicker._hideTimepicker();
+
+ var inst = $.timepicker._getInst(input);
+ if ($.timepicker._curInst && $.timepicker._curInst != inst) {
+ $.timepicker._curInst.tpDiv.stop(true, true);
+ }
+ var beforeShow = $.timepicker._get(inst, 'beforeShow');
+ extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
+ inst.lastVal = null;
+ $.timepicker._lastInput = input;
+
+ $.timepicker._setTimeFromField(inst);
+
+ // calculate default position
+ if ($.timepicker._inDialog) { input.value = ''; } // hide cursor
+ if (!$.timepicker._pos) { // position below input
+ $.timepicker._pos = $.timepicker._findPos(input);
+ $.timepicker._pos[1] += input.offsetHeight; // add the height
+ }
+ var isFixed = false;
+ $(input).parents().each(function () {
+ isFixed |= $(this).css('position') == 'fixed';
+ return !isFixed;
+ });
+ if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
+ $.timepicker._pos[0] -= document.documentElement.scrollLeft;
+ $.timepicker._pos[1] -= document.documentElement.scrollTop;
+ }
+
+ var offset = { left: $.timepicker._pos[0], top: $.timepicker._pos[1] };
+
+ $.timepicker._pos = null;
+ // determine sizing offscreen
+ inst.tpDiv.css({ position: 'absolute', display: 'block', top: '-1000px' });
+ $.timepicker._updateTimepicker(inst);
+
+
+ // position with the ui position utility, if loaded
+ if ( ( ! inst.inline ) && ( typeof $.ui.position == 'object' ) ) {
+ inst.tpDiv.position({
+ of: inst.input,
+ my: $.timepicker._get( inst, 'myPosition' ),
+ at: $.timepicker._get( inst, 'atPosition' ),
+ // offset: $( "#offset" ).val(),
+ // using: using,
+ collision: 'flip'
+ });
+ var offset = inst.tpDiv.offset();
+ $.timepicker._pos = [offset.top, offset.left];
+ }
+
+
+ // reset clicked state
+ inst._hoursClicked = false;
+ inst._minutesClicked = false;
+
+ // fix width for dynamic number of time pickers
+ // and adjust position before showing
+ offset = $.timepicker._checkOffset(inst, offset, isFixed);
+ inst.tpDiv.css({ position: ($.timepicker._inDialog && $.blockUI ?
+ 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
+ left: offset.left + 'px', top: offset.top + 'px'
+ });
+ if ( ! inst.inline ) {
+ var showAnim = $.timepicker._get(inst, 'showAnim');
+ var duration = $.timepicker._get(inst, 'duration');
+
+ var postProcess = function () {
+ $.timepicker._timepickerShowing = true;
+ var borders = $.timepicker._getBorders(inst.tpDiv);
+ inst.tpDiv.find('iframe.ui-timepicker-cover'). // IE6- only
+ css({ left: -borders[0], top: -borders[1],
+ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
+ });
+ };
+
+ // Fixed the zIndex problem for real (I hope) - FG - v 0.2.9
+ inst.tpDiv.css('zIndex', $.timepicker._getZIndex(input) +1);
+
+ if ($.effects && $.effects[showAnim]) {
+ inst.tpDiv.show(showAnim, $.timepicker._get(inst, 'showOptions'), duration, postProcess);
+ }
+ else {
+ inst.tpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
+ }
+ if (!showAnim || !duration) { postProcess(); }
+ if (inst.input.is(':visible') && !inst.input.is(':disabled')) { inst.input.focus(); }
+ $.timepicker._curInst = inst;
+ }
+ },
+
+ // This is a copy of the zIndex function of UI core 1.8.??
+ // Copied in the timepicker to stay backward compatible.
+ _getZIndex: function (target) {
+ var elem = $( target ), position, value;
+ while ( elem.length && elem[ 0 ] !== document ) {
+ position = elem.css( "position" );
+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+ value = parseInt( elem.css( "zIndex" ), 10 );
+ if ( !isNaN( value ) && value !== 0 ) {
+ return value;
+ }
+ }
+ elem = elem.parent();
+ }
+ },
+
+ /* Generate the time picker content. */
+ _updateTimepicker: function (inst) {
+ inst.tpDiv.empty().append(this._generateHTML(inst));
+ this._rebindDialogEvents(inst);
+
+ },
+
+ _rebindDialogEvents: function (inst) {
+ var borders = $.timepicker._getBorders(inst.tpDiv),
+ self = this;
+ inst.tpDiv
+ .find('iframe.ui-timepicker-cover') // IE6- only
+ .css({ left: -borders[0], top: -borders[1],
+ width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
+ })
+ .end()
+ // after the picker html is appended bind the click & double click events (faster in IE this way
+ // then letting the browser interpret the inline events)
+ // the binding for the minute cells also exists in _updateMinuteDisplay
+ .find('.ui-timepicker-minute-cell')
+ .unbind()
+ .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
+ .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this))
+ .end()
+ .find('.ui-timepicker-hour-cell')
+ .unbind()
+ .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectHours, this))
+ .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectHours, this))
+ .end()
+ .find('.ui-timepicker td a')
+ .unbind()
+ .bind('mouseout', function () {
+ $(this).removeClass('ui-state-hover');
+ if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).removeClass('ui-timepicker-prev-hover');
+ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).removeClass('ui-timepicker-next-hover');
+ })
+ .bind('mouseover', function () {
+ if ( ! self._isDisabledTimepicker(inst.inline ? inst.tpDiv.parent()[0] : inst.input[0])) {
+ $(this).parents('.ui-timepicker-calendar').find('a').removeClass('ui-state-hover');
+ $(this).addClass('ui-state-hover');
+ if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).addClass('ui-timepicker-prev-hover');
+ if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-timepicker-next-hover');
+ }
+ })
+ .end()
+ .find('.' + this._dayOverClass + ' a')
+ .trigger('mouseover')
+ .end()
+ .find('.ui-timepicker-now').bind("click",function(e) {
+ $.timepicker.selectNow(e);
+ }).end()
+ .find('.ui-timepicker-deselect').bind("click",function(e) {
+ $.timepicker.deselectTime(e);
+ }).end()
+ .find('.ui-timepicker-close').bind("click",function(e) {
+ $.timepicker._hideTimepicker();
+ }).end();
+ },
+
+ /* Generate the HTML for the current state of the time picker. */
+ _generateHTML: function (inst) {
+
+ var h, m, row, col, html, hoursHtml, minutesHtml = '',
+ showPeriod = (this._get(inst, 'showPeriod') == true),
+ showPeriodLabels = (this._get(inst, 'showPeriodLabels') == true),
+ showLeadingZero = (this._get(inst, 'showLeadingZero') == true),
+ showHours = (this._get(inst, 'showHours') == true),
+ showMinutes = (this._get(inst, 'showMinutes') == true),
+ amPmText = this._get(inst, 'amPmText'),
+ rows = this._get(inst, 'rows'),
+ amRows = 0,
+ pmRows = 0,
+ amItems = 0,
+ pmItems = 0,
+ amFirstRow = 0,
+ pmFirstRow = 0,
+ hours = Array(),
+ hours_options = this._get(inst, 'hours'),
+ hoursPerRow = null,
+ hourCounter = 0,
+ hourLabel = this._get(inst, 'hourText'),
+ showCloseButton = this._get(inst, 'showCloseButton'),
+ closeButtonText = this._get(inst, 'closeButtonText'),
+ showNowButton = this._get(inst, 'showNowButton'),
+ nowButtonText = this._get(inst, 'nowButtonText'),
+ showDeselectButton = this._get(inst, 'showDeselectButton'),
+ deselectButtonText = this._get(inst, 'deselectButtonText'),
+ showButtonPanel = showCloseButton || showNowButton || showDeselectButton;
+
+
+
+ // prepare all hours and minutes, makes it easier to distribute by rows
+ for (h = hours_options.starts; h <= hours_options.ends; h++) {
+ hours.push (h);
+ }
+ hoursPerRow = Math.ceil(hours.length / rows); // always round up
+
+ if (showPeriodLabels) {
+ for (hourCounter = 0; hourCounter < hours.length; hourCounter++) {
+ if (hours[hourCounter] < 12) {
+ amItems++;
+ }
+ else {
+ pmItems++;
+ }
+ }
+ hourCounter = 0;
+
+ amRows = Math.floor(amItems / hours.length * rows);
+ pmRows = Math.floor(pmItems / hours.length * rows);
+
+ // assign the extra row to the period that is more densly populated
+ if (rows != amRows + pmRows) {
+ // Make sure: AM Has Items and either PM Does Not, AM has no rows yet, or AM is more dense
+ if (amItems && (!pmItems || !amRows || (pmRows && amItems / amRows >= pmItems / pmRows))) {
+ amRows++;
+ } else {
+ pmRows++;
+ }
+ }
+ amFirstRow = Math.min(amRows, 1);
+ pmFirstRow = amRows + 1;
+ hoursPerRow = Math.ceil(Math.max(amItems / amRows, pmItems / pmRows));
+ }
+
+
+ html = '<table class="ui-timepicker-table ui-widget-content ui-corner-all"><tr>';
+
+ if (showHours) {
+
+ html += '<td class="ui-timepicker-hours">' +
+ '<div class="ui-timepicker-title ui-widget-header ui-helper-clearfix ui-corner-all">' +
+ hourLabel +
+ '</div>' +
+ '<table class="ui-timepicker">';
+
+ for (row = 1; row <= rows; row++) {
+ html += '<tr>';
+ // AM
+ if (row == amFirstRow && showPeriodLabels) {
+ html += '<th rowspan="' + amRows.toString() + '" class="periods" scope="row">' + amPmText[0] + '</th>';
+ }
+ // PM
+ if (row == pmFirstRow && showPeriodLabels) {
+ html += '<th rowspan="' + pmRows.toString() + '" class="periods" scope="row">' + amPmText[1] + '</th>';
+ }
+ for (col = 1; col <= hoursPerRow; col++) {
+ if (showPeriodLabels && row < pmFirstRow && hours[hourCounter] >= 12) {
+ html += this._generateHTMLHourCell(inst, undefined, showPeriod, showLeadingZero);
+ } else {
+ html += this._generateHTMLHourCell(inst, hours[hourCounter], showPeriod, showLeadingZero);
+ hourCounter++;
+ }
+ }
+ html += '</tr>';
+ }
+ html += '</tr></table>' + // Close the hours cells table
+ '</td>'; // Close the Hour td
+ }
+
+ if (showMinutes) {
+ html += '<td class="ui-timepicker-minutes">';
+ html += this._generateHTMLMinutes(inst);
+ html += '</td>';
+ }
+
+ html += '</tr>';
+
+
+ if (showButtonPanel) {
+ var buttonPanel = '<tr><td colspan="3"><div class="ui-timepicker-buttonpane ui-widget-content">';
+ if (showNowButton) {
+ buttonPanel += '<button type="button" class="ui-timepicker-now ui-state-default ui-corner-all" '
+ + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
+ + nowButtonText + '</button>';
+ }
+ if (showDeselectButton) {
+ buttonPanel += '<button type="button" class="ui-timepicker-deselect ui-state-default ui-corner-all" '
+ + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
+ + deselectButtonText + '</button>';
+ }
+ if (showCloseButton) {
+ buttonPanel += '<button type="button" class="ui-timepicker-close ui-state-default ui-corner-all" '
+ + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
+ + closeButtonText + '</button>';
+ }
+
+ html += buttonPanel + '</div></td></tr>';
+ }
+ html += '</table>';
+
+ /* IE6 IFRAME FIX (taken from datepicker 1.5.3, fixed in 0.1.2 */
+ html += ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+ '<iframe src="javascript:false;" class="ui-timepicker-cover" frameborder="0"></iframe>' : '');
+
+ return html;
+ },
+
+ /* Special function that update the minutes selection in currently visible timepicker
+ * called on hour selection when onMinuteShow is defined */
+ _updateMinuteDisplay: function (inst) {
+ var newHtml = this._generateHTMLMinutes(inst);
+ inst.tpDiv.find('td.ui-timepicker-minutes').html(newHtml);
+ this._rebindDialogEvents(inst);
+ // after the picker html is appended bind the click & double click events (faster in IE this way
+ // then letting the browser interpret the inline events)
+ // yes I know, duplicate code, sorry
+/* .find('.ui-timepicker-minute-cell')
+ .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
+ .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this));
+*/
+
+ },
+
+ /*
+ * Generate the minutes table
+ * This is separated from the _generateHTML function because is can be called separately (when hours changes)
+ */
+ _generateHTMLMinutes: function (inst) {
+
+ var m, row, html = '',
+ rows = this._get(inst, 'rows'),
+ minutes = Array(),
+ minutes_options = this._get(inst, 'minutes'),
+ minutesPerRow = null,
+ minuteCounter = 0,
+ showMinutesLeadingZero = (this._get(inst, 'showMinutesLeadingZero') == true),
+ onMinuteShow = this._get(inst, 'onMinuteShow'),
+ minuteLabel = this._get(inst, 'minuteText');
+
+ if ( ! minutes_options.starts) {
+ minutes_options.starts = 0;
+ }
+ if ( ! minutes_options.ends) {
+ minutes_options.ends = 59;
+ }
+ for (m = minutes_options.starts; m <= minutes_options.ends; m += minutes_options.interval) {
+ minutes.push(m);
+ }
+ minutesPerRow = Math.round(minutes.length / rows + 0.49); // always round up
+
+ /*
+ * The minutes table
+ */
+ // if currently selected minute is not enabled, we have a problem and need to select a new minute.
+ if (onMinuteShow &&
+ (onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours , inst.minutes]) == false) ) {
+ // loop minutes and select first available
+ for (minuteCounter = 0; minuteCounter < minutes.length; minuteCounter += 1) {
+ m = minutes[minuteCounter];
+ if (onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours, m])) {
+ inst.minutes = m;
+ break;
+ }
+ }
+ }
+
+
+
+ html += '<div class="ui-timepicker-title ui-widget-header ui-helper-clearfix ui-corner-all">' +
+ minuteLabel +
+ '</div>' +
+ '<table class="ui-timepicker">';
+
+ minuteCounter = 0;
+ for (row = 1; row <= rows; row++) {
+ html += '<tr>';
+ while (minuteCounter < row * minutesPerRow) {
+ var m = minutes[minuteCounter];
+ var displayText = '';
+ if (m !== undefined ) {
+ displayText = (m < 10) && showMinutesLeadingZero ? "0" + m.toString() : m.toString();
+ }
+ html += this._generateHTMLMinuteCell(inst, m, displayText);
+ minuteCounter++;
+ }
+ html += '</tr>';
+ }
+
+ html += '</table>';
+
+ return html;
+ },
+
+ /* Generate the content of a "Hour" cell */
+ _generateHTMLHourCell: function (inst, hour, showPeriod, showLeadingZero) {
+
+ var displayHour = hour;
+ if ((hour > 12) && showPeriod) {
+ displayHour = hour - 12;
+ }
+ if ((displayHour == 0) && showPeriod) {
+ displayHour = 12;
+ }
+ if ((displayHour < 10) && showLeadingZero) {
+ displayHour = '0' + displayHour;
+ }
+
+ var html = "";
+ var enabled = true;
+ var onHourShow = this._get(inst, 'onHourShow'); //custom callback
+
+ if (hour == undefined) {
+ html = '<td><span class="ui-state-default ui-state-disabled">&nbsp;</span></td>';
+ return html;
+ }
+
+ if (onHourShow) {
+ enabled = onHourShow.apply((inst.input ? inst.input[0] : null), [hour]);
+ }
+
+ if (enabled) {
+ html = '<td class="ui-timepicker-hour-cell" data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" data-hour="' + hour.toString() + '">' +
+ '<a class="ui-state-default ' +
+ (hour == inst.hours ? 'ui-state-active' : '') +
+ '">' +
+ displayHour.toString() +
+ '</a></td>';
+ }
+ else {
+ html =
+ '<td>' +
+ '<span class="ui-state-default ui-state-disabled ' +
+ (hour == inst.hours ? ' ui-state-active ' : ' ') +
+ '">' +
+ displayHour.toString() +
+ '</span>' +
+ '</td>';
+ }
+ return html;
+ },
+
+ /* Generate the content of a "Hour" cell */
+ _generateHTMLMinuteCell: function (inst, minute, displayText) {
+ var html = "";
+ var enabled = true;
+ var onMinuteShow = this._get(inst, 'onMinuteShow'); //custom callback
+ if (onMinuteShow) {
+ //NEW: 2011-02-03 we should give the hour as a parameter as well!
+ enabled = onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours,minute]); //trigger callback
+ }
+
+ if (minute == undefined) {
+ html = '<td><span class="ui-state-default ui-state-disabled">&nbsp;</span></td>';
+ return html;
+ }
+
+ if (enabled) {
+ html = '<td class="ui-timepicker-minute-cell" data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" data-minute="' + minute.toString() + '" >' +
+ '<a class="ui-state-default ' +
+ (minute == inst.minutes ? 'ui-state-active' : '') +
+ '" >' +
+ displayText +
+ '</a></td>';
+ }
+ else {
+
+ html = '<td>' +
+ '<span class="ui-state-default ui-state-disabled" >' +
+ displayText +
+ '</span>' +
+ '</td>';
+ }
+ return html;
+ },
+
+
+ /* Enable the date picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _enableTimepicker: function(target) {
+ var $target = $(target),
+ target_id = $target.attr('id'),
+ inst = $.data(target, PROP_NAME);
+
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = false;
+ inst.trigger.filter('button').
+ each(function() { this.disabled = false; }).end();
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().removeClass('ui-state-disabled');
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target_id ? null : value); }); // delete entry
+ },
+
+ /* Disable the time picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _disableTimepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = true;
+
+ inst.trigger.filter('button').
+ each(function() { this.disabled = true; }).end();
+
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().addClass('ui-state-disabled');
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target ? null : value); }); // delete entry
+ this._disabledInputs[this._disabledInputs.length] = $target.attr('id');
+ },
+
+ /* Is the first field in a jQuery collection disabled as a timepicker?
+ @param target_id element - the target input field or division or span
+ @return boolean - true if disabled, false if enabled */
+ _isDisabledTimepicker: function (target_id) {
+ if ( ! target_id) { return false; }
+ for (var i = 0; i < this._disabledInputs.length; i++) {
+ if (this._disabledInputs[i] == target_id) { return true; }
+ }
+ return false;
+ },
+
+ /* Check positioning to remain on screen. */
+ _checkOffset: function (inst, offset, isFixed) {
+ var tpWidth = inst.tpDiv.outerWidth();
+ var tpHeight = inst.tpDiv.outerHeight();
+ var inputWidth = inst.input ? inst.input.outerWidth() : 0;
+ var inputHeight = inst.input ? inst.input.outerHeight() : 0;
+ var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
+ var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
+
+ offset.left -= (this._get(inst, 'isRTL') ? (tpWidth - inputWidth) : 0);
+ offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
+ offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
+
+ // now check if datepicker is showing outside window viewport - move to a better place if so.
+ offset.left -= Math.min(offset.left, (offset.left + tpWidth > viewWidth && viewWidth > tpWidth) ?
+ Math.abs(offset.left + tpWidth - viewWidth) : 0);
+ offset.top -= Math.min(offset.top, (offset.top + tpHeight > viewHeight && viewHeight > tpHeight) ?
+ Math.abs(tpHeight + inputHeight) : 0);
+
+ return offset;
+ },
+
+ /* Find an object's position on the screen. */
+ _findPos: function (obj) {
+ var inst = this._getInst(obj);
+ var isRTL = this._get(inst, 'isRTL');
+ while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
+ obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+ }
+ var position = $(obj).offset();
+ return [position.left, position.top];
+ },
+
+ /* Retrieve the size of left and top borders for an element.
+ @param elem (jQuery object) the element of interest
+ @return (number[2]) the left and top borders */
+ _getBorders: function (elem) {
+ var convert = function (value) {
+ return { thin: 1, medium: 2, thick: 3}[value] || value;
+ };
+ return [parseFloat(convert(elem.css('border-left-width'))),
+ parseFloat(convert(elem.css('border-top-width')))];
+ },
+
+
+ /* Close time picker if clicked elsewhere. */
+ _checkExternalClick: function (event) {
+ if (!$.timepicker._curInst) { return; }
+ var $target = $(event.target);
+ if ($target[0].id != $.timepicker._mainDivId &&
+ $target.parents('#' + $.timepicker._mainDivId).length == 0 &&
+ !$target.hasClass($.timepicker.markerClassName) &&
+ !$target.hasClass($.timepicker._triggerClass) &&
+ $.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
+ $.timepicker._hideTimepicker();
+ },
+
+ /* Hide the time picker from view.
+ @param input element - the input field attached to the time picker */
+ _hideTimepicker: function (input) {
+ var inst = this._curInst;
+ if (!inst || (input && inst != $.data(input, PROP_NAME))) { return; }
+ if (this._timepickerShowing) {
+ var showAnim = this._get(inst, 'showAnim');
+ var duration = this._get(inst, 'duration');
+ var postProcess = function () {
+ $.timepicker._tidyDialog(inst);
+ this._curInst = null;
+ };
+ if ($.effects && $.effects[showAnim]) {
+ inst.tpDiv.hide(showAnim, $.timepicker._get(inst, 'showOptions'), duration, postProcess);
+ }
+ else {
+ inst.tpDiv[(showAnim == 'slideDown' ? 'slideUp' :
+ (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
+ }
+ if (!showAnim) { postProcess(); }
+ var onClose = this._get(inst, 'onClose');
+ if (onClose) {
+ onClose.apply(
+ (inst.input ? inst.input[0] : null),
+ [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback
+ }
+ this._timepickerShowing = false;
+ this._lastInput = null;
+ if (this._inDialog) {
+ this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
+ if ($.blockUI) {
+ $.unblockUI();
+ $('body').append(this.tpDiv);
+ }
+ }
+ this._inDialog = false;
+ }
+ },
+
+
+
+ /* Tidy up after a dialog display. */
+ _tidyDialog: function (inst) {
+ inst.tpDiv.removeClass(this._dialogClass).unbind('.ui-timepicker');
+ },
+
+ /* Retrieve the instance data for the target control.
+ @param target element - the target input field or division or span
+ @return object - the associated instance data
+ @throws error if a jQuery problem getting data */
+ _getInst: function (target) {
+ try {
+ return $.data(target, PROP_NAME);
+ }
+ catch (err) {
+ throw 'Missing instance data for this timepicker';
+ }
+ },
+
+ /* Get a setting value, defaulting if necessary. */
+ _get: function (inst, name) {
+ return inst.settings[name] !== undefined ?
+ inst.settings[name] : this._defaults[name];
+ },
+
+ /* Parse existing time and initialise time picker. */
+ _setTimeFromField: function (inst) {
+ if (inst.input.val() == inst.lastVal) { return; }
+ var defaultTime = this._get(inst, 'defaultTime');
+
+ var timeToParse = defaultTime == 'now' ? this._getCurrentTimeRounded(inst) : defaultTime;
+ if ((inst.inline == false) && (inst.input.val() != '')) { timeToParse = inst.input.val() }
+
+ if (timeToParse instanceof Date) {
+ inst.hours = timeToParse.getHours();
+ inst.minutes = timeToParse.getMinutes();
+ } else {
+ var timeVal = inst.lastVal = timeToParse;
+ if (timeToParse == '') {
+ inst.hours = -1;
+ inst.minutes = -1;
+ } else {
+ var time = this.parseTime(inst, timeVal);
+ inst.hours = time.hours;
+ inst.minutes = time.minutes;
+ }
+ }
+
+
+ $.timepicker._updateTimepicker(inst);
+ },
+
+ /* Update or retrieve the settings for an existing time picker.
+ @param target element - the target input field or division or span
+ @param name object - the new settings to update or
+ string - the name of the setting to change or retrieve,
+ when retrieving also 'all' for all instance settings or
+ 'defaults' for all global defaults
+ @param value any - the new value for the setting
+ (omit if above is an object or to retrieve a value) */
+ _optionTimepicker: function(target, name, value) {
+ var inst = this._getInst(target);
+ if (arguments.length == 2 && typeof name == 'string') {
+ return (name == 'defaults' ? $.extend({}, $.timepicker._defaults) :
+ (inst ? (name == 'all' ? $.extend({}, inst.settings) :
+ this._get(inst, name)) : null));
+ }
+ var settings = name || {};
+ if (typeof name == 'string') {
+ settings = {};
+ settings[name] = value;
+ }
+ if (inst) {
+ if (this._curInst == inst) {
+ this._hideTimepicker();
+ }
+ extendRemove(inst.settings, settings);
+ this._updateTimepicker(inst);
+ }
+ },
+
+
+ /* Set the time for a jQuery selection.
+ @param target element - the target input field or division or span
+ @param time String - the new time */
+ _setTimeTimepicker: function(target, time) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._setTime(inst, time);
+ this._updateTimepicker(inst);
+ this._updateAlternate(inst, time);
+ }
+ },
+
+ /* Set the time directly. */
+ _setTime: function(inst, time, noChange) {
+ var origHours = inst.hours;
+ var origMinutes = inst.minutes;
+ var time = this.parseTime(inst, time);
+ inst.hours = time.hours;
+ inst.minutes = time.minutes;
+
+ if ((origHours != inst.hours || origMinutes != inst.minuts) && !noChange) {
+ inst.input.trigger('change');
+ }
+ this._updateTimepicker(inst);
+ this._updateSelectedValue(inst);
+ },
+
+ /* Return the current time, ready to be parsed, rounded to the closest 5 minute */
+ _getCurrentTimeRounded: function (inst) {
+ var currentTime = new Date(),
+ currentMinutes = currentTime.getMinutes(),
+ // round to closest 5
+ adjustedMinutes = Math.round( currentMinutes / 5 ) * 5;
+ currentTime.setMinutes(adjustedMinutes);
+ return currentTime;
+ },
+
+ /*
+ * Parse a time string into hours and minutes
+ */
+ parseTime: function (inst, timeVal) {
+ var retVal = new Object();
+ retVal.hours = -1;
+ retVal.minutes = -1;
+
+ var timeSeparator = this._get(inst, 'timeSeparator'),
+ amPmText = this._get(inst, 'amPmText'),
+ showHours = this._get(inst, 'showHours'),
+ showMinutes = this._get(inst, 'showMinutes'),
+ optionalMinutes = this._get(inst, 'optionalMinutes'),
+ showPeriod = (this._get(inst, 'showPeriod') == true),
+ p = timeVal.indexOf(timeSeparator);
+
+ // check if time separator found
+ if (p != -1) {
+ retVal.hours = parseInt(timeVal.substr(0, p), 10);
+ retVal.minutes = parseInt(timeVal.substr(p + 1), 10);
+ }
+ // check for hours only
+ else if ( (showHours) && ( !showMinutes || optionalMinutes ) ) {
+ retVal.hours = parseInt(timeVal, 10);
+ }
+ // check for minutes only
+ else if ( ( ! showHours) && (showMinutes) ) {
+ retVal.minutes = parseInt(timeVal, 10);
+ }
+
+ if (showHours) {
+ var timeValUpper = timeVal.toUpperCase();
+ if ((retVal.hours < 12) && (showPeriod) && (timeValUpper.indexOf(amPmText[1].toUpperCase()) != -1)) {
+ retVal.hours += 12;
+ }
+ // fix for 12 AM
+ if ((retVal.hours == 12) && (showPeriod) && (timeValUpper.indexOf(amPmText[0].toUpperCase()) != -1)) {
+ retVal.hours = 0;
+ }
+ }
+
+ return retVal;
+ },
+
+ selectNow: function(e) {
+
+ var id = $(e.target).attr("data-timepicker-instance-id"),
+ $target = $(id),
+ inst = this._getInst($target[0]);
+
+ //if (!inst || (input && inst != $.data(input, PROP_NAME))) { return; }
+ var currentTime = new Date();
+ inst.hours = currentTime.getHours();
+ inst.minutes = currentTime.getMinutes();
+ this._updateSelectedValue(inst);
+ this._updateTimepicker(inst);
+ this._hideTimepicker();
+ },
+
+ deselectTime: function(e) {
+ var id = $(e.target).attr("data-timepicker-instance-id"),
+ $target = $(id),
+ inst = this._getInst($target[0]);
+ inst.hours = -1;
+ inst.minutes = -1;
+ this._updateSelectedValue(inst);
+ this._hideTimepicker();
+ },
+
+
+ selectHours: function (event) {
+ var $td = $(event.currentTarget),
+ id = $td.attr("data-timepicker-instance-id"),
+ newHours = $td.attr("data-hour"),
+ fromDoubleClick = event.data.fromDoubleClick,
+ $target = $(id),
+ inst = this._getInst($target[0]),
+ showMinutes = (this._get(inst, 'showMinutes') == true);
+
+ // don't select if disabled
+ if ( $.timepicker._isDisabledTimepicker($target.attr('id')) ) { return false }
+
+ $td.parents('.ui-timepicker-hours:first').find('a').removeClass('ui-state-active');
+ $td.children('a').addClass('ui-state-active');
+ inst.hours = newHours;
+
+ // added for onMinuteShow callback
+ var onMinuteShow = this._get(inst, 'onMinuteShow');
+ if (onMinuteShow) {
+ // this will trigger a callback on selected hour to make sure selected minute is allowed.
+ this._updateMinuteDisplay(inst);
+ }
+
+ this._updateSelectedValue(inst);
+
+ inst._hoursClicked = true;
+ if ((inst._minutesClicked) || (fromDoubleClick) || (showMinutes == false)) {
+ $.timepicker._hideTimepicker();
+ }
+ // return false because if used inline, prevent the url to change to a hashtag
+ return false;
+ },
+
+ selectMinutes: function (event) {
+ var $td = $(event.currentTarget),
+ id = $td.attr("data-timepicker-instance-id"),
+ newMinutes = $td.attr("data-minute"),
+ fromDoubleClick = event.data.fromDoubleClick,
+ $target = $(id),
+ inst = this._getInst($target[0]),
+ showHours = (this._get(inst, 'showHours') == true);
+
+ // don't select if disabled
+ if ( $.timepicker._isDisabledTimepicker($target.attr('id')) ) { return false }
+
+ $td.parents('.ui-timepicker-minutes:first').find('a').removeClass('ui-state-active');
+ $td.children('a').addClass('ui-state-active');
+
+ inst.minutes = newMinutes;
+ this._updateSelectedValue(inst);
+
+ inst._minutesClicked = true;
+ if ((inst._hoursClicked) || (fromDoubleClick) || (showHours == false)) {
+ $.timepicker._hideTimepicker();
+ // return false because if used inline, prevent the url to change to a hashtag
+ return false;
+ }
+
+ // return false because if used inline, prevent the url to change to a hashtag
+ return false;
+ },
+
+ _updateSelectedValue: function (inst) {
+ var newTime = this._getParsedTime(inst);
+ if (inst.input) {
+ inst.input.val(newTime);
+ inst.input.trigger('change');
+ }
+ var onSelect = this._get(inst, 'onSelect');
+ if (onSelect) { onSelect.apply((inst.input ? inst.input[0] : null), [newTime, inst]); } // trigger custom callback
+ this._updateAlternate(inst, newTime);
+ return newTime;
+ },
+
+ /* this function process selected time and return it parsed according to instance options */
+ _getParsedTime: function(inst) {
+
+ if (inst.hours == -1 && inst.minutes == -1) {
+ return '';
+ }
+
+ if ((inst.hours < 0) || (inst.hours > 23)) { inst.hours = 12; }
+ if ((inst.minutes < 0) || (inst.minutes > 59)) { inst.minutes = 0; }
+
+ var period = "",
+ showPeriod = (this._get(inst, 'showPeriod') == true),
+ showLeadingZero = (this._get(inst, 'showLeadingZero') == true),
+ showHours = (this._get(inst, 'showHours') == true),
+ showMinutes = (this._get(inst, 'showMinutes') == true),
+ optionalMinutes = (this._get(inst, 'optionalMinutes') == true),
+ amPmText = this._get(inst, 'amPmText'),
+ selectedHours = inst.hours ? inst.hours : 0,
+ selectedMinutes = inst.minutes ? inst.minutes : 0,
+ displayHours = selectedHours ? selectedHours : 0,
+ parsedTime = '';
+
+ if (showPeriod) {
+ if (inst.hours == 0) {
+ displayHours = 12;
+ }
+ if (inst.hours < 12) {
+ period = amPmText[0];
+ }
+ else {
+ period = amPmText[1];
+ if (displayHours > 12) {
+ displayHours -= 12;
+ }
+ }
+ }
+
+ var h = displayHours.toString();
+ if (showLeadingZero && (displayHours < 10)) { h = '0' + h; }
+
+ var m = selectedMinutes.toString();
+ if (selectedMinutes < 10) { m = '0' + m; }
+
+ if (showHours) {
+ parsedTime += h;
+ }
+ if (showHours && showMinutes && (!optionalMinutes || m != 0)) {
+ parsedTime += this._get(inst, 'timeSeparator');
+ }
+ if (showMinutes && (!optionalMinutes || m != 0)) {
+ parsedTime += m;
+ }
+ if (showHours) {
+ if (period.length > 0) { parsedTime += this._get(inst, 'periodSeparator') + period; }
+ }
+
+ return parsedTime;
+ },
+
+ /* Update any alternate field to synchronise with the main field. */
+ _updateAlternate: function(inst, newTime) {
+ var altField = this._get(inst, 'altField');
+ if (altField) { // update alternate field too
+ $(altField).each(function(i,e) {
+ $(e).val(newTime);
+ });
+ }
+ },
+
+ /* This might look unused but it's called by the $.fn.timepicker function with param getTime */
+ /* added v 0.2.3 - gitHub issue #5 - Thanks edanuff */
+ _getTimeTimepicker : function(input) {
+ var inst = this._getInst(input);
+ return this._getParsedTime(inst);
+ },
+ _getHourTimepicker: function(input) {
+ var inst = this._getInst(input);
+ if ( inst == undefined) { return -1; }
+ return inst.hours;
+ },
+ _getMinuteTimepicker: function(input) {
+ var inst= this._getInst(input);
+ if ( inst == undefined) { return -1; }
+ return inst.minutes;
+ }
+
+ });
+
+
+
+ /* Invoke the timepicker functionality.
+ @param options string - a command, optionally followed by additional parameters or
+ Object - settings for attaching new timepicker functionality
+ @return jQuery object */
+ $.fn.timepicker = function (options) {
+
+ /* Initialise the time picker. */
+ if (!$.timepicker.initialized) {
+ $(document).mousedown($.timepicker._checkExternalClick).
+ find('body').append($.timepicker.tpDiv);
+ $.timepicker.initialized = true;
+ }
+
+ var otherArgs = Array.prototype.slice.call(arguments, 1);
+ if (typeof options == 'string' && (options == 'getTime' || options == 'getHour' || options == 'getMinute' ))
+ return $.timepicker['_' + options + 'Timepicker'].
+ apply($.timepicker, [this[0]].concat(otherArgs));
+ if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
+ return $.timepicker['_' + options + 'Timepicker'].
+ apply($.timepicker, [this[0]].concat(otherArgs));
+ return this.each(function () {
+ typeof options == 'string' ?
+ $.timepicker['_' + options + 'Timepicker'].
+ apply($.timepicker, [this].concat(otherArgs)) :
+ $.timepicker._attachTimepicker(this, options);
+ });
+ };
+
+ /* jQuery extend now ignores nulls! */
+ function extendRemove(target, props) {
+ $.extend(target, props);
+ for (var name in props)
+ if (props[name] == null || props[name] == undefined)
+ target[name] = props[name];
+ return target;
+ };
+
+ $.timepicker = new Timepicker(); // singleton instance
+ $.timepicker.initialized = false;
+ $.timepicker.uuid = new Date().getTime();
+ $.timepicker.version = "0.2.9";
+
+ // Workaround for #4055
+ // Add another global to avoid noConflict issues with inline event handlers
+ window['TP_jQuery_' + tpuuid] = $;
+
+})(jQuery);
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/jquery.markitup.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/jquery.markitup.js
new file mode 100644
index 0000000..8c69b78
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/jquery.markitup.js
@@ -0,0 +1,574 @@
+// ----------------------------------------------------------------------------
+// markItUp! Universal MarkUp Engine, JQuery plugin
+// v 1.1.x
+// Dual licensed under the MIT and GPL licenses.
+// ----------------------------------------------------------------------------
+// Copyright (C) 2007-2010 Jay Salvat
+// http://markitup.jaysalvat.com/
+// ----------------------------------------------------------------------------
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+// ----------------------------------------------------------------------------
+(function($) {
+ $.fn.markItUp = function(settings, extraSettings) {
+ var options, ctrlKey, shiftKey, altKey;
+ ctrlKey = shiftKey = altKey = false;
+
+ options = { id: '',
+ nameSpace: '',
+ root: '',
+ previewInWindow: '', // 'width=800, height=600, resizable=yes, scrollbars=yes'
+ previewAutoRefresh: true,
+ previewPosition: 'after',
+ previewTemplatePath: '~/templates/preview.html',
+ previewParserPath: '',
+ previewParserVar: 'data',
+ resizeHandle: true,
+ beforeInsert: '',
+ afterInsert: '',
+ onEnter: {},
+ onShiftEnter: {},
+ onCtrlEnter: {},
+ onTab: {},
+ markupSet: [ { /* set */ } ]
+ };
+ $.extend(options, settings, extraSettings);
+
+ // compute markItUp! path
+ if (!options.root) {
+ $('script').each(function(a, tag) {
+ miuScript = $(tag).get(0).src.match(/(.*)jquery\.markitup(\.pack)?\.js$/);
+ if (miuScript !== null) {
+ options.root = miuScript[1];
+ }
+ });
+ }
+
+ return this.each(function() {
+ var $$, textarea, levels, scrollPosition, caretPosition, caretOffset,
+ clicked, hash, header, footer, previewWindow, template, iFrame, abort;
+ $$ = $(this);
+ textarea = this;
+ levels = [];
+ abort = false;
+ scrollPosition = caretPosition = 0;
+ caretOffset = -1;
+
+ options.previewParserPath = localize(options.previewParserPath);
+ options.previewTemplatePath = localize(options.previewTemplatePath);
+
+ // apply the computed path to ~/
+ function localize(data, inText) {
+ if (inText) {
+ return data.replace(/("|')~\//g, "$1"+options.root);
+ }
+ return data.replace(/^~\//, options.root);
+ }
+
+ // init and build editor
+ function init() {
+ id = ''; nameSpace = '';
+ if (options.id) {
+ id = 'id="'+options.id+'"';
+ } else if ($$.attr("id")) {
+ id = 'id="markItUp'+($$.attr("id").substr(0, 1).toUpperCase())+($$.attr("id").substr(1))+'"';
+
+ }
+ if (options.nameSpace) {
+ nameSpace = 'class="'+options.nameSpace+'"';
+ }
+ $$.wrap('<div '+nameSpace+'></div>');
+ $$.wrap('<div '+id+' class="markItUp"></div>');
+ $$.wrap('<div class="markItUpContainer"></div>');
+ $$.addClass("markItUpEditor");
+
+ // add the header before the textarea
+ header = $('<div class="markItUpHeader"></div>').insertBefore($$);
+ $(dropMenus(options.markupSet)).appendTo(header);
+
+ // add the footer after the textarea
+ footer = $('<div class="markItUpFooter"></div>').insertAfter($$);
+
+ // add the resize handle after textarea
+ if (options.resizeHandle === true && $.browser.safari !== true) {
+ resizeHandle = $('<div class="markItUpResizeHandle"></div>')
+ .insertAfter($$)
+ .bind("mousedown", function(e) {
+ var h = $$.height(), y = e.clientY, mouseMove, mouseUp;
+ mouseMove = function(e) {
+ $$.css("height", Math.max(20, e.clientY+h-y)+"px");
+ return false;
+ };
+ mouseUp = function(e) {
+ $("html").unbind("mousemove", mouseMove).unbind("mouseup", mouseUp);
+ return false;
+ };
+ $("html").bind("mousemove", mouseMove).bind("mouseup", mouseUp);
+ });
+ footer.append(resizeHandle);
+ }
+
+ // listen key events
+ $$.keydown(keyPressed).keyup(keyPressed);
+
+ // bind an event to catch external calls
+ $$.bind("insertion", function(e, settings) {
+ if (settings.target !== false) {
+ get();
+ }
+ if (textarea === $.markItUp.focused) {
+ markup(settings);
+ }
+ });
+
+ // remember the last focus
+ $$.focus(function() {
+ $.markItUp.focused = this;
+ });
+ }
+
+ // recursively build header with dropMenus from markupset
+ function dropMenus(markupSet) {
+ var ul = $('<ul></ul>'), i = 0;
+ $('li:hover > ul', ul).css('display', 'block');
+ $.each(markupSet, function() {
+ var button = this, t = '', title, li, j;
+ title = (button.key) ? (button.name||'')+' [Ctrl+'+button.key+']' : (button.name||'');
+ key = (button.key) ? 'accesskey="'+button.key+'"' : '';
+ if (button.separator) {
+ li = $('<li class="markItUpSeparator">'+(button.separator||'')+'</li>').appendTo(ul);
+ } else {
+ i++;
+ for (j = levels.length -1; j >= 0; j--) {
+ t += levels[j]+"-";
+ }
+ li = $('<li class="markItUpButton markItUpButton'+t+(i)+' '+(button.className||'')+'"><a href="" '+key+' title="'+title+'">'+(button.name||'')+'</a></li>')
+ .bind("contextmenu", function() { // prevent contextmenu on mac and allow ctrl+click
+ return false;
+ }).click(function() {
+ return false;
+ }).bind("focusin", function(){
+ $$.focus();
+ }).mousedown(function() {
+ if (button.call) {
+ eval(button.call)();
+ }
+ setTimeout(function() { markup(button) },1);
+ return false;
+ }).hover(function() {
+ $('> ul', this).show();
+ $(document).one('click', function() { // close dropmenu if click outside
+ $('ul ul', header).hide();
+ }
+ );
+ }, function() {
+ $('> ul', this).hide();
+ }
+ ).appendTo(ul);
+ if (button.dropMenu) {
+ levels.push(i);
+ $(li).addClass('markItUpDropMenu').append(dropMenus(button.dropMenu));
+ }
+ }
+ });
+ levels.pop();
+ return ul;
+ }
+
+ // markItUp! markups
+ function magicMarkups(string) {
+ if (string) {
+ string = string.toString();
+ string = string.replace(/\(\!\(([\s\S]*?)\)\!\)/g,
+ function(x, a) {
+ var b = a.split('|!|');
+ if (altKey === true) {
+ return (b[1] !== undefined) ? b[1] : b[0];
+ } else {
+ return (b[1] === undefined) ? "" : b[0];
+ }
+ }
+ );
+ // [![prompt]!], [![prompt:!:value]!]
+ string = string.replace(/\[\!\[([\s\S]*?)\]\!\]/g,
+ function(x, a) {
+ var b = a.split(':!:');
+ if (abort === true) {
+ return false;
+ }
+ value = prompt(b[0], (b[1]) ? b[1] : '');
+ if (value === null) {
+ abort = true;
+ }
+ return value;
+ }
+ );
+ return string;
+ }
+ return "";
+ }
+
+ // prepare action
+ function prepare(action) {
+ if ($.isFunction(action)) {
+ action = action(hash);
+ }
+ return magicMarkups(action);
+ }
+
+ // build block to insert
+ function build(string) {
+ var openWith = prepare(clicked.openWith);
+ var placeHolder = prepare(clicked.placeHolder);
+ var replaceWith = prepare(clicked.replaceWith);
+ var closeWith = prepare(clicked.closeWith);
+ if (replaceWith !== "") {
+ block = openWith + replaceWith + closeWith;
+ } else if (selection === '' && placeHolder !== '') {
+ block = openWith + placeHolder + closeWith;
+ } else {
+ string = string || selection;
+ if (string.match(/ $/)) {
+ block = openWith + string.replace(/ $/, '') + closeWith + ' ';
+ } else {
+ block = openWith + string + closeWith;
+ }
+ }
+ return { block:block,
+ openWith:openWith,
+ replaceWith:replaceWith,
+ placeHolder:placeHolder,
+ closeWith:closeWith
+ };
+ }
+
+ // define markup to insert
+ function markup(button) {
+ var len, j, n, i;
+ hash = clicked = button;
+ get();
+
+ $.extend(hash, { line:"",
+ root:options.root,
+ textarea:textarea,
+ selection:(selection||''),
+ caretPosition:caretPosition,
+ ctrlKey:ctrlKey,
+ shiftKey:shiftKey,
+ altKey:altKey
+ }
+ );
+ // callbacks before insertion
+ prepare(options.beforeInsert);
+ prepare(clicked.beforeInsert);
+ if (ctrlKey === true && shiftKey === true) {
+ prepare(clicked.beforeMultiInsert);
+ }
+ $.extend(hash, { line:1 });
+
+ if (ctrlKey === true && shiftKey === true) {
+ lines = selection.split(/\r?\n/);
+ for (j = 0, n = lines.length, i = 0; i < n; i++) {
+ if ($.trim(lines[i]) !== '') {
+ $.extend(hash, { line:++j, selection:lines[i] } );
+ lines[i] = build(lines[i]).block;
+ } else {
+ lines[i] = "";
+ }
+ }
+ string = { block:lines.join('\n')};
+ start = caretPosition;
+ len = string.block.length + (($.browser.opera) ? n-1 : 0);
+ } else if (ctrlKey === true) {
+ string = build(selection);
+ start = caretPosition + string.openWith.length;
+ len = string.block.length - string.openWith.length - string.closeWith.length;
+ len = len - (string.block.match(/ $/) ? 1 : 0);
+ len -= fixIeBug(string.block);
+ } else if (shiftKey === true) {
+ string = build(selection);
+ start = caretPosition;
+ len = string.block.length;
+ len -= fixIeBug(string.block);
+ } else {
+ string = build(selection);
+ start = caretPosition + string.block.length ;
+ len = 0;
+ start -= fixIeBug(string.block);
+ }
+ if ((selection === '' && string.replaceWith === '')) {
+ caretOffset += fixOperaBug(string.block);
+
+ start = caretPosition + string.openWith.length;
+ len = string.block.length - string.openWith.length - string.closeWith.length;
+
+ caretOffset = $$.val().substring(caretPosition, $$.val().length).length;
+ caretOffset -= fixOperaBug($$.val().substring(0, caretPosition));
+ }
+ $.extend(hash, { caretPosition:caretPosition, scrollPosition:scrollPosition } );
+
+ if (string.block !== selection && abort === false) {
+ insert(string.block);
+ set(start, len);
+ } else {
+ caretOffset = -1;
+ }
+ get();
+
+ $.extend(hash, { line:'', selection:selection });
+
+ // callbacks after insertion
+ if (ctrlKey === true && shiftKey === true) {
+ prepare(clicked.afterMultiInsert);
+ }
+ prepare(clicked.afterInsert);
+ prepare(options.afterInsert);
+
+ // refresh preview if opened
+ if (previewWindow && options.previewAutoRefresh) {
+ refreshPreview();
+ }
+
+ // reinit keyevent
+ shiftKey = altKey = ctrlKey = abort = false;
+ }
+
+ // Substract linefeed in Opera
+ function fixOperaBug(string) {
+ if ($.browser.opera) {
+ return string.length - string.replace(/\n*/g, '').length;
+ }
+ return 0;
+ }
+ // Substract linefeed in IE
+ function fixIeBug(string) {
+ if ($.browser.msie) {
+ return string.length - string.replace(/\r/g, '').length;
+ }
+ return 0;
+ }
+
+ // add markup
+ function insert(block) {
+ if (document.selection) {
+ var newSelection = document.selection.createRange();
+ newSelection.text = block;
+ } else {
+ textarea.value = textarea.value.substring(0, caretPosition) + block + textarea.value.substring(caretPosition + selection.length, textarea.value.length);
+ }
+ }
+
+ // set a selection
+ function set(start, len) {
+ if (textarea.createTextRange){
+ // quick fix to make it work on Opera 9.5
+ if ($.browser.opera && $.browser.version >= 9.5 && len == 0) {
+ return false;
+ }
+ range = textarea.createTextRange();
+ range.collapse(true);
+ range.moveStart('character', start);
+ range.moveEnd('character', len);
+ range.select();
+ } else if (textarea.setSelectionRange ){
+ textarea.setSelectionRange(start, start + len);
+ }
+ textarea.scrollTop = scrollPosition;
+ textarea.focus();
+ }
+
+ // get the selection
+ function get() {
+ textarea.focus();
+
+ scrollPosition = textarea.scrollTop;
+ if (document.selection) {
+ selection = document.selection;
+ if ($.browser.msie) { // ie
+ var range = selection.createRange();
+ var stored_range = range.duplicate();
+ stored_range.moveToElementText(textarea);
+ stored_range.setEndPoint('EndToEnd', range);
+ var s = stored_range.text.length - range.text.length;
+
+ caretPosition = s - (textarea.value.substr(0, s).length - textarea.value.substr(0, s).replace(/\r/g, '').length);
+ selection = range.text;
+ } else { // opera
+ caretPosition = textarea.selectionStart;
+ }
+ } else { // gecko & webkit
+ caretPosition = textarea.selectionStart;
+ selection = textarea.value.substring(caretPosition, textarea.selectionEnd);
+ }
+ return selection;
+ }
+
+ // open preview window
+ function preview() {
+ if (!previewWindow || previewWindow.closed) {
+ if (options.previewInWindow) {
+ previewWindow = window.open('', 'preview', options.previewInWindow);
+ $(window).unload(function() {
+ previewWindow.close();
+ });
+ } else {
+ iFrame = $('<iframe class="markItUpPreviewFrame"></iframe>');
+ if (options.previewPosition == 'after') {
+ iFrame.insertAfter(footer);
+ } else {
+ iFrame.insertBefore(header);
+ }
+ previewWindow = iFrame[iFrame.length - 1].contentWindow || frame[iFrame.length - 1];
+ }
+ } else if (altKey === true) {
+ if (iFrame) {
+ iFrame.remove();
+ } else {
+ previewWindow.close();
+ }
+ previewWindow = iFrame = false;
+ }
+ if (!options.previewAutoRefresh) {
+ refreshPreview();
+ }
+ if (options.previewInWindow) {
+ previewWindow.focus();
+ }
+ }
+
+ // refresh Preview window
+ function refreshPreview() {
+ renderPreview();
+ }
+
+ function renderPreview() {
+ var phtml;
+ if (options.previewParserPath !== '') {
+ $.ajax({
+ type: 'POST',
+ dataType: 'text',
+ global: false,
+ url: options.previewParserPath,
+ data: options.previewParserVar+'='+encodeURIComponent($$.val()),
+ success: function(data) {
+ writeInPreview( localize(data, 1) );
+ }
+ });
+ } else {
+ if (!template) {
+ $.ajax({
+ url: options.previewTemplatePath,
+ dataType: 'text',
+ global: false,
+ success: function(data) {
+ writeInPreview( localize(data, 1).replace(/<!-- content -->/g, $$.val()) );
+ }
+ });
+ }
+ }
+ return false;
+ }
+
+ function writeInPreview(data) {
+ if (previewWindow.document) {
+ try {
+ sp = previewWindow.document.documentElement.scrollTop
+ } catch(e) {
+ sp = 0;
+ }
+ previewWindow.document.open();
+ previewWindow.document.write(data);
+ previewWindow.document.close();
+ previewWindow.document.documentElement.scrollTop = sp;
+ }
+ }
+
+ // set keys pressed
+ function keyPressed(e) {
+ shiftKey = e.shiftKey;
+ altKey = e.altKey;
+ ctrlKey = (!(e.altKey && e.ctrlKey)) ? e.ctrlKey : false;
+
+ if (e.type === 'keydown') {
+ if (ctrlKey === true) {
+ li = $("a[accesskey="+String.fromCharCode(e.keyCode)+"]", header).parent('li');
+ if (li.length !== 0) {
+ ctrlKey = false;
+ setTimeout(function() {
+ li.triggerHandler('mousedown');
+ },1);
+ return false;
+ }
+ }
+ if (e.keyCode === 13 || e.keyCode === 10) { // Enter key
+ if (ctrlKey === true) { // Enter + Ctrl
+ ctrlKey = false;
+ markup(options.onCtrlEnter);
+ return options.onCtrlEnter.keepDefault;
+ } else if (shiftKey === true) { // Enter + Shift
+ shiftKey = false;
+ markup(options.onShiftEnter);
+ return options.onShiftEnter.keepDefault;
+ } else { // only Enter
+ markup(options.onEnter);
+ return options.onEnter.keepDefault;
+ }
+ }
+ if (e.keyCode === 9) { // Tab key
+ if (shiftKey == true || ctrlKey == true || altKey == true) {
+ return false;
+ }
+ if (caretOffset !== -1) {
+ get();
+ caretOffset = $$.val().length - caretOffset;
+ set(caretOffset, 0);
+ caretOffset = -1;
+ return false;
+ } else {
+ markup(options.onTab);
+ return options.onTab.keepDefault;
+ }
+ }
+ }
+ }
+
+ init();
+ });
+ };
+
+ $.fn.markItUpRemove = function() {
+ return this.each(function() {
+ var $$ = $(this).unbind().removeClass('markItUpEditor');
+ $$.parent('div').parent('div.markItUp').parent('div').replaceWith($$);
+ }
+ );
+ };
+
+ $.markItUp = function(settings) {
+ var options = { target:false };
+ $.extend(options, settings);
+ if (options.target) {
+ return $(options.target).each(function() {
+ $(this).focus();
+ $(this).trigger('insertion', [options]);
+ });
+ } else {
+ $('textarea').trigger('insertion', [options]);
+ }
+ };
+})(jQuery);
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/bold.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/bold.png
new file mode 100644
index 0000000..889ae80
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/bold.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/clean.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/clean.png
new file mode 100644
index 0000000..7e7cefb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/clean.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h1.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h1.png
new file mode 100644
index 0000000..9c122e9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h1.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h2.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h2.png
new file mode 100644
index 0000000..fbd8765
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h2.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h3.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h3.png
new file mode 100644
index 0000000..c7836cf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h3.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h4.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h4.png
new file mode 100644
index 0000000..4e929ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h4.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h5.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h5.png
new file mode 100644
index 0000000..30cabeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h5.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h6.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h6.png
new file mode 100644
index 0000000..058170a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/h6.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/image.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/image.png
new file mode 100644
index 0000000..fc3c393
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/image.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/italic.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/italic.png
new file mode 100644
index 0000000..8482ac8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/italic.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/link.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/link.png
new file mode 100644
index 0000000..25eacb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/link.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-bullet.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-bullet.png
new file mode 100644
index 0000000..4a8672b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-bullet.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-item.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-item.png
new file mode 100644
index 0000000..8cb4d69
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-item.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-numeric.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-numeric.png
new file mode 100644
index 0000000..33b0b8d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/list-numeric.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/paragraph.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/paragraph.png
new file mode 100644
index 0000000..95704fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/paragraph.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/picture.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/picture.png
new file mode 100644
index 0000000..4a158fe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/picture.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/preview.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/preview.png
new file mode 100644
index 0000000..a9925a0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/preview.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/stroke.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/stroke.png
new file mode 100644
index 0000000..612058a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/images/stroke.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/set.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/set.js
new file mode 100644
index 0000000..1474286
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/set.js
@@ -0,0 +1,38 @@
+// ----------------------------------------------------------------------------
+// markItUp!
+// ----------------------------------------------------------------------------
+// Copyright (C) 2008 Jay Salvat
+// http://markitup.jaysalvat.com/
+// ----------------------------------------------------------------------------
+// Html tags
+// http://en.wikipedia.org/wiki/html
+// ----------------------------------------------------------------------------
+// Basic set. Feel free to add more tags
+// ----------------------------------------------------------------------------
+mySettings = {
+ onShiftEnter: {keepDefault:false, replaceWith:'<br />\n'},
+ onCtrlEnter: {keepDefault:false, openWith:'\n<p>', closeWith:'</p>\n'},
+ onTab: {keepDefault:false, openWith:' '},
+ markupSet: [
+ {name:'Heading 1', key:'1', openWith:'<h1(!( class="[![Class]!]")!)>', closeWith:'</h1>', placeHolder:'Your title here...' },
+ {name:'Heading 2', key:'2', openWith:'<h2(!( class="[![Class]!]")!)>', closeWith:'</h2>', placeHolder:'Your title here...' },
+ {name:'Heading 3', key:'3', openWith:'<h3(!( class="[![Class]!]")!)>', closeWith:'</h3>', placeHolder:'Your title here...' },
+ {name:'Heading 4', key:'4', openWith:'<h4(!( class="[![Class]!]")!)>', closeWith:'</h4>', placeHolder:'Your title here...' },
+ {name:'Heading 5', key:'5', openWith:'<h5(!( class="[![Class]!]")!)>', closeWith:'</h5>', placeHolder:'Your title here...' },
+ {name:'Heading 6', key:'6', openWith:'<h6(!( class="[![Class]!]")!)>', closeWith:'</h6>', placeHolder:'Your title here...' },
+ {name:'Paragraph', openWith:'<p(!( class="[![Class]!]")!)>', closeWith:'</p>' },
+ {separator:'---------------' },
+ {name:'Bold', key:'B', openWith:'(!(<strong>|!|<b>)!)', closeWith:'(!(</strong>|!|</b>)!)' },
+ {name:'Italic', key:'I', openWith:'(!(<em>|!|<i>)!)', closeWith:'(!(</em>|!|</i>)!)' },
+ {name:'Stroke through', key:'S', openWith:'<del>', closeWith:'</del>' },
+ {separator:'---------------' },
+ {name:'Ul', openWith:'<ul>\n', closeWith:'</ul>\n' },
+ {name:'Ol', openWith:'<ol>\n', closeWith:'</ol>\n' },
+ {name:'Li', openWith:'<li>', closeWith:'</li>' },
+ {separator:'---------------' },
+ {name:'Picture', key:'P', replaceWith:'<img src="[![Source:!:http://]!]" alt="[![Alternative text]!]" />' },
+ {name:'Link', key:'L', openWith:'<a href="[![Link:!:http://]!]"(!( title="[![Title]!]")!)>', closeWith:'</a>', placeHolder:'Your text to link...' },
+ {separator:'---------------' },
+ {name:'Clean', className:'clean', replaceWith:function(markitup) { return markitup.selection.replace(/<(.*?)>/g, "") } }
+ ]
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/style.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/style.css
new file mode 100644
index 0000000..817e503
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/html/style.css
@@ -0,0 +1,59 @@
+/* -------------------------------------------------------------------
+// markItUp!
+// By Jay Salvat - http://markitup.jaysalvat.com/
+// ------------------------------------------------------------------*/
+.markItUp .markItUpButton1 a {
+ background-image:url(images/h1.png);
+}
+.markItUp .markItUpButton2 a {
+ background-image:url(images/h2.png);
+}
+.markItUp .markItUpButton3 a {
+ background-image:url(images/h3.png);
+}
+.markItUp .markItUpButton4 a {
+ background-image:url(images/h4.png);
+}
+.markItUp .markItUpButton5 a {
+ background-image:url(images/h5.png);
+}
+.markItUp .markItUpButton6 a {
+ background-image:url(images/h6.png);
+}
+.markItUp .markItUpButton7 a {
+ background-image:url(images/paragraph.png);
+}
+
+.markItUp .markItUpButton8 a {
+ background-image:url(images/bold.png);
+}
+.markItUp .markItUpButton9 a {
+ background-image:url(images/italic.png);
+}
+.markItUp .markItUpButton10 a {
+ background-image:url(images/stroke.png);
+}
+
+.markItUp .markItUpButton11 a {
+ background-image:url(images/list-bullet.png);
+}
+.markItUp .markItUpButton12 a {
+ background-image:url(images/list-numeric.png);
+}
+.markItUp .markItUpButton13 a {
+ background-image:url(images/list-item.png);
+}
+
+.markItUp .markItUpButton14 a {
+ background-image:url(images/picture.png);
+}
+.markItUp .markItUpButton15 a {
+ background-image:url(images/link.png);
+}
+
+.markItUp .clean a {
+ background-image:url(images/clean.png);
+}
+.markItUp .preview a {
+ background-image:url(images/preview.png);
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/bold.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/bold.png
new file mode 100644
index 0000000..889ae80
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/bold.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/code.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/code.png
new file mode 100644
index 0000000..63fe6ce
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/code.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h1.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h1.png
new file mode 100644
index 0000000..9c122e9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h1.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h2.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h2.png
new file mode 100644
index 0000000..fbd8765
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h2.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h3.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h3.png
new file mode 100644
index 0000000..c7836cf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h3.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h4.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h4.png
new file mode 100644
index 0000000..4e929ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h4.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h5.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h5.png
new file mode 100644
index 0000000..30cabeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h5.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h6.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h6.png
new file mode 100644
index 0000000..058170a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/h6.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/italic.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/italic.png
new file mode 100644
index 0000000..8482ac8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/italic.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/link.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/link.png
new file mode 100644
index 0000000..25eacb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/link.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/list-bullet.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/list-bullet.png
new file mode 100644
index 0000000..4a8672b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/list-bullet.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/list-numeric.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/list-numeric.png
new file mode 100644
index 0000000..33b0b8d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/list-numeric.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/picture.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/picture.png
new file mode 100644
index 0000000..4a158fe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/picture.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/preview.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/preview.png
new file mode 100644
index 0000000..a9925a0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/preview.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/quotes.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/quotes.png
new file mode 100644
index 0000000..e54ebeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/images/quotes.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/set.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/set.js
new file mode 100644
index 0000000..7d87ef7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/set.js
@@ -0,0 +1,49 @@
+// -------------------------------------------------------------------
+// markItUp!
+// -------------------------------------------------------------------
+// Copyright (C) 2008 Jay Salvat
+// http://markitup.jaysalvat.com/
+// -------------------------------------------------------------------
+// MarkDown tags example
+// http://en.wikipedia.org/wiki/Markdown
+// http://daringfireball.net/projects/markdown/
+// -------------------------------------------------------------------
+// Feel free to add more tags
+// -------------------------------------------------------------------
+mySettings = {
+ onShiftEnter: {keepDefault:false, openWith:'\n\n'},
+ markupSet: [
+ {name:'Heading 1', key:'1', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '=') } },
+ {name:'Heading 2', key:'2', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '-') } },
+ {name:'Heading 3', key:'3', openWith:'### ', placeHolder:'Your title here...' },
+ {name:'Heading 4', key:'4', openWith:'#### ', placeHolder:'Your title here...' },
+ {name:'Heading 5', key:'5', openWith:'##### ', placeHolder:'Your title here...' },
+ {name:'Heading 6', key:'6', openWith:'###### ', placeHolder:'Your title here...' },
+ {separator:'---------------' },
+ {name:'Bold', key:'B', openWith:'**', closeWith:'**'},
+ {name:'Italic', key:'I', openWith:'_', closeWith:'_'},
+ {separator:'---------------' },
+ {name:'Bulleted List', openWith:'- ' },
+ {name:'Numeric List', openWith:function(markItUp) {
+ return markItUp.line+'. ';
+ }},
+ {separator:'---------------' },
+ {name:'Picture', key:'P', replaceWith:'![[![Alternative text]!]]([![Url:!:http://]!] "[![Title]!]")'},
+ {name:'Link', key:'L', openWith:'[', closeWith:']([![Url:!:http://]!] "[![Title]!]")', placeHolder:'Your text to link here...' },
+ {separator:'---------------'},
+ {name:'Quotes', openWith:'> '},
+ {name:'Code Block / Code', openWith:'(!(\t|!|`)!)', closeWith:'(!(`)!)'}
+ ]
+}
+
+// mIu nameSpace to avoid conflict.
+miu = {
+ markdownTitle: function(markItUp, char) {
+ heading = '';
+ n = $.trim(markItUp.selection||markItUp.placeHolder).length;
+ for(i = 0; i < n; i++) {
+ heading += char;
+ }
+ return '\n'+heading;
+ }
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/style.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/style.css
new file mode 100644
index 0000000..03c3aea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/markdown/style.css
@@ -0,0 +1,54 @@
+/* -------------------------------------------------------------------
+// markItUp!
+// By Jay Salvat - http://markitup.jaysalvat.com/
+// ------------------------------------------------------------------*/
+.markItUp .markItUpButton1 a {
+ background-image:url(images/h1.png);
+}
+.markItUp .markItUpButton2 a {
+ background-image:url(images/h2.png);
+}
+.markItUp .markItUpButton3 a {
+ background-image:url(images/h3.png);
+}
+.markItUp .markItUpButton4 a {
+ background-image:url(images/h4.png);
+}
+.markItUp .markItUpButton5 a {
+ background-image:url(images/h5.png);
+}
+.markItUp .markItUpButton6 a {
+ background-image:url(images/h6.png);
+}
+
+.markItUp .markItUpButton7 a {
+ background-image:url(images/bold.png);
+}
+.markItUp .markItUpButton8 a {
+ background-image:url(images/italic.png);
+}
+
+.markItUp .markItUpButton9 a {
+ background-image:url(images/list-bullet.png);
+}
+.markItUp .markItUpButton10 a {
+ background-image:url(images/list-numeric.png);
+}
+
+.markItUp .markItUpButton11 a {
+ background-image:url(images/picture.png);
+}
+.markItUp .markItUpButton12 a {
+ background-image:url(images/link.png);
+}
+
+.markItUp .markItUpButton13 a {
+ background-image:url(images/quotes.png);
+}
+.markItUp .markItUpButton14 a {
+ background-image:url(images/code.png);
+}
+
+.markItUp .preview a {
+ background-image:url(images/preview.png);
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/bold.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/bold.png
new file mode 100644
index 0000000..889ae80
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/bold.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/code.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/code.png
new file mode 100644
index 0000000..63fe6ce
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/code.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h1.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h1.png
new file mode 100644
index 0000000..9c122e9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h1.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h2.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h2.png
new file mode 100644
index 0000000..fbd8765
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h2.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h3.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h3.png
new file mode 100644
index 0000000..c7836cf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h3.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h4.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h4.png
new file mode 100644
index 0000000..4e929ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h4.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h5.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h5.png
new file mode 100644
index 0000000..30cabeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/h5.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/italic.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/italic.png
new file mode 100644
index 0000000..8482ac8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/italic.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/link.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/link.png
new file mode 100644
index 0000000..25eacb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/link.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/list-bullet.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/list-bullet.png
new file mode 100644
index 0000000..4a8672b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/list-bullet.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/list-numeric.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/list-numeric.png
new file mode 100644
index 0000000..33b0b8d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/list-numeric.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/picture.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/picture.png
new file mode 100644
index 0000000..4a158fe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/picture.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/preview.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/preview.png
new file mode 100644
index 0000000..a9925a0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/preview.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/quotes.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/quotes.png
new file mode 100644
index 0000000..e54ebeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/images/quotes.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/set.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/set.js
new file mode 100644
index 0000000..b468ae8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/set.js
@@ -0,0 +1,48 @@
+// -------------------------------------------------------------------
+// markItUp!
+// -------------------------------------------------------------------
+// Copyright (C) 2011 Florent Gallaire <fgallaire@gmail.com>
+// License GNU GPLv3 or any later version.
+// Copyright (C) 2008 Jay Salvat
+// http://markitup.jaysalvat.com/
+// -------------------------------------------------------------------
+// ReStrucuredText tags example
+// http://docutils.sourceforge.net/docs/user/rst/quickref.html
+// http://docutils.sourceforge.net/docs/user/rst/quickstart.html
+// -------------------------------------------------------------------
+// Feel free to add more tags
+// -------------------------------------------------------------------
+mySettings = {
+ onShiftEnter: {keepDefault:false, replaceWith:'\n\n'},
+ markupSet: [
+ {name:'Heading 1', key:'1', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '*') } },
+ {name:'Heading 2', key:'2', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '=') } },
+ {name:'Heading 3', key:'3', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '-') } },
+ {name:'Heading 4', key:'4', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '^') } },
+ {name:'Heading 5', key:'5', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '"') } },
+ {separator:'---------------' },
+ {name:'Bold', key:'B', openWith:'**', closeWith:'**'},
+ {name:'Italic', key:'I', openWith:'*', closeWith:'*'},
+ {separator:'---------------' },
+ {name:'Bulleted list', openWith:'- '},
+ {name:'Numeric list', openWith:'# '},
+ {separator:'---------------' },
+ {name:'Picture', key:'P', openWith:'\n\n.. image:: ', closeWith:'\n\n', placeHolder:'Your picture here...'},
+ {name:'Link', key:'L', openWith:'`', closeWith:' [![Link:!:http://]!]`_', placeHolder:'Your text to link here...'},
+ {separator:'---------------'},
+ {name:'Quote', openWith:'\t'},
+ {name:'Code', openWith:'``', closeWith:'``'}
+ ]
+}
+
+// mIu nameSpace to avoid conflict.
+miu = {
+ markdownTitle: function(markItUp, char) {
+ heading = '';
+ n = $.trim(markItUp.selection||markItUp.placeHolder).length;
+ for(i = 0; i < n; i++) {
+ heading += char;
+ }
+ return '\n'+heading;
+ }
+}
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/style.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/style.css
new file mode 100644
index 0000000..3da1a52
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/restructuredtext/style.css
@@ -0,0 +1,53 @@
+/* -------------------------------------------------------------------
+// Copyright (C) 2011 Florent Gallaire <fgallaire@gmail.com>
+// License GNU GPLv3 or any later version.
+// markItUp!
+// By Jay Salvat - http://markitup.jaysalvat.com/
+// ------------------------------------------------------------------*/
+.markItUp .markItUpButton1 a {
+ background-image:url(images/h1.png);
+}
+.markItUp .markItUpButton2 a {
+ background-image:url(images/h2.png);
+}
+.markItUp .markItUpButton3 a {
+ background-image:url(images/h3.png);
+}
+.markItUp .markItUpButton4 a {
+ background-image:url(images/h4.png);
+}
+.markItUp .markItUpButton5 a {
+ background-image:url(images/h5.png);
+}
+
+.markItUp .markItUpButton6 a {
+ background-image:url(images/bold.png);
+}
+.markItUp .markItUpButton7 a {
+ background-image:url(images/italic.png);
+}
+
+.markItUp .markItUpButton8 a {
+ background-image:url(images/list-bullet.png);
+}
+.markItUp .markItUpButton9 a {
+ background-image:url(images/list-numeric.png);
+}
+
+.markItUp .markItUpButton10 a {
+ background-image:url(images/picture.png);
+}
+.markItUp .markItUpButton11 a {
+ background-image:url(images/link.png);
+}
+
+.markItUp .markItUpButton12 a {
+ background-image:url(images/quotes.png);
+}
+.markItUp .markItUpButton13 a {
+ background-image:url(images/code.png);
+}
+
+.markItUp .preview a {
+ background-image:url(images/preview.png);
+}
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/bold.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/bold.png
new file mode 100644
index 0000000..889ae80
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/bold.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/code.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/code.png
new file mode 100644
index 0000000..63fe6ce
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/code.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h1.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h1.png
new file mode 100644
index 0000000..9c122e9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h1.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h2.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h2.png
new file mode 100644
index 0000000..fbd8765
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h2.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h3.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h3.png
new file mode 100644
index 0000000..c7836cf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h3.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h4.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h4.png
new file mode 100644
index 0000000..4e929ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h4.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h5.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h5.png
new file mode 100644
index 0000000..30cabeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h5.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h6.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h6.png
new file mode 100644
index 0000000..058170a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/h6.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/italic.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/italic.png
new file mode 100644
index 0000000..8482ac8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/italic.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/link.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/link.png
new file mode 100644
index 0000000..25eacb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/link.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/list-bullet.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/list-bullet.png
new file mode 100644
index 0000000..4a8672b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/list-bullet.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/list-numeric.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/list-numeric.png
new file mode 100644
index 0000000..33b0b8d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/list-numeric.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/paragraph.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/paragraph.png
new file mode 100644
index 0000000..95704fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/paragraph.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/picture.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/picture.png
new file mode 100644
index 0000000..4a158fe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/picture.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/preview.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/preview.png
new file mode 100644
index 0000000..a9925a0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/preview.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/quotes.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/quotes.png
new file mode 100644
index 0000000..e54ebeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/quotes.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/stroke.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/stroke.png
new file mode 100644
index 0000000..612058a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/images/stroke.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/set.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/set.js
new file mode 100644
index 0000000..dc7b6f6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/set.js
@@ -0,0 +1,37 @@
+// -------------------------------------------------------------------
+// markItUp!
+// -------------------------------------------------------------------
+// Copyright (C) 2008 Jay Salvat
+// http://markitup.jaysalvat.com/
+// -------------------------------------------------------------------
+// Textile tags example
+// http://en.wikipedia.org/wiki/Textile_(markup_language)
+// http://www.textism.com/
+// -------------------------------------------------------------------
+// Feel free to add more tags
+// -------------------------------------------------------------------
+mySettings = {
+ onShiftEnter: {keepDefault:false, replaceWith:'\n\n'},
+ markupSet: [
+ {name:'Heading 1', key:'1', openWith:'h1(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Heading 2', key:'2', openWith:'h2(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Heading 3', key:'3', openWith:'h3(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Heading 4', key:'4', openWith:'h4(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Heading 5', key:'5', openWith:'h5(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Heading 6', key:'6', openWith:'h6(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Paragraph', key:'P', openWith:'p(!(([![Class]!]))!). '},
+ {separator:'---------------' },
+ {name:'Bold', key:'B', closeWith:'*', openWith:'*'},
+ {name:'Italic', key:'I', closeWith:'_', openWith:'_'},
+ {name:'Stroke through', key:'S', closeWith:'-', openWith:'-'},
+ {separator:'---------------' },
+ {name:'Bulleted list', openWith:'(!(* |!|*)!)'},
+ {name:'Numeric list', openWith:'(!(# |!|#)!)'},
+ {separator:'---------------' },
+ {name:'Picture', replaceWith:'![![Source:!:http://]!]([![Alternative text]!])!'},
+ {name:'Link', key:'L', openWith:'"', closeWith:'([![Title]!])":[![Link:!:http://]!]', placeHolder:'Your text to link here...' },
+ {separator:'---------------' },
+ {name:'Quotes', openWith:'bq(!(([![Class]!]))!). '},
+ {name:'Code', openWith:'@', closeWith:'@'}
+ ]
+}
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/style.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/style.css
new file mode 100644
index 0000000..6176df5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/sets/textile/style.css
@@ -0,0 +1,60 @@
+/* -------------------------------------------------------------------
+// markItUp!
+// By Jay Salvat - http://markitup.jaysalvat.com/
+// ------------------------------------------------------------------*/
+.markItUp .markItUpButton1 a {
+ background-image:url(images/h1.png);
+}
+.markItUp .markItUpButton2 a {
+ background-image:url(images/h2.png);
+}
+.markItUp .markItUpButton3 a {
+ background-image:url(images/h3.png);
+}
+.markItUp .markItUpButton4 a {
+ background-image:url(images/h4.png);
+}
+.markItUp .markItUpButton5 a {
+ background-image:url(images/h5.png);
+}
+.markItUp .markItUpButton6 a {
+ background-image:url(images/h6.png);
+}
+.markItUp .markItUpButton7 a {
+ background-image:url(images/paragraph.png);
+}
+
+.markItUp .markItUpButton8 a {
+ background-image:url(images/bold.png);
+}
+.markItUp .markItUpButton9 a {
+ background-image:url(images/italic.png);
+}
+.markItUp .markItUpButton10 a {
+ background-image:url(images/stroke.png);
+}
+
+.markItUp .markItUpButton11 a {
+ background-image:url(images/list-bullet.png);
+}
+.markItUp .markItUpButton12 a {
+ background-image:url(images/list-numeric.png);
+}
+
+.markItUp .markItUpButton13 a {
+ background-image:url(images/picture.png);
+}
+.markItUp .markItUpButton14 a {
+ background-image:url(images/link.png);
+}
+
+.markItUp .markItUpButton15 a {
+ background-image:url(images/quotes.png);
+}
+.markItUp .markItUpButton16 a {
+ background-image:url(images/code.png);
+}
+
+.markItUp .preview a {
+ background-image:url(images/preview.png);
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/handle.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/handle.png
new file mode 100644
index 0000000..3993b20
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/handle.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/menu.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/menu.png
new file mode 100644
index 0000000..44a07af
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/menu.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/submenu.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/submenu.png
new file mode 100644
index 0000000..03d1977
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/images/submenu.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/style.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/style.css
new file mode 100644
index 0000000..8755e86
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/skins/django/style.css
@@ -0,0 +1,128 @@
+/* -------------------------------------------------------------------
+// markItUp! Universal MarkUp Engine, JQuery plugin
+// By Jay Salvat - http://markitup.jaysalvat.com/
+// ------------------------------------------------------------------*/
+.markItUp * {
+ margin:0px; padding:0px;
+ outline:none;
+}
+.markItUp a:link,
+.markItUp a:visited {
+ color:#000;
+ text-decoration:none;
+}
+.markItUp {
+ width:800px;
+ margin:5px 0 5px 0;
+ padding-left: 106px;
+}
+.markItUpContainer {
+ font:11px Verdana, Arial, Helvetica, sans-serif;
+}
+.markItUpHeader {
+/* margin-left: 0px;
+ padding-left: 0px;*/
+ padding-top: 3px;
+}
+#id_content.markItUpEditor {
+ font:12px 'Courier New', Courier, monospace;
+ padding:5px;
+ width:790px;
+ height:220px;
+ clear:both;
+ line-height:18px;
+ overflow:auto;
+}
+.markItUpPreviewFrame {
+ overflow:auto;
+ background-color:#FFF;
+ width:99.9%;
+ height:300px;
+ margin:5px 0;
+}
+.markItUpFooter {
+ width:100%;
+}
+.markItUpResizeHandle {
+ overflow:hidden;
+ width:22px; height:5px;
+ margin-left:auto;
+ margin-right:auto;
+ background-image:url(images/handle.png);
+ cursor:n-resize;
+}
+/***************************************************************************************/
+/* first row of buttons */
+div .markItUpHeader ul {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+.markItUpHeader ul li {
+ list-style:none;
+ float:left;
+ position:relative;
+}
+.markItUpHeader ul li:hover > ul{
+ display:block;
+}
+.markItUpHeader ul .markItUpDropMenu {
+ background:transparent url(images/menu.png) no-repeat 115% 50%;
+ margin-right:5px;
+}
+.markItUpHeader ul .markItUpDropMenu li {
+ margin-right:0px;
+}
+/* next rows of buttons */
+.markItUpHeader ul ul {
+ display:none;
+ position:absolute;
+ top:18px; left:0px;
+ background:#FFF;
+ border:1px solid #000;
+}
+.markItUpHeader ul ul li {
+ float:none;
+ border-bottom:1px solid #000;
+}
+.markItUpHeader ul ul .markItUpDropMenu {
+ background:#FFF url(images/submenu.png) no-repeat 100% 50%;
+}
+.markItUpHeader ul .markItUpSeparator {
+ margin:0 10px;
+ width:1px;
+ height:16px;
+ overflow:hidden;
+ background-color:#CCC;
+}
+.markItUpHeader ul ul .markItUpSeparator {
+ width:auto; height:1px;
+ margin:0px;
+}
+/* next rows of buttons */
+.markItUpHeader ul ul ul {
+ position:absolute;
+ top:-1px; left:150px;
+}
+.markItUpHeader ul ul ul li {
+ float:none;
+}
+.markItUpHeader ul a {
+ display:block;
+ width:16px; height:16px;
+ text-indent:-10000px;
+ background-repeat:no-repeat;
+ padding:3px;
+ margin:0px;
+}
+.markItUpHeader ul ul a {
+ display:block;
+ padding-left:0px;
+ text-indent:0;
+ width:120px;
+ padding:5px 5px 5px 25px;
+ background-position:2px 50%;
+}
+.markItUpHeader ul ul a:hover {
+ color:#FFF;
+ background-color:#000;
+}
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/templates/preview.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/templates/preview.css
new file mode 100644
index 0000000..ad91a87
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/templates/preview.css
@@ -0,0 +1,5 @@
+/* preview style examples */
+body {
+ background-color:#EFEFEF;
+ font:70% Verdana, Arial, Helvetica, sans-serif;
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/templates/preview.html b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/templates/preview.html
new file mode 100644
index 0000000..b8b3702
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/markitup/templates/preview.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>markItUp! preview template</title>
+<link rel="stylesheet" type="text/css" href="~/templates/preview.css" />
+</head>
+<body>
+<!-- content -->
+</body>
+</html>
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/mptt_m2m_selectbox.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/mptt_m2m_selectbox.js
new file mode 100644
index 0000000..e7924b6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/mptt_m2m_selectbox.js
@@ -0,0 +1,133 @@
+/*
+ * This is based on the SelectBox.js that comes with Django admin media
+ *
+ */
+
+var SelectBox = {
+ cache: new Object(),
+ init: function(id) {
+ var box = document.getElementById(id);
+ var node;
+ SelectBox.cache[id] = new Array();
+ var cache = SelectBox.cache[id];
+ for (var i = 0; (node = box.options[i]); i++) {
+ cache.push({value: node.value, text: node.text, displayed: 1, tree_id: node.getAttribute('data-tree-id'), left_val: node.getAttribute('data-left-value')});
+ }
+ },
+ redisplay: function(id) {
+ // Repopulate HTML select box from cache
+ var box = document.getElementById(id);
+
+ // for some reason both these steps are neccessary to get browsers to work properly...
+ for (i = 0; i < box.options.length; i++) {
+ box.options[0] = null;
+ }
+ box.options.length = 0;
+
+ SelectBox.sort(id);
+ for (var i = 0, j = SelectBox.cache[id].length; i < j; i++) {
+ var node = SelectBox.cache[id][i];
+ if (node.displayed) {
+ newOpt = new Option(node.text, node.value, false, false);
+ newOpt.setAttribute('data-tree-id', node.tree_id);
+ newOpt.setAttribute('data-left-value', node.left_val);
+ box.options[box.options.length] = newOpt;
+ }
+ }
+ },
+ filter: function(id, text) {
+ // Redisplay the HTML select box, displaying only the choices containing ALL
+ // the words in text. (It's an AND search.)
+ var tokens = text.toLowerCase().split(/\s+/);
+ var node, token;
+ for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+ node.displayed = 1;
+ for (var j = 0; (token = tokens[j]); j++) {
+ if (node.text.toLowerCase().indexOf(token) == -1) {
+ node.displayed = 0;
+ }
+ }
+ }
+ SelectBox.redisplay(id);
+ },
+ delete_from_cache: function(id, value) {
+ var node, delete_index = null;
+ for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+ if (node.value == value) {
+ delete_index = i;
+ break;
+ }
+ }
+ var j = SelectBox.cache[id].length - 1;
+ for (var i = delete_index; i < j; i++) {
+ SelectBox.cache[id][i] = SelectBox.cache[id][i+1];
+ }
+ SelectBox.cache[id].length--;
+ },
+ add_to_cache: function(id, option) {
+ // in this case option is an anonymous object, not an html element
+ SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1, tree_id: option.tree_id, left_val: option.left_val});
+ },
+ cache_contains: function(id, value) {
+ // Check if an item is contained in the cache
+ var node;
+ for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+ if (node.value == value) {
+ return true;
+ }
+ }
+ return false;
+ },
+ move: function(from, to) {
+ var from_box = document.getElementById(from);
+ var to_box = document.getElementById(to);
+ var option;
+ for (var i = 0; (option = from_box.options[i]); i++) {
+ if (option.selected && SelectBox.cache_contains(from, option.value)) {
+ SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1, tree_id: option.getAttribute('data-tree-id'), left_val: option.getAttribute('data-left-value')});
+ SelectBox.delete_from_cache(from, option.value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ move_all: function(from, to) {
+ var from_box = document.getElementById(from);
+ var to_box = document.getElementById(to);
+ var option;
+ for (var i = 0; (option = from_box.options[i]); i++) {
+ if (SelectBox.cache_contains(from, option.value)) {
+ SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1, tree_id: option.getAttribute('data-tree-id'), left_val: option.getAttribute('data-left-value')});
+ SelectBox.delete_from_cache(from, option.value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ sort: function(id) {
+ SelectBox.cache[id].sort( function(a, b) {
+ a_tree_id = parseInt(a.tree_id);
+ b_tree_id = parseInt(b.tree_id);
+ a_left_val = parseInt(a.left_val);
+ b_left_val = parseInt(b.left_val);
+ try {
+ if (a_tree_id > b_tree_id) return 1;
+ if (a_tree_id < b_tree_id) return -1;
+ if (a_tree_id == b_tree_id) {
+ if (a_left_val > b_left_val) return 1;
+ if (a_left_val < b_left_val) return -1;
+ }
+ }
+ catch (e) {
+ // silently fail on IE 'unknown' exception
+ }
+ return 0;
+ } );
+ },
+ select_all: function(id) {
+ var box = document.getElementById(id);
+ for (var i = 0; i < box.options.length; i++) {
+ box.options[i].selected = 'selected';
+ }
+ }
+}
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/underscore.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/underscore.js
new file mode 100644
index 0000000..b6b2813
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/underscore.js
@@ -0,0 +1,981 @@
+// Underscore.js 1.2.3
+// (c) 2009-2011 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore is freely distributable under the MIT license.
+// Portions of Underscore are inspired or borrowed from Prototype,
+// Oliver Steele's Functional, and John Resig's Micro-Templating.
+// For all details and documentation:
+// http://documentcloud.github.com/underscore
+
+(function() {
+
+ // Baseline setup
+ // --------------
+
+ // Establish the root object, `window` in the browser, or `global` on the server.
+ var root = this;
+
+ // Save the previous value of the `_` variable.
+ var previousUnderscore = root._;
+
+ // Establish the object that gets returned to break out of a loop iteration.
+ var breaker = {};
+
+ // Save bytes in the minified (but not gzipped) version:
+ var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
+
+ // Create quick reference variables for speed access to core prototypes.
+ var slice = ArrayProto.slice,
+ concat = ArrayProto.concat,
+ unshift = ArrayProto.unshift,
+ toString = ObjProto.toString,
+ hasOwnProperty = ObjProto.hasOwnProperty;
+
+ // All **ECMAScript 5** native function implementations that we hope to use
+ // are declared here.
+ var
+ nativeForEach = ArrayProto.forEach,
+ nativeMap = ArrayProto.map,
+ nativeReduce = ArrayProto.reduce,
+ nativeReduceRight = ArrayProto.reduceRight,
+ nativeFilter = ArrayProto.filter,
+ nativeEvery = ArrayProto.every,
+ nativeSome = ArrayProto.some,
+ nativeIndexOf = ArrayProto.indexOf,
+ nativeLastIndexOf = ArrayProto.lastIndexOf,
+ nativeIsArray = Array.isArray,
+ nativeKeys = Object.keys,
+ nativeBind = FuncProto.bind;
+
+ // Create a safe reference to the Underscore object for use below.
+ var _ = function(obj) { return new wrapper(obj); };
+
+ // Export the Underscore object for **Node.js** and **"CommonJS"**, with
+ // backwards-compatibility for the old `require()` API. If we're not in
+ // CommonJS, add `_` to the global object.
+ if (typeof exports !== 'undefined') {
+ if (typeof module !== 'undefined' && module.exports) {
+ exports = module.exports = _;
+ }
+ exports._ = _;
+ } else if (typeof define === 'function' && define.amd) {
+ // Register as a named module with AMD.
+ define('underscore', function() {
+ return _;
+ });
+ } else {
+ // Exported as a string, for Closure Compiler "advanced" mode.
+ root['_'] = _;
+ }
+
+ // Current version.
+ _.VERSION = '1.2.3';
+
+ // Collection Functions
+ // --------------------
+
+ // The cornerstone, an `each` implementation, aka `forEach`.
+ // Handles objects with the built-in `forEach`, arrays, and raw objects.
+ // Delegates to **ECMAScript 5**'s native `forEach` if available.
+ var each = _.each = _.forEach = function(obj, iterator, context) {
+ if (obj == null) return;
+ if (nativeForEach && obj.forEach === nativeForEach) {
+ obj.forEach(iterator, context);
+ } else if (obj.length === +obj.length) {
+ for (var i = 0, l = obj.length; i < l; i++) {
+ if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
+ }
+ } else {
+ for (var key in obj) {
+ if (hasOwnProperty.call(obj, key)) {
+ if (iterator.call(context, obj[key], key, obj) === breaker) return;
+ }
+ }
+ }
+ };
+
+ // Return the results of applying the iterator to each element.
+ // Delegates to **ECMAScript 5**'s native `map` if available.
+ _.map = function(obj, iterator, context) {
+ var results = [];
+ if (obj == null) return results;
+ if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
+ each(obj, function(value, index, list) {
+ results[results.length] = iterator.call(context, value, index, list);
+ });
+ return results;
+ };
+
+ // **Reduce** builds up a single result from a list of values, aka `inject`,
+ // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
+ _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
+ var initial = arguments.length > 2;
+ if (obj == null) obj = [];
+ if (nativeReduce && obj.reduce === nativeReduce) {
+ if (context) iterator = _.bind(iterator, context);
+ return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
+ }
+ each(obj, function(value, index, list) {
+ if (!initial) {
+ memo = value;
+ initial = true;
+ } else {
+ memo = iterator.call(context, memo, value, index, list);
+ }
+ });
+ if (!initial) throw new TypeError('Reduce of empty array with no initial value');
+ return memo;
+ };
+
+ // The right-associative version of reduce, also known as `foldr`.
+ // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
+ _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
+ var initial = arguments.length > 2;
+ if (obj == null) obj = [];
+ if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
+ if (context) iterator = _.bind(iterator, context);
+ return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
+ }
+ var reversed = _.toArray(obj).reverse();
+ if (context && !initial) iterator = _.bind(iterator, context);
+ return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);
+ };
+
+ // Return the first value which passes a truth test. Aliased as `detect`.
+ _.find = _.detect = function(obj, iterator, context) {
+ var result;
+ any(obj, function(value, index, list) {
+ if (iterator.call(context, value, index, list)) {
+ result = value;
+ return true;
+ }
+ });
+ return result;
+ };
+
+ // Return all the elements that pass a truth test.
+ // Delegates to **ECMAScript 5**'s native `filter` if available.
+ // Aliased as `select`.
+ _.filter = _.select = function(obj, iterator, context) {
+ var results = [];
+ if (obj == null) return results;
+ if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
+ each(obj, function(value, index, list) {
+ if (iterator.call(context, value, index, list)) results[results.length] = value;
+ });
+ return results;
+ };
+
+ // Return all the elements for which a truth test fails.
+ _.reject = function(obj, iterator, context) {
+ var results = [];
+ if (obj == null) return results;
+ each(obj, function(value, index, list) {
+ if (!iterator.call(context, value, index, list)) results[results.length] = value;
+ });
+ return results;
+ };
+
+ // Determine whether all of the elements match a truth test.
+ // Delegates to **ECMAScript 5**'s native `every` if available.
+ // Aliased as `all`.
+ _.every = _.all = function(obj, iterator, context) {
+ var result = true;
+ if (obj == null) return result;
+ if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
+ each(obj, function(value, index, list) {
+ if (!(result = result && iterator.call(context, value, index, list))) return breaker;
+ });
+ return result;
+ };
+
+ // Determine if at least one element in the object matches a truth test.
+ // Delegates to **ECMAScript 5**'s native `some` if available.
+ // Aliased as `any`.
+ var any = _.some = _.any = function(obj, iterator, context) {
+ iterator || (iterator = _.identity);
+ var result = false;
+ if (obj == null) return result;
+ if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
+ each(obj, function(value, index, list) {
+ if (result || (result = iterator.call(context, value, index, list))) return breaker;
+ });
+ return !!result;
+ };
+
+ // Determine if a given value is included in the array or object using `===`.
+ // Aliased as `contains`.
+ _.include = _.contains = function(obj, target) {
+ var found = false;
+ if (obj == null) return found;
+ if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
+ found = any(obj, function(value) {
+ return value === target;
+ });
+ return found;
+ };
+
+ // Invoke a method (with arguments) on every item in a collection.
+ _.invoke = function(obj, method) {
+ var args = slice.call(arguments, 2);
+ return _.map(obj, function(value) {
+ return (method.call ? method || value : value[method]).apply(value, args);
+ });
+ };
+
+ // Convenience version of a common use case of `map`: fetching a property.
+ _.pluck = function(obj, key) {
+ return _.map(obj, function(value){ return value[key]; });
+ };
+
+ // Return the maximum element or (element-based computation).
+ _.max = function(obj, iterator, context) {
+ if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
+ if (!iterator && _.isEmpty(obj)) return -Infinity;
+ var result = {computed : -Infinity};
+ each(obj, function(value, index, list) {
+ var computed = iterator ? iterator.call(context, value, index, list) : value;
+ computed >= result.computed && (result = {value : value, computed : computed});
+ });
+ return result.value;
+ };
+
+ // Return the minimum element (or element-based computation).
+ _.min = function(obj, iterator, context) {
+ if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
+ if (!iterator && _.isEmpty(obj)) return Infinity;
+ var result = {computed : Infinity};
+ each(obj, function(value, index, list) {
+ var computed = iterator ? iterator.call(context, value, index, list) : value;
+ computed < result.computed && (result = {value : value, computed : computed});
+ });
+ return result.value;
+ };
+
+ // Shuffle an array.
+ _.shuffle = function(obj) {
+ var shuffled = [], rand;
+ each(obj, function(value, index, list) {
+ if (index == 0) {
+ shuffled[0] = value;
+ } else {
+ rand = Math.floor(Math.random() * (index + 1));
+ shuffled[index] = shuffled[rand];
+ shuffled[rand] = value;
+ }
+ });
+ return shuffled;
+ };
+
+ // Sort the object's values by a criterion produced by an iterator.
+ _.sortBy = function(obj, iterator, context) {
+ return _.pluck(_.map(obj, function(value, index, list) {
+ return {
+ value : value,
+ criteria : iterator.call(context, value, index, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria, b = right.criteria;
+ return a < b ? -1 : a > b ? 1 : 0;
+ }), 'value');
+ };
+
+ // Groups the object's values by a criterion. Pass either a string attribute
+ // to group by, or a function that returns the criterion.
+ _.groupBy = function(obj, val) {
+ var result = {};
+ var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
+ each(obj, function(value, index) {
+ var key = iterator(value, index);
+ (result[key] || (result[key] = [])).push(value);
+ });
+ return result;
+ };
+
+ // Use a comparator function to figure out at what index an object should
+ // be inserted so as to maintain order. Uses binary search.
+ _.sortedIndex = function(array, obj, iterator) {
+ iterator || (iterator = _.identity);
+ var low = 0, high = array.length;
+ while (low < high) {
+ var mid = (low + high) >> 1;
+ iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
+ }
+ return low;
+ };
+
+ // Safely convert anything iterable into a real, live array.
+ _.toArray = function(iterable) {
+ if (!iterable) return [];
+ if (iterable.toArray) return iterable.toArray();
+ if (_.isArray(iterable)) return slice.call(iterable);
+ if (_.isArguments(iterable)) return slice.call(iterable);
+ return _.values(iterable);
+ };
+
+ // Return the number of elements in an object.
+ _.size = function(obj) {
+ return _.toArray(obj).length;
+ };
+
+ // Array Functions
+ // ---------------
+
+ // Get the first element of an array. Passing **n** will return the first N
+ // values in the array. Aliased as `head`. The **guard** check allows it to work
+ // with `_.map`.
+ _.first = _.head = function(array, n, guard) {
+ return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
+ };
+
+ // Returns everything but the last entry of the array. Especcialy useful on
+ // the arguments object. Passing **n** will return all the values in
+ // the array, excluding the last N. The **guard** check allows it to work with
+ // `_.map`.
+ _.initial = function(array, n, guard) {
+ return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
+ };
+
+ // Get the last element of an array. Passing **n** will return the last N
+ // values in the array. The **guard** check allows it to work with `_.map`.
+ _.last = function(array, n, guard) {
+ if ((n != null) && !guard) {
+ return slice.call(array, Math.max(array.length - n, 0));
+ } else {
+ return array[array.length - 1];
+ }
+ };
+
+ // Returns everything but the first entry of the array. Aliased as `tail`.
+ // Especially useful on the arguments object. Passing an **index** will return
+ // the rest of the values in the array from that index onward. The **guard**
+ // check allows it to work with `_.map`.
+ _.rest = _.tail = function(array, index, guard) {
+ return slice.call(array, (index == null) || guard ? 1 : index);
+ };
+
+ // Trim out all falsy values from an array.
+ _.compact = function(array) {
+ return _.filter(array, function(value){ return !!value; });
+ };
+
+ // Return a completely flattened version of an array.
+ _.flatten = function(array, shallow) {
+ return _.reduce(array, function(memo, value) {
+ if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
+ memo[memo.length] = value;
+ return memo;
+ }, []);
+ };
+
+ // Return a version of the array that does not contain the specified value(s).
+ _.without = function(array) {
+ return _.difference(array, slice.call(arguments, 1));
+ };
+
+ // Produce a duplicate-free version of the array. If the array has already
+ // been sorted, you have the option of using a faster algorithm.
+ // Aliased as `unique`.
+ _.uniq = _.unique = function(array, isSorted, iterator) {
+ var initial = iterator ? _.map(array, iterator) : array;
+ var result = [];
+ _.reduce(initial, function(memo, el, i) {
+ if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {
+ memo[memo.length] = el;
+ result[result.length] = array[i];
+ }
+ return memo;
+ }, []);
+ return result;
+ };
+
+ // Produce an array that contains the union: each distinct element from all of
+ // the passed-in arrays.
+ _.union = function() {
+ return _.uniq(_.flatten(arguments, true));
+ };
+
+ // Produce an array that contains every item shared between all the
+ // passed-in arrays. (Aliased as "intersect" for back-compat.)
+ _.intersection = _.intersect = function(array) {
+ var rest = slice.call(arguments, 1);
+ return _.filter(_.uniq(array), function(item) {
+ return _.every(rest, function(other) {
+ return _.indexOf(other, item) >= 0;
+ });
+ });
+ };
+
+ // Take the difference between one array and a number of other arrays.
+ // Only the elements present in just the first array will remain.
+ _.difference = function(array) {
+ var rest = _.flatten(slice.call(arguments, 1));
+ return _.filter(array, function(value){ return !_.include(rest, value); });
+ };
+
+ // Zip together multiple lists into a single array -- elements that share
+ // an index go together.
+ _.zip = function() {
+ var args = slice.call(arguments);
+ var length = _.max(_.pluck(args, 'length'));
+ var results = new Array(length);
+ for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
+ return results;
+ };
+
+ // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
+ // we need this function. Return the position of the first occurrence of an
+ // item in an array, or -1 if the item is not included in the array.
+ // Delegates to **ECMAScript 5**'s native `indexOf` if available.
+ // If the array is large and already in sort order, pass `true`
+ // for **isSorted** to use binary search.
+ _.indexOf = function(array, item, isSorted) {
+ if (array == null) return -1;
+ var i, l;
+ if (isSorted) {
+ i = _.sortedIndex(array, item);
+ return array[i] === item ? i : -1;
+ }
+ if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
+ for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
+ return -1;
+ };
+
+ // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
+ _.lastIndexOf = function(array, item) {
+ if (array == null) return -1;
+ if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
+ var i = array.length;
+ while (i--) if (i in array && array[i] === item) return i;
+ return -1;
+ };
+
+ // Generate an integer Array containing an arithmetic progression. A port of
+ // the native Python `range()` function. See
+ // [the Python documentation](http://docs.python.org/library/functions.html#range).
+ _.range = function(start, stop, step) {
+ if (arguments.length <= 1) {
+ stop = start || 0;
+ start = 0;
+ }
+ step = arguments[2] || 1;
+
+ var len = Math.max(Math.ceil((stop - start) / step), 0);
+ var idx = 0;
+ var range = new Array(len);
+
+ while(idx < len) {
+ range[idx++] = start;
+ start += step;
+ }
+
+ return range;
+ };
+
+ // Function (ahem) Functions
+ // ------------------
+
+ // Reusable constructor function for prototype setting.
+ var ctor = function(){};
+
+ // Create a function bound to a given object (assigning `this`, and arguments,
+ // optionally). Binding with arguments is also known as `curry`.
+ // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
+ // We check for `func.bind` first, to fail fast when `func` is undefined.
+ _.bind = function bind(func, context) {
+ var bound, args;
+ if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
+ if (!_.isFunction(func)) throw new TypeError;
+ args = slice.call(arguments, 2);
+ return bound = function() {
+ if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
+ ctor.prototype = func.prototype;
+ var self = new ctor;
+ var result = func.apply(self, args.concat(slice.call(arguments)));
+ if (Object(result) === result) return result;
+ return self;
+ };
+ };
+
+ // Bind all of an object's methods to that object. Useful for ensuring that
+ // all callbacks defined on an object belong to it.
+ _.bindAll = function(obj) {
+ var funcs = slice.call(arguments, 1);
+ if (funcs.length == 0) funcs = _.functions(obj);
+ each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
+ return obj;
+ };
+
+ // Memoize an expensive function by storing its results.
+ _.memoize = function(func, hasher) {
+ var memo = {};
+ hasher || (hasher = _.identity);
+ return function() {
+ var key = hasher.apply(this, arguments);
+ return hasOwnProperty.call(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
+ };
+ };
+
+ // Delays a function for the given number of milliseconds, and then calls
+ // it with the arguments supplied.
+ _.delay = function(func, wait) {
+ var args = slice.call(arguments, 2);
+ return setTimeout(function(){ return func.apply(func, args); }, wait);
+ };
+
+ // Defers a function, scheduling it to run after the current call stack has
+ // cleared.
+ _.defer = function(func) {
+ return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
+ };
+
+ // Returns a function, that, when invoked, will only be triggered at most once
+ // during a given window of time.
+ _.throttle = function(func, wait) {
+ var context, args, timeout, throttling, more;
+ var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
+ return function() {
+ context = this; args = arguments;
+ var later = function() {
+ timeout = null;
+ if (more) func.apply(context, args);
+ whenDone();
+ };
+ if (!timeout) timeout = setTimeout(later, wait);
+ if (throttling) {
+ more = true;
+ } else {
+ func.apply(context, args);
+ }
+ whenDone();
+ throttling = true;
+ };
+ };
+
+ // Returns a function, that, as long as it continues to be invoked, will not
+ // be triggered. The function will be called after it stops being called for
+ // N milliseconds.
+ _.debounce = function(func, wait) {
+ var timeout;
+ return function() {
+ var context = this, args = arguments;
+ var later = function() {
+ timeout = null;
+ func.apply(context, args);
+ };
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ };
+ };
+
+ // Returns a function that will be executed at most one time, no matter how
+ // often you call it. Useful for lazy initialization.
+ _.once = function(func) {
+ var ran = false, memo;
+ return function() {
+ if (ran) return memo;
+ ran = true;
+ return memo = func.apply(this, arguments);
+ };
+ };
+
+ // Returns the first function passed as an argument to the second,
+ // allowing you to adjust arguments, run code before and after, and
+ // conditionally execute the original function.
+ _.wrap = function(func, wrapper) {
+ return function() {
+ var args = concat.apply([func], arguments);
+ return wrapper.apply(this, args);
+ };
+ };
+
+ // Returns a function that is the composition of a list of functions, each
+ // consuming the return value of the function that follows.
+ _.compose = function() {
+ var funcs = arguments;
+ return function() {
+ var args = arguments;
+ for (var i = funcs.length - 1; i >= 0; i--) {
+ args = [funcs[i].apply(this, args)];
+ }
+ return args[0];
+ };
+ };
+
+ // Returns a function that will only be executed after being called N times.
+ _.after = function(times, func) {
+ if (times <= 0) return func();
+ return function() {
+ if (--times < 1) { return func.apply(this, arguments); }
+ };
+ };
+
+ // Object Functions
+ // ----------------
+
+ // Retrieve the names of an object's properties.
+ // Delegates to **ECMAScript 5**'s native `Object.keys`
+ _.keys = nativeKeys || function(obj) {
+ if (obj !== Object(obj)) throw new TypeError('Invalid object');
+ var keys = [];
+ for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] = key;
+ return keys;
+ };
+
+ // Retrieve the values of an object's properties.
+ _.values = function(obj) {
+ return _.map(obj, _.identity);
+ };
+
+ // Return a sorted list of the function names available on the object.
+ // Aliased as `methods`
+ _.functions = _.methods = function(obj) {
+ var names = [];
+ for (var key in obj) {
+ if (_.isFunction(obj[key])) names.push(key);
+ }
+ return names.sort();
+ };
+
+ // Extend a given object with all the properties in passed-in object(s).
+ _.extend = function(obj) {
+ each(slice.call(arguments, 1), function(source) {
+ for (var prop in source) {
+ if (source[prop] !== void 0) obj[prop] = source[prop];
+ }
+ });
+ return obj;
+ };
+
+ // Fill in a given object with default properties.
+ _.defaults = function(obj) {
+ each(slice.call(arguments, 1), function(source) {
+ for (var prop in source) {
+ if (obj[prop] == null) obj[prop] = source[prop];
+ }
+ });
+ return obj;
+ };
+
+ // Create a (shallow-cloned) duplicate of an object.
+ _.clone = function(obj) {
+ if (!_.isObject(obj)) return obj;
+ return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
+ };
+
+ // Invokes interceptor with the obj, and then returns obj.
+ // The primary purpose of this method is to "tap into" a method chain, in
+ // order to perform operations on intermediate results within the chain.
+ _.tap = function(obj, interceptor) {
+ interceptor(obj);
+ return obj;
+ };
+
+ // Internal recursive comparison function.
+ function eq(a, b, stack) {
+ // Identical objects are equal. `0 === -0`, but they aren't identical.
+ // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
+ if (a === b) return a !== 0 || 1 / a == 1 / b;
+ // A strict comparison is necessary because `null == undefined`.
+ if (a == null || b == null) return a === b;
+ // Unwrap any wrapped objects.
+ if (a._chain) a = a._wrapped;
+ if (b._chain) b = b._wrapped;
+ // Invoke a custom `isEqual` method if one is provided.
+ if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);
+ if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);
+ // Compare `[[Class]]` names.
+ var className = toString.call(a);
+ if (className != toString.call(b)) return false;
+ switch (className) {
+ // Strings, numbers, dates, and booleans are compared by value.
+ case '[object String]':
+ // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+ // equivalent to `new String("5")`.
+ return a == String(b);
+ case '[object Number]':
+ // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
+ // other numeric values.
+ return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
+ case '[object Date]':
+ case '[object Boolean]':
+ // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+ // millisecond representations. Note that invalid dates with millisecond representations
+ // of `NaN` are not equivalent.
+ return +a == +b;
+ // RegExps are compared by their source patterns and flags.
+ case '[object RegExp]':
+ return a.source == b.source &&
+ a.global == b.global &&
+ a.multiline == b.multiline &&
+ a.ignoreCase == b.ignoreCase;
+ }
+ if (typeof a != 'object' || typeof b != 'object') return false;
+ // Assume equality for cyclic structures. The algorithm for detecting cyclic
+ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+ var length = stack.length;
+ while (length--) {
+ // Linear search. Performance is inversely proportional to the number of
+ // unique nested structures.
+ if (stack[length] == a) return true;
+ }
+ // Add the first object to the stack of traversed objects.
+ stack.push(a);
+ var size = 0, result = true;
+ // Recursively compare objects and arrays.
+ if (className == '[object Array]') {
+ // Compare array lengths to determine if a deep comparison is necessary.
+ size = a.length;
+ result = size == b.length;
+ if (result) {
+ // Deep compare the contents, ignoring non-numeric properties.
+ while (size--) {
+ // Ensure commutative equality for sparse arrays.
+ if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;
+ }
+ }
+ } else {
+ // Objects with different constructors are not equivalent.
+ if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;
+ // Deep compare objects.
+ for (var key in a) {
+ if (hasOwnProperty.call(a, key)) {
+ // Count the expected number of properties.
+ size++;
+ // Deep compare each member.
+ if (!(result = hasOwnProperty.call(b, key) && eq(a[key], b[key], stack))) break;
+ }
+ }
+ // Ensure that both objects contain the same number of properties.
+ if (result) {
+ for (key in b) {
+ if (hasOwnProperty.call(b, key) && !(size--)) break;
+ }
+ result = !size;
+ }
+ }
+ // Remove the first object from the stack of traversed objects.
+ stack.pop();
+ return result;
+ }
+
+ // Perform a deep comparison to check if two objects are equal.
+ _.isEqual = function(a, b) {
+ return eq(a, b, []);
+ };
+
+ // Is a given array, string, or object empty?
+ // An "empty" object has no enumerable own-properties.
+ _.isEmpty = function(obj) {
+ if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
+ for (var key in obj) if (hasOwnProperty.call(obj, key)) return false;
+ return true;
+ };
+
+ // Is a given value a DOM element?
+ _.isElement = function(obj) {
+ return !!(obj && obj.nodeType == 1);
+ };
+
+ // Is a given value an array?
+ // Delegates to ECMA5's native Array.isArray
+ _.isArray = nativeIsArray || function(obj) {
+ return toString.call(obj) == '[object Array]';
+ };
+
+ // Is a given variable an object?
+ _.isObject = function(obj) {
+ return obj === Object(obj);
+ };
+
+ // Is a given variable an arguments object?
+ _.isArguments = function(obj) {
+ return toString.call(obj) == '[object Arguments]';
+ };
+ if (!_.isArguments(arguments)) {
+ _.isArguments = function(obj) {
+ return !!(obj && hasOwnProperty.call(obj, 'callee'));
+ };
+ }
+
+ // Is a given value a function?
+ _.isFunction = function(obj) {
+ return toString.call(obj) == '[object Function]';
+ };
+
+ // Is a given value a string?
+ _.isString = function(obj) {
+ return toString.call(obj) == '[object String]';
+ };
+
+ // Is a given value a number?
+ _.isNumber = function(obj) {
+ return toString.call(obj) == '[object Number]';
+ };
+
+ // Is the given value `NaN`?
+ _.isNaN = function(obj) {
+ // `NaN` is the only value for which `===` is not reflexive.
+ return obj !== obj;
+ };
+
+ // Is a given value a boolean?
+ _.isBoolean = function(obj) {
+ return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
+ };
+
+ // Is a given value a date?
+ _.isDate = function(obj) {
+ return toString.call(obj) == '[object Date]';
+ };
+
+ // Is the given value a regular expression?
+ _.isRegExp = function(obj) {
+ return toString.call(obj) == '[object RegExp]';
+ };
+
+ // Is a given value equal to null?
+ _.isNull = function(obj) {
+ return obj === null;
+ };
+
+ // Is a given variable undefined?
+ _.isUndefined = function(obj) {
+ return obj === void 0;
+ };
+
+ // Utility Functions
+ // -----------------
+
+ // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
+ // previous owner. Returns a reference to the Underscore object.
+ _.noConflict = function() {
+ root._ = previousUnderscore;
+ return this;
+ };
+
+ // Keep the identity function around for default iterators.
+ _.identity = function(value) {
+ return value;
+ };
+
+ // Run a function **n** times.
+ _.times = function (n, iterator, context) {
+ for (var i = 0; i < n; i++) iterator.call(context, i);
+ };
+
+ // Escape a string for HTML interpolation.
+ _.escape = function(string) {
+ return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g,'&#x2F;');
+ };
+
+ // Add your own custom functions to the Underscore object, ensuring that
+ // they're correctly added to the OOP wrapper as well.
+ _.mixin = function(obj) {
+ each(_.functions(obj), function(name){
+ addToWrapper(name, _[name] = obj[name]);
+ });
+ };
+
+ // Generate a unique integer id (unique within the entire client session).
+ // Useful for temporary DOM ids.
+ var idCounter = 0;
+ _.uniqueId = function(prefix) {
+ var id = idCounter++;
+ return prefix ? prefix + id : id;
+ };
+
+ // By default, Underscore uses ERB-style template delimiters, change the
+ // following template settings to use alternative delimiters.
+ _.templateSettings = {
+ evaluate : /<%([\s\S]+?)%>/g,
+ interpolate : /<%=([\s\S]+?)%>/g,
+ escape : /<%-([\s\S]+?)%>/g
+ };
+
+ // JavaScript micro-templating, similar to John Resig's implementation.
+ // Underscore templating handles arbitrary delimiters, preserves whitespace,
+ // and correctly escapes quotes within interpolated code.
+ _.template = function(str, data) {
+ var c = _.templateSettings;
+ var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
+ 'with(obj||{}){__p.push(\'' +
+ str.replace(/\\/g, '\\\\')
+ .replace(/'/g, "\\'")
+ .replace(c.escape, function(match, code) {
+ return "',_.escape(" + code.replace(/\\'/g, "'") + "),'";
+ })
+ .replace(c.interpolate, function(match, code) {
+ return "'," + code.replace(/\\'/g, "'") + ",'";
+ })
+ .replace(c.evaluate || null, function(match, code) {
+ return "');" + code.replace(/\\'/g, "'")
+ .replace(/[\r\n\t]/g, ' ') + ";__p.push('";
+ })
+ .replace(/\r/g, '\\r')
+ .replace(/\n/g, '\\n')
+ .replace(/\t/g, '\\t')
+ + "');}return __p.join('');";
+ var func = new Function('obj', '_', tmpl);
+ if (data) return func(data, _);
+ return function(data) {
+ return func.call(this, data, _);
+ };
+ };
+
+ // The OOP Wrapper
+ // ---------------
+
+ // If Underscore is called as a function, it returns a wrapped object that
+ // can be used OO-style. This wrapper holds altered versions of all the
+ // underscore functions. Wrapped objects may be chained.
+ var wrapper = function(obj) { this._wrapped = obj; };
+
+ // Expose `wrapper.prototype` as `_.prototype`
+ _.prototype = wrapper.prototype;
+
+ // Helper function to continue chaining intermediate results.
+ var result = function(obj, chain) {
+ return chain ? _(obj).chain() : obj;
+ };
+
+ // A method to easily add functions to the OOP wrapper.
+ var addToWrapper = function(name, func) {
+ wrapper.prototype[name] = function() {
+ var args = slice.call(arguments);
+ unshift.call(args, this._wrapped);
+ return result(func.apply(_, args), this._chain);
+ };
+ };
+
+ // Add all of the Underscore functions to the wrapper object.
+ _.mixin(_);
+
+ // Add all mutator Array functions to the wrapper.
+ each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+ var method = ArrayProto[name];
+ wrapper.prototype[name] = function() {
+ method.apply(this._wrapped, arguments);
+ return result(this._wrapped, this._chain);
+ };
+ });
+
+ // Add all accessor Array functions to the wrapper.
+ each(['concat', 'join', 'slice'], function(name) {
+ var method = ArrayProto[name];
+ wrapper.prototype[name] = function() {
+ return result(method.apply(this._wrapped, arguments), this._chain);
+ };
+ });
+
+ // Start chaining a wrapped Underscore object.
+ wrapper.prototype.chain = function() {
+ this._chain = true;
+ return this;
+ };
+
+ // Extracts the result from a wrapped and chained object.
+ wrapper.prototype.value = function() {
+ return this._wrapped;
+ };
+
+}).call(this);
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-blockquote.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-blockquote.png
new file mode 100644
index 0000000..65ea205
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-blockquote.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h1.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h1.png
new file mode 100644
index 0000000..dea1da3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h1.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h2.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h2.png
new file mode 100644
index 0000000..f4b4274
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h2.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h3.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h3.png
new file mode 100644
index 0000000..bd99f76
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h3.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h4.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h4.png
new file mode 100644
index 0000000..e06ab3d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h4.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h5.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h5.png
new file mode 100644
index 0000000..360fc60
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h5.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h6.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h6.png
new file mode 100644
index 0000000..73e644a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-h6.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-p.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-p.png
new file mode 100644
index 0000000..7f2bf34
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-p.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-pre.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-pre.png
new file mode 100644
index 0000000..e026e47
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/lbl-pre.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/wymiframe.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/wymiframe.css
new file mode 100644
index 0000000..769520c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/wymiframe.css
@@ -0,0 +1,90 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * wymeditor.css
+ * Main editor css file.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+*/
+
+/* VISUAL FEEDBACK */
+
+/* basic */
+ body { background: #e1e8f1;}
+
+/* make HTML blocs visible */
+ p,
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6,
+ ul,
+ ol,
+ table,
+ blockquote,
+ pre { background: #FFFFFF no-repeat 2px 2px;
+ padding:8px 5px 5px;
+ margin:10px; }
+ td { background: #F0F4F8; }
+ th { background: #ffffcc; }
+ ul,
+ ol { border-left:20px solid #B9C4D0; padding:0px 5px; }
+ caption { background: #E4E4B0; padding: 5px; font-weight: bold; }
+ table { font-size: 12px; width: 500px; }
+ td { width: 25%; }
+ blockquote { margin-left: 30px; }
+ pre { background-color:transparent; border: 1px solid white; }
+
+/* Gecko min height fix */
+ p { min-height: 1em; } /*min-height is needed under Firefox, because empty parargraphs */
+ *+html p { min-height: auto; } /* but we have to remove it under IE7 because it triggers the 'haslayout' mode */
+ td { height: 1.6em; }
+
+/* labels */
+ p { background-image: url(lbl-p.png); }
+ h1 { background-image: url(lbl-h1.png); }
+ h2 { background-image: url(lbl-h2.png); }
+ h3 { background-image: url(lbl-h3.png); }
+ h4 { background-image: url(lbl-h4.png); }
+ h5 { background-image: url(lbl-h5.png); }
+ h6 { background-image: url(lbl-h6.png); }
+ blockquote{ background-image: url(lbl-blockquote.png); }
+ pre { background-image: url(lbl-pre.png); }
+
+/* specific HTML elements */
+ caption { text-align: left; }
+ img { margin-right: 5px;
+ border-style: solid;
+ border-color: gray;
+ border-width: 0; }
+ a img { border-width: 1px; border-color: blue; }
+ acronym { border: 1px solid gray; }
+ span { background-color: #eef; }
+
+/* visual feedback for non-valid nesting of elements*/
+ h1 h1, h1 h2, h1 h3, h1 h4, h1 h5, h1 h6, h1 p, h1 pre, h1 address,
+ h2 h1, h2 h2, h2 h3, h2 h4, h2 h5, h2 h6, h2 p, h2 pre, h2 address,
+ h3 h1, h3 h2, h3 h3, h3 h4, h3 h5, h3 h6, h3 p, h3 pre, h3 address,
+ h4 h1, h4 h2, h4 h3, h4 h4, h4 h5, h4 h6, h4 p, h4 pre, h4 address,
+ h5 h1, h5 h2, h5 h3, h5 h4, h5 h5, h5 h6, h5 p, h5 pre, h5 address,
+ h6 h1, h6 h2, h6 h3, h6 h4, h6 h4, h6 h6, h6 p, h6 pre, h6 address,
+ p h1, p h2, p h3, p h4, p h5, p h6, p pre, p address,
+ pre h1, pre h2, pre h3, pre h4, pre h5, pre h6, pre p, pre pre, pre address,
+ address h1, address h2, address h3, address h4, address h5, address h6,
+ address p, address pre, address address
+ { background-color: #ff9999 !important;
+ border: 1px solid red !important;
+ font-size: 12px !important;
+ font-weight: normal; }
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/wymiframe.html b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/wymiframe.html
new file mode 100644
index 0000000..91a690c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/iframe/default/wymiframe.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * wymiframe.html
+ * Iframe used by designMode.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+-->
+<html>
+<head>
+<title>WYMeditor iframe</title>
+<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
+<link rel="stylesheet" type="text/css" media="screen" href="wymiframe.css" />
+</head>
+<body class="wym_iframe"></body>
+</html>
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.js
new file mode 100644
index 0000000..0667d85
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.js
@@ -0,0 +1,4688 @@
+/**
+ * @version 0.5-rc1
+ *
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File: jquery.wymeditor.js
+ *
+ * Main JS file with core classes and functions.
+ * See the documentation for more info.
+ *
+ * About: authors
+ *
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ * Volker Mische (vmx a-t gmx dotde)
+ * Scott Lewis (lewiscot a-t gmail dotcom)
+ * Bermi Ferrer (wymeditor a-t bermi dotorg)
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+ * Jonatan Lundin (jonatan.lundin a-t gmail dotcom)
+ */
+
+/*
+ Namespace: WYMeditor
+ Global WYMeditor namespace.
+*/
+if(!WYMeditor) var WYMeditor = {};
+
+//Wrap the Firebug console in WYMeditor.console
+(function() {
+ if ( !window.console || !console.firebug ) {
+ var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+ "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+
+ WYMeditor.console = {};
+ for (var i = 0; i < names.length; ++i)
+ WYMeditor.console[names[i]] = function() {}
+
+ } else WYMeditor.console = window.console;
+})();
+
+jQuery.extend(WYMeditor, {
+
+/*
+ Constants: Global WYMeditor constants.
+
+ VERSION - Defines WYMeditor version.
+ INSTANCES - An array of loaded WYMeditor.editor instances.
+ STRINGS - An array of loaded WYMeditor language pairs/values.
+ SKINS - An array of loaded WYMeditor skins.
+ NAME - The "name" attribute.
+ INDEX - A string replaced by the instance index.
+ WYM_INDEX - A string used to get/set the instance index.
+ BASE_PATH - A string replaced by WYMeditor's base path.
+ SKIN_PATH - A string replaced by WYMeditor's skin path.
+ WYM_PATH - A string replaced by WYMeditor's main JS file path.
+ SKINS_DEFAULT_PATH - The skins default base path.
+ SKINS_DEFAULT_CSS - The skins default CSS file.
+ LANG_DEFAULT_PATH - The language files default path.
+ IFRAME_BASE_PATH - A string replaced by the designmode iframe's base path.
+ IFRAME_DEFAULT - The iframe's default base path.
+ JQUERY_PATH - A string replaced by the computed jQuery path.
+ DIRECTION - A string replaced by the text direction (rtl or ltr).
+ LOGO - A string replaced by WYMeditor logo.
+ TOOLS - A string replaced by the toolbar's HTML.
+ TOOLS_ITEMS - A string replaced by the toolbar items.
+ TOOL_NAME - A string replaced by a toolbar item's name.
+ TOOL_TITLE - A string replaced by a toolbar item's title.
+ TOOL_CLASS - A string replaced by a toolbar item's class.
+ CLASSES - A string replaced by the classes panel's HTML.
+ CLASSES_ITEMS - A string replaced by the classes items.
+ CLASS_NAME - A string replaced by a class item's name.
+ CLASS_TITLE - A string replaced by a class item's title.
+ CONTAINERS - A string replaced by the containers panel's HTML.
+ CONTAINERS_ITEMS - A string replaced by the containers items.
+ CONTAINER_NAME - A string replaced by a container item's name.
+ CONTAINER_TITLE - A string replaced by a container item's title.
+ CONTAINER_CLASS - A string replaced by a container item's class.
+ HTML - A string replaced by the HTML view panel's HTML.
+ IFRAME - A string replaced by the designmode iframe.
+ STATUS - A string replaced by the status panel's HTML.
+ DIALOG_TITLE - A string replaced by a dialog's title.
+ DIALOG_BODY - A string replaced by a dialog's HTML body.
+ BODY - The BODY element.
+ STRING - The "string" type.
+ BODY,DIV,P,
+ H1,H2,H3,H4,H5,H6,
+ PRE,BLOCKQUOTE,
+ A,BR,IMG,
+ TABLE,TD,TH,
+ UL,OL,LI - HTML elements string representation.
+ CLASS,HREF,SRC,
+ TITLE,ALT - HTML attributes string representation.
+ DIALOG_LINK - A link dialog type.
+ DIALOG_IMAGE - An image dialog type.
+ DIALOG_TABLE - A table dialog type.
+ DIALOG_PASTE - A 'Paste from Word' dialog type.
+ BOLD - Command: (un)set selection to <strong>.
+ ITALIC - Command: (un)set selection to <em>.
+ CREATE_LINK - Command: open the link dialog or (un)set link.
+ INSERT_IMAGE - Command: open the image dialog or insert an image.
+ INSERT_TABLE - Command: open the table dialog.
+ PASTE - Command: open the paste dialog.
+ INDENT - Command: nest a list item.
+ OUTDENT - Command: unnest a list item.
+ TOGGLE_HTML - Command: display/hide the HTML view.
+ FORMAT_BLOCK - Command: set a block element to another type.
+ PREVIEW - Command: open the preview dialog.
+ UNLINK - Command: unset a link.
+ INSERT_UNORDEREDLIST- Command: insert an unordered list.
+ INSERT_ORDEREDLIST - Command: insert an ordered list.
+ MAIN_CONTAINERS - An array of the main HTML containers used in WYMeditor.
+ BLOCKS - An array of the HTML block elements.
+ KEY - Standard key codes.
+ NODE - Node types.
+
+*/
+
+ VERSION : "0.5-rc1",
+ INSTANCES : [],
+ STRINGS : [],
+ SKINS : [],
+ NAME : "name",
+ INDEX : "{Wym_Index}",
+ WYM_INDEX : "wym_index",
+ BASE_PATH : "{Wym_Base_Path}",
+ CSS_PATH : "{Wym_Css_Path}",
+ WYM_PATH : "{Wym_Wym_Path}",
+ SKINS_DEFAULT_PATH : "skins/",
+ SKINS_DEFAULT_CSS : "skin.css",
+ SKINS_DEFAULT_JS : "skin.js",
+ LANG_DEFAULT_PATH : "lang/",
+ IFRAME_BASE_PATH : "{Wym_Iframe_Base_Path}",
+ IFRAME_DEFAULT : "iframe/default/",
+ JQUERY_PATH : "{Wym_Jquery_Path}",
+ DIRECTION : "{Wym_Direction}",
+ LOGO : "{Wym_Logo}",
+ TOOLS : "{Wym_Tools}",
+ TOOLS_ITEMS : "{Wym_Tools_Items}",
+ TOOL_NAME : "{Wym_Tool_Name}",
+ TOOL_TITLE : "{Wym_Tool_Title}",
+ TOOL_CLASS : "{Wym_Tool_Class}",
+ CLASSES : "{Wym_Classes}",
+ CLASSES_ITEMS : "{Wym_Classes_Items}",
+ CLASS_NAME : "{Wym_Class_Name}",
+ CLASS_TITLE : "{Wym_Class_Title}",
+ CONTAINERS : "{Wym_Containers}",
+ CONTAINERS_ITEMS : "{Wym_Containers_Items}",
+ CONTAINER_NAME : "{Wym_Container_Name}",
+ CONTAINER_TITLE : "{Wym_Containers_Title}",
+ CONTAINER_CLASS : "{Wym_Container_Class}",
+ HTML : "{Wym_Html}",
+ IFRAME : "{Wym_Iframe}",
+ STATUS : "{Wym_Status}",
+ DIALOG_TITLE : "{Wym_Dialog_Title}",
+ DIALOG_BODY : "{Wym_Dialog_Body}",
+ STRING : "string",
+ BODY : "body",
+ DIV : "div",
+ P : "p",
+ H1 : "h1",
+ H2 : "h2",
+ H3 : "h3",
+ H4 : "h4",
+ H5 : "h5",
+ H6 : "h6",
+ PRE : "pre",
+ BLOCKQUOTE : "blockquote",
+ A : "a",
+ BR : "br",
+ IMG : "img",
+ TABLE : "table",
+ TD : "td",
+ TH : "th",
+ UL : "ul",
+ OL : "ol",
+ LI : "li",
+ CLASS : "class",
+ HREF : "href",
+ SRC : "src",
+ TITLE : "title",
+ ALT : "alt",
+ DIALOG_LINK : "Link",
+ DIALOG_IMAGE : "Image",
+ DIALOG_TABLE : "Table",
+ DIALOG_PASTE : "Paste_From_Word",
+ BOLD : "Bold",
+ ITALIC : "Italic",
+ CREATE_LINK : "CreateLink",
+ INSERT_IMAGE : "InsertImage",
+ INSERT_TABLE : "InsertTable",
+ INSERT_HTML : "InsertHTML",
+ PASTE : "Paste",
+ INDENT : "Indent",
+ OUTDENT : "Outdent",
+ TOGGLE_HTML : "ToggleHtml",
+ FORMAT_BLOCK : "FormatBlock",
+ PREVIEW : "Preview",
+ UNLINK : "Unlink",
+ INSERT_UNORDEREDLIST: "InsertUnorderedList",
+ INSERT_ORDEREDLIST : "InsertOrderedList",
+
+ MAIN_CONTAINERS : new Array("p","h1","h2","h3","h4","h5","h6","pre","blockquote"),
+
+ BLOCKS : new Array("address", "blockquote", "div", "dl",
+ "fieldset", "form", "h1", "h2", "h3", "h4", "h5", "h6", "hr",
+ "noscript", "ol", "p", "pre", "table", "ul", "dd", "dt",
+ "li", "tbody", "td", "tfoot", "th", "thead", "tr"),
+
+ KEY : {
+ BACKSPACE: 8,
+ ENTER: 13,
+ END: 35,
+ HOME: 36,
+ LEFT: 37,
+ UP: 38,
+ RIGHT: 39,
+ DOWN: 40,
+ CURSOR: new Array(37, 38, 39, 40),
+ DELETE: 46
+ },
+
+ NODE : {
+ ELEMENT: 1,
+ ATTRIBUTE: 2,
+ TEXT: 3
+ },
+
+ /*
+ Class: WYMeditor.editor
+ WYMeditor editor main class, instanciated for each editor occurrence.
+ */
+
+ editor : function(elem, options) {
+
+ /*
+ Constructor: WYMeditor.editor
+
+ Initializes main values (index, elements, paths, ...)
+ and call WYMeditor.editor.init which initializes the editor.
+
+ Parameters:
+
+ elem - The HTML element to be replaced by the editor.
+ options - The hash of options.
+
+ Returns:
+
+ Nothing.
+
+ See Also:
+
+ <WYMeditor.editor.init>
+ */
+
+ //store the instance in the INSTANCES array and store the index
+ this._index = WYMeditor.INSTANCES.push(this) - 1;
+ //store the element replaced by the editor
+ this._element = elem;
+ //store the options
+ this._options = options;
+ //store the element's inner value
+ this._html = jQuery(elem).val();
+
+ //store the HTML option, if any
+ if(this._options.html) this._html = this._options.html;
+ //get or compute the base path (where the main JS file is located)
+ this._options.basePath = this._options.basePath
+ || this.computeBasePath();
+ //get or set the skin path (where the skin files are located)
+ this._options.skinPath = this._options.skinPath
+ || this._options.basePath + WYMeditor.SKINS_DEFAULT_PATH
+ + this._options.skin + '/';
+ //get or compute the main JS file location
+ this._options.wymPath = this._options.wymPath
+ || this.computeWymPath();
+ //get or set the language files path
+ this._options.langPath = this._options.langPath
+ || this._options.basePath + WYMeditor.LANG_DEFAULT_PATH;
+ //get or set the designmode iframe's base path
+ this._options.iframeBasePath = this._options.iframeBasePath
+ || this._options.basePath + WYMeditor.IFRAME_DEFAULT;
+ //get or compute the jQuery JS file location
+ this._options.jQueryPath = this._options.jQueryPath
+ || this.computeJqueryPath();
+
+ //initialize the editor instance
+ this.init();
+
+ }
+
+});
+
+
+/********** JQUERY **********/
+
+/**
+ * Replace an HTML element by WYMeditor
+ *
+ * @example jQuery(".wymeditor").wymeditor(
+ * {
+ *
+ * }
+ * );
+ * @desc Example description here
+ *
+ * @name WYMeditor
+ * @description WYMeditor is a web-based WYSIWYM XHTML editor
+ * @param Hash hash A hash of parameters
+ * @option Integer iExample Description here
+ * @option String sExample Description here
+ *
+ * @type jQuery
+ * @cat Plugins/WYMeditor
+ * @author Jean-Francois Hovinne
+ */
+jQuery.fn.wymeditor = function(options) {
+
+ options = jQuery.extend({
+
+ html: "",
+
+ basePath: false,
+
+ skinPath: false,
+
+ wymPath: false,
+
+ iframeBasePath: false,
+
+ jQueryPath: false,
+
+ styles: false,
+
+ stylesheet: false,
+
+ skin: "default",
+ initSkin: true,
+ loadSkin: true,
+
+ lang: "en",
+
+ direction: "ltr",
+
+ boxHtml: "<div class='wym_box'>"
+ + "<div class='wym_area_top'>"
+ + WYMeditor.TOOLS
+ + "</div>"
+ + "<div class='wym_area_left'></div>"
+ + "<div class='wym_area_right'>"
+ + WYMeditor.CONTAINERS
+ + WYMeditor.CLASSES
+ + "</div>"
+ + "<div class='wym_area_main'>"
+ + WYMeditor.HTML
+ + WYMeditor.IFRAME
+ + WYMeditor.STATUS
+ + "</div>"
+ + "<div class='wym_area_bottom'>"
+ + WYMeditor.LOGO
+ + "</div>"
+ + "</div>",
+
+ logoHtml: "<a class='wym_wymeditor_link' "
+ + "href='http://www.wymeditor.org/'>WYMeditor</a>",
+
+ iframeHtml:"<div class='wym_iframe wym_section'>"
+ + "<iframe "
+ + "src='"
+ + WYMeditor.IFRAME_BASE_PATH
+ + "wymiframe.html' "
+ + "onload='this.contentWindow.parent.WYMeditor.INSTANCES["
+ + WYMeditor.INDEX + "].initIframe(this)'"
+ + "></iframe>"
+ + "</div>",
+
+ editorStyles: [],
+
+ toolsHtml: "<div class='wym_tools wym_section'>"
+ + "<h2>{Tools}</h2>"
+ + "<ul>"
+ + WYMeditor.TOOLS_ITEMS
+ + "</ul>"
+ + "</div>",
+
+ toolsItemHtml: "<li class='"
+ + WYMeditor.TOOL_CLASS
+ + "'><a href='#' name='"
+ + WYMeditor.TOOL_NAME
+ + "' title='"
+ + WYMeditor.TOOL_TITLE
+ + "'>"
+ + WYMeditor.TOOL_TITLE
+ + "</a></li>",
+
+ toolsItems: [
+ {'name': 'Bold', 'title': 'Strong', 'css': 'wym_tools_strong'},
+ {'name': 'Italic', 'title': 'Emphasis', 'css': 'wym_tools_emphasis'},
+ {'name': 'Superscript', 'title': 'Superscript',
+ 'css': 'wym_tools_superscript'},
+ {'name': 'Subscript', 'title': 'Subscript',
+ 'css': 'wym_tools_subscript'},
+ {'name': 'InsertOrderedList', 'title': 'Ordered_List',
+ 'css': 'wym_tools_ordered_list'},
+ {'name': 'InsertUnorderedList', 'title': 'Unordered_List',
+ 'css': 'wym_tools_unordered_list'},
+ {'name': 'Indent', 'title': 'Indent', 'css': 'wym_tools_indent'},
+ {'name': 'Outdent', 'title': 'Outdent', 'css': 'wym_tools_outdent'},
+ {'name': 'Undo', 'title': 'Undo', 'css': 'wym_tools_undo'},
+ {'name': 'Redo', 'title': 'Redo', 'css': 'wym_tools_redo'},
+ {'name': 'CreateLink', 'title': 'Link', 'css': 'wym_tools_link'},
+ {'name': 'Unlink', 'title': 'Unlink', 'css': 'wym_tools_unlink'},
+ {'name': 'InsertImage', 'title': 'Image', 'css': 'wym_tools_image'},
+ {'name': 'InsertTable', 'title': 'Table', 'css': 'wym_tools_table'},
+ {'name': 'Paste', 'title': 'Paste_From_Word',
+ 'css': 'wym_tools_paste'},
+ {'name': 'ToggleHtml', 'title': 'HTML', 'css': 'wym_tools_html'},
+ {'name': 'Preview', 'title': 'Preview', 'css': 'wym_tools_preview'}
+ ],
+
+ containersHtml: "<div class='wym_containers wym_section'>"
+ + "<h2>{Containers}</h2>"
+ + "<ul>"
+ + WYMeditor.CONTAINERS_ITEMS
+ + "</ul>"
+ + "</div>",
+
+ containersItemHtml:"<li class='"
+ + WYMeditor.CONTAINER_CLASS
+ + "'>"
+ + "<a href='#' name='"
+ + WYMeditor.CONTAINER_NAME
+ + "'>"
+ + WYMeditor.CONTAINER_TITLE
+ + "</a></li>",
+
+ containersItems: [
+ {'name': 'P', 'title': 'Paragraph', 'css': 'wym_containers_p'},
+ {'name': 'H1', 'title': 'Heading_1', 'css': 'wym_containers_h1'},
+ {'name': 'H2', 'title': 'Heading_2', 'css': 'wym_containers_h2'},
+ {'name': 'H3', 'title': 'Heading_3', 'css': 'wym_containers_h3'},
+ {'name': 'H4', 'title': 'Heading_4', 'css': 'wym_containers_h4'},
+ {'name': 'H5', 'title': 'Heading_5', 'css': 'wym_containers_h5'},
+ {'name': 'H6', 'title': 'Heading_6', 'css': 'wym_containers_h6'},
+ {'name': 'PRE', 'title': 'Preformatted', 'css': 'wym_containers_pre'},
+ {'name': 'BLOCKQUOTE', 'title': 'Blockquote',
+ 'css': 'wym_containers_blockquote'},
+ {'name': 'TH', 'title': 'Table_Header', 'css': 'wym_containers_th'}
+ ],
+
+ classesHtml: "<div class='wym_classes wym_section'>"
+ + "<h2>{Classes}</h2><ul>"
+ + WYMeditor.CLASSES_ITEMS
+ + "</ul></div>",
+
+ classesItemHtml: "<li class='wym_classes_"
+ + WYMeditor.CLASS_NAME
+ + "'><a href='#' name='"
+ + WYMeditor.CLASS_NAME
+ + "'>"
+ + WYMeditor.CLASS_TITLE
+ + "</a></li>",
+
+ classesItems: [],
+
+ statusHtml: "<div class='wym_status wym_section'>"
+ + "<h2>{Status}</h2>"
+ + "</div>",
+
+ htmlHtml: "<div class='wym_html wym_section'>"
+ + "<h2>{Source_Code}</h2>"
+ + "<textarea class='wym_html_val'></textarea>"
+ + "</div>",
+
+ boxSelector: ".wym_box",
+ toolsSelector: ".wym_tools",
+ toolsListSelector: " ul",
+ containersSelector:".wym_containers",
+ classesSelector: ".wym_classes",
+ htmlSelector: ".wym_html",
+ iframeSelector: ".wym_iframe iframe",
+ iframeBodySelector:".wym_iframe",
+ statusSelector: ".wym_status",
+ toolSelector: ".wym_tools a",
+ containerSelector: ".wym_containers a",
+ classSelector: ".wym_classes a",
+ htmlValSelector: ".wym_html_val",
+
+ hrefSelector: ".wym_href",
+ srcSelector: ".wym_src",
+ titleSelector: ".wym_title",
+ altSelector: ".wym_alt",
+ textSelector: ".wym_text",
+
+ rowsSelector: ".wym_rows",
+ colsSelector: ".wym_cols",
+ captionSelector: ".wym_caption",
+ summarySelector: ".wym_summary",
+
+ submitSelector: ".wym_submit",
+ cancelSelector: ".wym_cancel",
+ previewSelector: "",
+
+ dialogTypeSelector: ".wym_dialog_type",
+ dialogLinkSelector: ".wym_dialog_link",
+ dialogImageSelector: ".wym_dialog_image",
+ dialogTableSelector: ".wym_dialog_table",
+ dialogPasteSelector: ".wym_dialog_paste",
+ dialogPreviewSelector: ".wym_dialog_preview",
+
+ updateSelector: ".wymupdate",
+ updateEvent: "click",
+
+ dialogFeatures: "menubar=no,titlebar=no,toolbar=no,resizable=no"
+ + ",width=560,height=300,top=0,left=0",
+ dialogFeaturesPreview: "menubar=no,titlebar=no,toolbar=no,resizable=no"
+ + ",scrollbars=yes,width=560,height=300,top=0,left=0",
+
+ dialogHtml: "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'"
+ + " 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>"
+ + "<html dir='"
+ + WYMeditor.DIRECTION
+ + "'><head>"
+ + "<link rel='stylesheet' type='text/css' media='screen'"
+ + " href='"
+ + WYMeditor.CSS_PATH
+ + "' />"
+ + "<title>"
+ + WYMeditor.DIALOG_TITLE
+ + "</title>"
+ + "<script type='text/javascript'"
+ + " src='"
+ + WYMeditor.JQUERY_PATH
+ + "'></script>"
+ + "<script type='text/javascript'"
+ + " src='"
+ + WYMeditor.WYM_PATH
+ + "'></script>"
+ + "</head>"
+ + WYMeditor.DIALOG_BODY
+ + "</html>",
+
+ dialogLinkHtml: "<body class='wym_dialog wym_dialog_link'"
+ + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'"
+ + ">"
+ + "<form>"
+ + "<fieldset>"
+ + "<input type='hidden' class='wym_dialog_type' value='"
+ + WYMeditor.DIALOG_LINK
+ + "' />"
+ + "<legend>{Link}</legend>"
+ + "<div class='row'>"
+ + "<label>{URL}</label>"
+ + "<input type='text' class='wym_href' value='' size='40' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Title}</label>"
+ + "<input type='text' class='wym_title' value='' size='40' />"
+ + "</div>"
+ + "<div class='row row-indent'>"
+ + "<input class='wym_submit' type='button'"
+ + " value='{Submit}' />"
+ + "<input class='wym_cancel' type='button'"
+ + "value='{Cancel}' />"
+ + "</div>"
+ + "</fieldset>"
+ + "</form>"
+ + "</body>",
+
+ dialogImageHtml: "<body class='wym_dialog wym_dialog_image'"
+ + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'"
+ + ">"
+ + "<form>"
+ + "<fieldset>"
+ + "<input type='hidden' class='wym_dialog_type' value='"
+ + WYMeditor.DIALOG_IMAGE
+ + "' />"
+ + "<legend>{Image}</legend>"
+ + "<div class='row'>"
+ + "<label>{URL}</label>"
+ + "<input type='text' class='wym_src' value='' size='40' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Alternative_Text}</label>"
+ + "<input type='text' class='wym_alt' value='' size='40' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Title}</label>"
+ + "<input type='text' class='wym_title' value='' size='40' />"
+ + "</div>"
+ + "<div class='row row-indent'>"
+ + "<input class='wym_submit' type='button'"
+ + " value='{Submit}' />"
+ + "<input class='wym_cancel' type='button'"
+ + "value='{Cancel}' />"
+ + "</div>"
+ + "</fieldset>"
+ + "</form>"
+ + "</body>",
+
+ dialogTableHtml: "<body class='wym_dialog wym_dialog_table'"
+ + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'"
+ + ">"
+ + "<form>"
+ + "<fieldset>"
+ + "<input type='hidden' class='wym_dialog_type' value='"
+ + WYMeditor.DIALOG_TABLE
+ + "' />"
+ + "<legend>{Table}</legend>"
+ + "<div class='row'>"
+ + "<label>{Caption}</label>"
+ + "<input type='text' class='wym_caption' value='' size='40' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Summary}</label>"
+ + "<input type='text' class='wym_summary' value='' size='40' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Number_Of_Rows}</label>"
+ + "<input type='text' class='wym_rows' value='3' size='3' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Number_Of_Cols}</label>"
+ + "<input type='text' class='wym_cols' value='2' size='3' />"
+ + "</div>"
+ + "<div class='row row-indent'>"
+ + "<input class='wym_submit' type='button'"
+ + " value='{Submit}' />"
+ + "<input class='wym_cancel' type='button'"
+ + "value='{Cancel}' />"
+ + "</div>"
+ + "</fieldset>"
+ + "</form>"
+ + "</body>",
+
+ dialogPasteHtml: "<body class='wym_dialog wym_dialog_paste'"
+ + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'"
+ + ">"
+ + "<form>"
+ + "<input type='hidden' class='wym_dialog_type' value='"
+ + WYMeditor.DIALOG_PASTE
+ + "' />"
+ + "<fieldset>"
+ + "<legend>{Paste_From_Word}</legend>"
+ + "<div class='row'>"
+ + "<textarea class='wym_text' rows='10' cols='50'></textarea>"
+ + "</div>"
+ + "<div class='row'>"
+ + "<input class='wym_submit' type='button'"
+ + " value='{Submit}' />"
+ + "<input class='wym_cancel' type='button'"
+ + "value='{Cancel}' />"
+ + "</div>"
+ + "</fieldset>"
+ + "</form>"
+ + "</body>",
+
+ dialogPreviewHtml: "<body class='wym_dialog wym_dialog_preview'"
+ + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'"
+ + "></body>",
+
+ dialogStyles: [],
+
+ stringDelimiterLeft: "{",
+ stringDelimiterRight:"}",
+
+ preInit: null,
+ preBind: null,
+ postInit: null,
+
+ preInitDialog: null,
+ postInitDialog: null
+
+ }, options);
+
+ return this.each(function() {
+
+ new WYMeditor.editor(jQuery(this),options);
+ });
+};
+
+/* @name extend
+ * @description Returns the WYMeditor instance based on its index
+ */
+jQuery.extend({
+ wymeditors: function(i) {
+ return (WYMeditor.INSTANCES[i]);
+ }
+});
+
+
+/********** WYMeditor **********/
+
+/* @name Wymeditor
+ * @description WYMeditor class
+ */
+
+/* @name init
+ * @description Initializes a WYMeditor instance
+ */
+WYMeditor.editor.prototype.init = function() {
+
+ //load subclass - browser specific
+ //unsupported browsers: do nothing
+ if (jQuery.browser.msie) {
+ var WymClass = new WYMeditor.WymClassExplorer(this);
+ }
+ else if (jQuery.browser.mozilla) {
+ var WymClass = new WYMeditor.WymClassMozilla(this);
+ }
+ else if (jQuery.browser.opera) {
+ var WymClass = new WYMeditor.WymClassOpera(this);
+ }
+ else if (jQuery.browser.safari) {
+ var WymClass = new WYMeditor.WymClassSafari(this);
+ }
+
+ if(WymClass) {
+
+ if(jQuery.isFunction(this._options.preInit)) this._options.preInit(this);
+
+ var SaxListener = new WYMeditor.XhtmlSaxListener();
+ jQuery.extend(SaxListener, WymClass);
+ this.parser = new WYMeditor.XhtmlParser(SaxListener);
+
+ if(this._options.styles || this._options.stylesheet){
+ this.configureEditorUsingRawCss();
+ }
+
+ this.helper = new WYMeditor.XmlHelper();
+
+ //extend the Wymeditor object
+ //don't use jQuery.extend since 1.1.4
+ //jQuery.extend(this, WymClass);
+ for (var prop in WymClass) { this[prop] = WymClass[prop]; }
+
+ //load wymbox
+ this._box = jQuery(this._element).hide().after(this._options.boxHtml).next().addClass('wym_box_' + this._index);
+
+ //store the instance index in wymbox and element replaced by editor instance
+ //but keep it compatible with jQuery < 1.2.3, see #122
+ if( jQuery.isFunction( jQuery.fn.data ) ) {
+ jQuery.data(this._box.get(0), WYMeditor.WYM_INDEX, this._index);
+ jQuery.data(this._element.get(0), WYMeditor.WYM_INDEX, this._index);
+ }
+
+ var h = WYMeditor.Helper;
+
+ //construct the iframe
+ var iframeHtml = this._options.iframeHtml;
+ iframeHtml = h.replaceAll(iframeHtml, WYMeditor.INDEX, this._index);
+ iframeHtml = h.replaceAll(iframeHtml, WYMeditor.IFRAME_BASE_PATH, this._options.iframeBasePath);
+
+ //construct wymbox
+ var boxHtml = jQuery(this._box).html();
+
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.LOGO, this._options.logoHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.TOOLS, this._options.toolsHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.CONTAINERS,this._options.containersHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.CLASSES, this._options.classesHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.HTML, this._options.htmlHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.IFRAME, iframeHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.STATUS, this._options.statusHtml);
+
+ //construct tools list
+ var aTools = eval(this._options.toolsItems);
+ var sTools = "";
+
+ for(var i = 0; i < aTools.length; i++) {
+ var oTool = aTools[i];
+ if(oTool.name && oTool.title)
+ var sTool = this._options.toolsItemHtml;
+ var sTool = h.replaceAll(sTool, WYMeditor.TOOL_NAME, oTool.name);
+ sTool = h.replaceAll(sTool, WYMeditor.TOOL_TITLE, this._options.stringDelimiterLeft
+ + oTool.title
+ + this._options.stringDelimiterRight);
+ sTool = h.replaceAll(sTool, WYMeditor.TOOL_CLASS, oTool.css);
+ sTools += sTool;
+ }
+
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.TOOLS_ITEMS, sTools);
+
+ //construct classes list
+ var aClasses = eval(this._options.classesItems);
+ var sClasses = "";
+
+ for(var i = 0; i < aClasses.length; i++) {
+ var oClass = aClasses[i];
+ if(oClass.name && oClass.title)
+ var sClass = this._options.classesItemHtml;
+ sClass = h.replaceAll(sClass, WYMeditor.CLASS_NAME, oClass.name);
+ sClass = h.replaceAll(sClass, WYMeditor.CLASS_TITLE, oClass.title);
+ sClasses += sClass;
+ }
+
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.CLASSES_ITEMS, sClasses);
+
+ //construct containers list
+ var aContainers = eval(this._options.containersItems);
+ var sContainers = "";
+
+ for(var i = 0; i < aContainers.length; i++) {
+ var oContainer = aContainers[i];
+ if(oContainer.name && oContainer.title)
+ var sContainer = this._options.containersItemHtml;
+ sContainer = h.replaceAll(sContainer, WYMeditor.CONTAINER_NAME, oContainer.name);
+ sContainer = h.replaceAll(sContainer, WYMeditor.CONTAINER_TITLE,
+ this._options.stringDelimiterLeft
+ + oContainer.title
+ + this._options.stringDelimiterRight);
+ sContainer = h.replaceAll(sContainer, WYMeditor.CONTAINER_CLASS, oContainer.css);
+ sContainers += sContainer;
+ }
+
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.CONTAINERS_ITEMS, sContainers);
+
+ //l10n
+ boxHtml = this.replaceStrings(boxHtml);
+
+ //load html in wymbox
+ jQuery(this._box).html(boxHtml);
+
+ //hide the html value
+ jQuery(this._box).find(this._options.htmlSelector).hide();
+
+ //enable the skin
+ this.loadSkin();
+
+ }
+};
+
+WYMeditor.editor.prototype.bindEvents = function() {
+
+ //copy the instance
+ var wym = this;
+
+ //handle click event on tools buttons
+ jQuery(this._box).find(this._options.toolSelector).click(function() {
+ wym._iframe.contentWindow.focus(); //See #154
+ wym.exec(jQuery(this).attr(WYMeditor.NAME));
+ return(false);
+ });
+
+ //handle click event on containers buttons
+ jQuery(this._box).find(this._options.containerSelector).click(function() {
+ wym.container(jQuery(this).attr(WYMeditor.NAME));
+ return(false);
+ });
+
+ //handle keyup event on html value: set the editor value
+ //handle focus/blur events to check if the element has focus, see #147
+ jQuery(this._box).find(this._options.htmlValSelector)
+ .keyup(function() { jQuery(wym._doc.body).html(jQuery(this).val());})
+ .focus(function() { jQuery(this).toggleClass('hasfocus'); })
+ .blur(function() { jQuery(this).toggleClass('hasfocus'); });
+
+ //handle click event on classes buttons
+ jQuery(this._box).find(this._options.classSelector).click(function() {
+
+ var aClasses = eval(wym._options.classesItems);
+ var sName = jQuery(this).attr(WYMeditor.NAME);
+
+ var oClass = WYMeditor.Helper.findByName(aClasses, sName);
+
+ if(oClass) {
+ var jqexpr = oClass.expr;
+ wym.toggleClass(sName, jqexpr);
+ }
+ wym._iframe.contentWindow.focus(); //See #154
+ return(false);
+ });
+
+ //handle event on update element
+ jQuery(this._options.updateSelector)
+ .bind(this._options.updateEvent, function() {
+ wym.update();
+ });
+};
+
+WYMeditor.editor.prototype.ready = function() {
+ return(this._doc != null);
+};
+
+
+/********** METHODS **********/
+
+/* @name box
+ * @description Returns the WYMeditor container
+ */
+WYMeditor.editor.prototype.box = function() {
+ return(this._box);
+};
+
+/* @name html
+ * @description Get/Set the html value
+ */
+WYMeditor.editor.prototype.html = function(html) {
+
+ if(typeof html === 'string') jQuery(this._doc.body).html(html);
+ else return(jQuery(this._doc.body).html());
+};
+
+/* @name xhtml
+ * @description Cleans up the HTML
+ */
+WYMeditor.editor.prototype.xhtml = function() {
+ return this.parser.parse(this.html());
+};
+
+/* @name exec
+ * @description Executes a button command
+ */
+WYMeditor.editor.prototype.exec = function(cmd) {
+
+ //base function for execCommand
+ //open a dialog or exec
+ switch(cmd) {
+ case WYMeditor.CREATE_LINK:
+ var container = this.container();
+ if(container || this._selected_image) this.dialog(WYMeditor.DIALOG_LINK);
+ break;
+
+ case WYMeditor.INSERT_IMAGE:
+ this.dialog(WYMeditor.DIALOG_IMAGE);
+ break;
+
+ case WYMeditor.INSERT_TABLE:
+ this.dialog(WYMeditor.DIALOG_TABLE);
+ break;
+
+ case WYMeditor.PASTE:
+ this.dialog(WYMeditor.DIALOG_PASTE);
+ break;
+
+ case WYMeditor.TOGGLE_HTML:
+ this.update();
+ this.toggleHtml();
+ break;
+
+ case WYMeditor.PREVIEW:
+ this.dialog(WYMeditor.PREVIEW, this._options.dialogFeaturesPreview);
+ break;
+
+ default:
+ this._exec(cmd);
+ break;
+ }
+};
+
+/* @name container
+ * @description Get/Set the selected container
+ */
+WYMeditor.editor.prototype.container = function(sType) {
+
+ if(sType) {
+
+ var container = null;
+
+ if(sType.toLowerCase() == WYMeditor.TH) {
+
+ container = this.container();
+
+ //find the TD or TH container
+ switch(container.tagName.toLowerCase()) {
+
+ case WYMeditor.TD: case WYMeditor.TH:
+ break;
+ default:
+ var aTypes = new Array(WYMeditor.TD,WYMeditor.TH);
+ container = this.findUp(this.container(), aTypes);
+ break;
+ }
+
+ //if it exists, switch
+ if(container!=null) {
+
+ sType = (container.tagName.toLowerCase() == WYMeditor.TD)? WYMeditor.TH: WYMeditor.TD;
+ this.switchTo(container,sType);
+ this.update();
+ }
+ } else {
+
+ //set the container type
+ var aTypes=new Array(WYMeditor.P,WYMeditor.H1,WYMeditor.H2,WYMeditor.H3,WYMeditor.H4,WYMeditor.H5,
+ WYMeditor.H6,WYMeditor.PRE,WYMeditor.BLOCKQUOTE);
+ container = this.findUp(this.container(), aTypes);
+
+ if(container) {
+
+ var newNode = null;
+
+ //blockquotes must contain a block level element
+ if(sType.toLowerCase() == WYMeditor.BLOCKQUOTE) {
+
+ var blockquote = this.findUp(this.container(), WYMeditor.BLOCKQUOTE);
+
+ if(blockquote == null) {
+
+ newNode = this._doc.createElement(sType);
+ container.parentNode.insertBefore(newNode,container);
+ newNode.appendChild(container);
+ this.setFocusToNode(newNode.firstChild);
+
+ } else {
+
+ var nodes = blockquote.childNodes;
+ var lgt = nodes.length;
+ var firstNode = null;
+
+ if(lgt > 0) firstNode = nodes.item(0);
+ for(var x=0; x<lgt; x++) {
+ blockquote.parentNode.insertBefore(nodes.item(0),blockquote);
+ }
+ blockquote.parentNode.removeChild(blockquote);
+ if(firstNode) this.setFocusToNode(firstNode);
+ }
+ }
+
+ else this.switchTo(container,sType);
+
+ this.update();
+ }
+ }
+ }
+ else return(this.selected());
+};
+
+/* @name toggleClass
+ * @description Toggles class on selected element, or one of its parents
+ */
+WYMeditor.editor.prototype.toggleClass = function(sClass, jqexpr) {
+
+ var container = (this._selected_image
+ ? this._selected_image
+ : jQuery(this.selected()));
+ container = jQuery(container).parentsOrSelf(jqexpr);
+ jQuery(container).toggleClass(sClass);
+
+ if(!jQuery(container).attr(WYMeditor.CLASS)) jQuery(container).removeAttr(this._class);
+
+};
+
+/* @name findUp
+ * @description Returns the first parent or self container, based on its type
+ */
+WYMeditor.editor.prototype.findUp = function(node, filter) {
+
+ //filter is a string or an array of strings
+
+ if(node) {
+
+ var tagname = node.tagName.toLowerCase();
+
+ if(typeof(filter) == WYMeditor.STRING) {
+
+ while(tagname != filter && tagname != WYMeditor.BODY) {
+
+ node = node.parentNode;
+ tagname = node.tagName.toLowerCase();
+ }
+
+ } else {
+
+ var bFound = false;
+
+ while(!bFound && tagname != WYMeditor.BODY) {
+ for(var i = 0; i < filter.length; i++) {
+ if(tagname == filter[i]) {
+ bFound = true;
+ break;
+ }
+ }
+ if(!bFound) {
+ node = node.parentNode;
+ tagname = node.tagName.toLowerCase();
+ }
+ }
+ }
+
+ if(tagname != WYMeditor.BODY) return(node);
+ else return(null);
+
+ } else return(null);
+};
+
+/* @name switchTo
+ * @description Switch the node's type
+ */
+WYMeditor.editor.prototype.switchTo = function(node,sType) {
+
+ var newNode = this._doc.createElement(sType);
+ var html = jQuery(node).html();
+ node.parentNode.replaceChild(newNode,node);
+ jQuery(newNode).html(html);
+ this.setFocusToNode(newNode);
+};
+
+WYMeditor.editor.prototype.replaceStrings = function(sVal) {
+ //check if the language file has already been loaded
+ //if not, get it via a synchronous ajax call
+ if(!WYMeditor.STRINGS[this._options.lang]) {
+ try {
+ eval(jQuery.ajax({url:this._options.langPath
+ + this._options.lang + '.js', async:false}).responseText);
+ } catch(e) {
+ WYMeditor.console.error("WYMeditor: error while parsing language file.");
+ return sVal;
+ }
+ }
+
+ //replace all the strings in sVal and return it
+ for (var key in WYMeditor.STRINGS[this._options.lang]) {
+ sVal = WYMeditor.Helper.replaceAll(sVal, this._options.stringDelimiterLeft + key
+ + this._options.stringDelimiterRight,
+ WYMeditor.STRINGS[this._options.lang][key]);
+ };
+ return(sVal);
+};
+
+WYMeditor.editor.prototype.encloseString = function(sVal) {
+
+ return(this._options.stringDelimiterLeft
+ + sVal
+ + this._options.stringDelimiterRight);
+};
+
+/* @name status
+ * @description Prints a status message
+ */
+WYMeditor.editor.prototype.status = function(sMessage) {
+
+ //print status message
+ jQuery(this._box).find(this._options.statusSelector).html(sMessage);
+};
+
+/* @name update
+ * @description Updates the element and textarea values
+ */
+WYMeditor.editor.prototype.update = function() {
+
+ var html = this.xhtml();
+ jQuery(this._element).val(html);
+ jQuery(this._box).find(this._options.htmlValSelector).not('.hasfocus').val(html); //#147
+};
+
+/* @name dialog
+ * @description Opens a dialog box
+ */
+WYMeditor.editor.prototype.dialog = function( dialogType, dialogFeatures, bodyHtml ) {
+
+ var features = dialogFeatures || this._wym._options.dialogFeatures;
+ var wDialog = window.open('', 'dialog', features);
+
+ if(wDialog) {
+
+ var sBodyHtml = "";
+
+ switch( dialogType ) {
+
+ case(WYMeditor.DIALOG_LINK):
+ sBodyHtml = this._options.dialogLinkHtml;
+ break;
+ case(WYMeditor.DIALOG_IMAGE):
+ sBodyHtml = this._options.dialogImageHtml;
+ break;
+ case(WYMeditor.DIALOG_TABLE):
+ sBodyHtml = this._options.dialogTableHtml;
+ break;
+ case(WYMeditor.DIALOG_PASTE):
+ sBodyHtml = this._options.dialogPasteHtml;
+ break;
+ case(WYMeditor.PREVIEW):
+ sBodyHtml = this._options.dialogPreviewHtml;
+ break;
+
+ default:
+ sBodyHtml = bodyHtml;
+ }
+
+ var h = WYMeditor.Helper;
+
+ //construct the dialog
+ var dialogHtml = this._options.dialogHtml;
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.BASE_PATH, this._options.basePath);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIRECTION, this._options.direction);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.CSS_PATH, this._options.skinPath + WYMeditor.SKINS_DEFAULT_CSS);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.WYM_PATH, this._options.wymPath);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.JQUERY_PATH, this._options.jQueryPath);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIALOG_TITLE, this.encloseString( dialogType ));
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIALOG_BODY, sBodyHtml);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.INDEX, this._index);
+
+ dialogHtml = this.replaceStrings(dialogHtml);
+
+ var doc = wDialog.document;
+ doc.write(dialogHtml);
+ doc.close();
+ }
+};
+
+/* @name toggleHtml
+ * @description Shows/Hides the HTML
+ */
+WYMeditor.editor.prototype.toggleHtml = function() {
+ jQuery(this._box).find(this._options.htmlSelector).toggle();
+};
+
+WYMeditor.editor.prototype.uniqueStamp = function() {
+ var now = new Date();
+ return("wym-" + now.getTime());
+};
+
+WYMeditor.editor.prototype.paste = function(sData) {
+
+ var sTmp;
+ var container = this.selected();
+
+ //split the data, using double newlines as the separator
+ var aP = sData.split(this._newLine + this._newLine);
+ var rExp = new RegExp(this._newLine, "g");
+
+ //add a P for each item
+ if(container && container.tagName.toLowerCase() != WYMeditor.BODY) {
+ for(x = aP.length - 1; x >= 0; x--) {
+ sTmp = aP[x];
+ //simple newlines are replaced by a break
+ sTmp = sTmp.replace(rExp, "<br />");
+ jQuery(container).after("<p>" + sTmp + "</p>");
+ }
+ } else {
+ for(x = 0; x < aP.length; x++) {
+ sTmp = aP[x];
+ //simple newlines are replaced by a break
+ sTmp = sTmp.replace(rExp, "<br />");
+ jQuery(this._doc.body).append("<p>" + sTmp + "</p>");
+ }
+
+ }
+};
+
+WYMeditor.editor.prototype.insert = function(html) {
+ // Do we have a selection?
+ if (this._iframe.contentWindow.getSelection().focusNode != null) {
+ // Overwrite selection with provided html
+ this._exec( WYMeditor.INSERT_HTML, html);
+ } else {
+ // Fall back to the internal paste function if there's no selection
+ this.paste(html)
+ }
+};
+
+WYMeditor.editor.prototype.wrap = function(left, right) {
+ // Do we have a selection?
+ if (this._iframe.contentWindow.getSelection().focusNode != null) {
+ // Wrap selection with provided html
+ this._exec( WYMeditor.INSERT_HTML, left + this._iframe.contentWindow.getSelection().toString() + right);
+ }
+};
+
+WYMeditor.editor.prototype.unwrap = function() {
+ // Do we have a selection?
+ if (this._iframe.contentWindow.getSelection().focusNode != null) {
+ // Unwrap selection
+ this._exec( WYMeditor.INSERT_HTML, this._iframe.contentWindow.getSelection().toString() );
+ }
+};
+
+WYMeditor.editor.prototype.setFocusToNode = function(node, toStart) {
+ var range = this._doc.createRange(),
+ selection = this._iframe.contentWindow.getSelection();
+ toStart = toStart ? 0 : 1;
+
+ range.selectNodeContents(node);
+ selection.addRange(range);
+ selection.collapse(node, toStart);
+ this._iframe.contentWindow.focus();
+};
+
+WYMeditor.editor.prototype.addCssRules = function(doc, aCss) {
+ var styles = doc.styleSheets[0];
+ if(styles) {
+ for(var i = 0; i < aCss.length; i++) {
+ var oCss = aCss[i];
+ if(oCss.name && oCss.css) this.addCssRule(styles, oCss);
+ }
+ }
+};
+
+/********** CONFIGURATION **********/
+
+WYMeditor.editor.prototype.computeBasePath = function() {
+ return jQuery(jQuery.grep(jQuery('script'), function(s){
+ return (s.src && s.src.match(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/ ))
+ })).attr('src').replace(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/, '');
+};
+
+WYMeditor.editor.prototype.computeWymPath = function() {
+ return jQuery(jQuery.grep(jQuery('script'), function(s){
+ return (s.src && s.src.match(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/ ))
+ })).attr('src');
+};
+
+WYMeditor.editor.prototype.computeJqueryPath = function() {
+ return jQuery(jQuery.grep(jQuery('script'), function(s){
+ return (s.src && s.src.match(/jquery(-(.*)){0,1}(\.pack|\.min|\.packed)?\.js(\?.*)?$/ ))
+ })).attr('src');
+};
+
+WYMeditor.editor.prototype.computeCssPath = function() {
+ return jQuery(jQuery.grep(jQuery('link'), function(s){
+ return (s.href && s.href.match(/wymeditor\/skins\/(.*)screen\.css(\?.*)?$/ ))
+ })).attr('href');
+};
+
+WYMeditor.editor.prototype.configureEditorUsingRawCss = function() {
+
+ var CssParser = new WYMeditor.WymCssParser();
+ if(this._options.stylesheet){
+ CssParser.parse(jQuery.ajax({url: this._options.stylesheet,async:false}).responseText);
+ }else{
+ CssParser.parse(this._options.styles, false);
+ }
+
+ if(this._options.classesItems.length == 0) {
+ this._options.classesItems = CssParser.css_settings.classesItems;
+ }
+ if(this._options.editorStyles.length == 0) {
+ this._options.editorStyles = CssParser.css_settings.editorStyles;
+ }
+ if(this._options.dialogStyles.length == 0) {
+ this._options.dialogStyles = CssParser.css_settings.dialogStyles;
+ }
+};
+
+/********** EVENTS **********/
+
+WYMeditor.editor.prototype.listen = function() {
+ //don't use jQuery.find() on the iframe body
+ //because of MSIE + jQuery + expando issue (#JQ1143)
+ //jQuery(this._doc.body).find("*").bind("mouseup", this.mouseup);
+
+ jQuery(this._doc.body).bind("mousedown", this.mousedown);
+};
+
+WYMeditor.editor.prototype.mousedown = function(evt) {
+ var wym = WYMeditor.INSTANCES[this.ownerDocument.title];
+ wym._selected_image = (evt.target.tagName.toLowerCase() == WYMeditor.IMG) ? evt.target : null;
+};
+
+/********** SKINS **********/
+
+/*
+ * Function: WYMeditor.loadCss
+ * Loads a stylesheet in the document.
+ *
+ * Parameters:
+ * href - The CSS path.
+ */
+WYMeditor.loadCss = function(href) {
+
+ var link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.href = href;
+
+ var head = jQuery('head').get(0);
+ head.appendChild(link);
+};
+
+/*
+ * Function: WYMeditor.editor.loadSkin
+ * Loads the skin CSS and initialization script (if needed).
+ */
+WYMeditor.editor.prototype.loadSkin = function() {
+
+ //does the user want to automatically load the CSS (default: yes)?
+ //we also test if it hasn't been already loaded by another instance
+ //see below for a better (second) test
+ if(this._options.loadSkin && !WYMeditor.SKINS[this._options.skin]) {
+
+ //check if it hasn't been already loaded
+ //so we don't load it more than once
+ //(we check the existing <link> elements)
+
+ var found = false;
+ var rExp = new RegExp(this._options.skin
+ + '\/' + WYMeditor.SKINS_DEFAULT_CSS + '$');
+
+ jQuery('link').each( function() {
+ if(this.href.match(rExp)) found = true;
+ });
+
+ //load it, using the skin path
+ if(!found) WYMeditor.loadCss( this._options.skinPath
+ + WYMeditor.SKINS_DEFAULT_CSS );
+ }
+
+ //put the classname (ex. wym_skin_default) on wym_box
+ jQuery(this._box).addClass( "wym_skin_" + this._options.skin );
+
+ //does the user want to use some JS to initialize the skin (default: yes)?
+ //also check if it hasn't already been loaded by another instance
+ if(this._options.initSkin && !WYMeditor.SKINS[this._options.skin]) {
+
+ eval(jQuery.ajax({url:this._options.skinPath
+ + WYMeditor.SKINS_DEFAULT_JS, async:false}).responseText);
+ }
+
+ //init the skin, if needed
+ if(WYMeditor.SKINS[this._options.skin]
+ && WYMeditor.SKINS[this._options.skin].init)
+ WYMeditor.SKINS[this._options.skin].init(this);
+
+};
+
+
+/********** DIALOGS **********/
+
+WYMeditor.INIT_DIALOG = function(index) {
+
+ var wym = window.opener.WYMeditor.INSTANCES[index];
+ var doc = window.document;
+ var selected = wym.selected();
+ var dialogType = jQuery(wym._options.dialogTypeSelector).val();
+ var sStamp = wym.uniqueStamp();
+
+ switch(dialogType) {
+
+ case WYMeditor.DIALOG_LINK:
+ //ensure that we select the link to populate the fields
+ if(selected && selected.tagName && selected.tagName.toLowerCase != WYMeditor.A)
+ selected = jQuery(selected).parentsOrSelf(WYMeditor.A);
+
+ //fix MSIE selection if link image has been clicked
+ if(!selected && wym._selected_image)
+ selected = jQuery(wym._selected_image).parentsOrSelf(WYMeditor.A);
+ break;
+
+ }
+
+ //pre-init functions
+ if(jQuery.isFunction(wym._options.preInitDialog))
+ wym._options.preInitDialog(wym,window);
+
+ //add css rules from options
+ var styles = doc.styleSheets[0];
+ var aCss = eval(wym._options.dialogStyles);
+
+ wym.addCssRules(doc, aCss);
+
+ //auto populate fields if selected container (e.g. A)
+ if(selected) {
+ jQuery(wym._options.hrefSelector).val(jQuery(selected).attr(WYMeditor.HREF));
+ jQuery(wym._options.srcSelector).val(jQuery(selected).attr(WYMeditor.SRC));
+ jQuery(wym._options.titleSelector).val(jQuery(selected).attr(WYMeditor.TITLE));
+ jQuery(wym._options.altSelector).val(jQuery(selected).attr(WYMeditor.ALT));
+ }
+
+ //auto populate image fields if selected image
+ if(wym._selected_image) {
+ jQuery(wym._options.dialogImageSelector + " " + wym._options.srcSelector)
+ .val(jQuery(wym._selected_image).attr(WYMeditor.SRC));
+ jQuery(wym._options.dialogImageSelector + " " + wym._options.titleSelector)
+ .val(jQuery(wym._selected_image).attr(WYMeditor.TITLE));
+ jQuery(wym._options.dialogImageSelector + " " + wym._options.altSelector)
+ .val(jQuery(wym._selected_image).attr(WYMeditor.ALT));
+ }
+
+ jQuery(wym._options.dialogLinkSelector + " "
+ + wym._options.submitSelector).click(function() {
+
+ var sUrl = jQuery(wym._options.hrefSelector).val();
+ if(sUrl.length > 0) {
+ var link;
+
+ if (selected[0] && selected[0].tagName.toLowerCase() == WYMeditor.A) {
+ link = selected;
+ } else {
+ wym._exec(WYMeditor.CREATE_LINK, sStamp);
+ link = jQuery("a[href=" + sStamp + "]", wym._doc.body);
+ }
+
+ link.attr(WYMeditor.HREF, sUrl)
+ .attr(WYMeditor.TITLE, jQuery(wym._options.titleSelector).val());
+
+ }
+ window.close();
+ });
+
+ jQuery(wym._options.dialogImageSelector + " "
+ + wym._options.submitSelector).click(function() {
+
+ var sUrl = jQuery(wym._options.srcSelector).val();
+ if(sUrl.length > 0) {
+
+ wym._exec(WYMeditor.INSERT_IMAGE, sStamp);
+
+ jQuery("img[src$=" + sStamp + "]", wym._doc.body)
+ .attr(WYMeditor.SRC, sUrl)
+ .attr(WYMeditor.TITLE, jQuery(wym._options.titleSelector).val())
+ .attr(WYMeditor.ALT, jQuery(wym._options.altSelector).val());
+ }
+ window.close();
+ });
+
+ jQuery(wym._options.dialogTableSelector + " "
+ + wym._options.submitSelector).click(function() {
+
+ var iRows = jQuery(wym._options.rowsSelector).val();
+ var iCols = jQuery(wym._options.colsSelector).val();
+
+ if(iRows > 0 && iCols > 0) {
+
+ var table = wym._doc.createElement(WYMeditor.TABLE);
+ var newRow = null;
+ var newCol = null;
+
+ var sCaption = jQuery(wym._options.captionSelector).val();
+
+ //we create the caption
+ var newCaption = table.createCaption();
+ newCaption.innerHTML = sCaption;
+
+ //we create the rows and cells
+ for(x=0; x<iRows; x++) {
+ newRow = table.insertRow(x);
+ for(y=0; y<iCols; y++) {newRow.insertCell(y);}
+ }
+
+ //set the summary attr
+ jQuery(table).attr('summary',
+ jQuery(wym._options.summarySelector).val());
+
+ //append the table after the selected container
+ var node = jQuery(wym.findUp(wym.container(),
+ WYMeditor.MAIN_CONTAINERS)).get(0);
+ if(!node || !node.parentNode) jQuery(wym._doc.body).append(table);
+ else jQuery(node).after(table);
+ }
+ window.close();
+ });
+
+ jQuery(wym._options.dialogPasteSelector + " "
+ + wym._options.submitSelector).click(function() {
+
+ var sText = jQuery(wym._options.textSelector).val();
+ wym.paste(sText);
+ window.close();
+ });
+
+ jQuery(wym._options.dialogPreviewSelector + " "
+ + wym._options.previewSelector)
+ .html(wym.xhtml());
+
+ //cancel button
+ jQuery(wym._options.cancelSelector).mousedown(function() {
+ window.close();
+ });
+
+ //pre-init functions
+ if(jQuery.isFunction(wym._options.postInitDialog))
+ wym._options.postInitDialog(wym,window);
+
+};
+
+/********** XHTML LEXER/PARSER **********/
+
+/*
+* @name xml
+* @description Use these methods to generate XML and XHTML compliant tags and
+* escape tag attributes correctly
+* @author Bermi Ferrer - http://bermi.org
+* @author David Heinemeier Hansson http://loudthinking.com
+*/
+WYMeditor.XmlHelper = function()
+{
+ this._entitiesDiv = document.createElement('div');
+ return this;
+};
+
+
+/*
+* @name tag
+* @description
+* Returns an empty HTML tag of type *name* which by default is XHTML
+* compliant. Setting *open* to true will create an open tag compatible
+* with HTML 4.0 and below. Add HTML attributes by passing an attributes
+* array to *options*. For attributes with no value like (disabled and
+* readonly), give it a value of true in the *options* array.
+*
+* Examples:
+*
+* this.tag('br')
+* # => <br />
+* this.tag ('br', false, true)
+* # => <br>
+* this.tag ('input', jQuery({type:'text',disabled:true }) )
+* # => <input type="text" disabled="disabled" />
+*/
+WYMeditor.XmlHelper.prototype.tag = function(name, options, open)
+{
+ options = options || false;
+ open = open || false;
+ return '<'+name+(options ? this.tagOptions(options) : '')+(open ? '>' : ' />');
+};
+
+/*
+* @name contentTag
+* @description
+* Returns a XML block tag of type *name* surrounding the *content*. Add
+* XML attributes by passing an attributes array to *options*. For attributes
+* with no value like (disabled and readonly), give it a value of true in
+* the *options* array. You can use symbols or strings for the attribute names.
+*
+* this.contentTag ('p', 'Hello world!' )
+* # => <p>Hello world!</p>
+* this.contentTag('div', this.contentTag('p', "Hello world!"), jQuery({class : "strong"}))
+* # => <div class="strong"><p>Hello world!</p></div>
+* this.contentTag("select", options, jQuery({multiple : true}))
+* # => <select multiple="multiple">...options...</select>
+*/
+WYMeditor.XmlHelper.prototype.contentTag = function(name, content, options)
+{
+ options = options || false;
+ return '<'+name+(options ? this.tagOptions(options) : '')+'>'+content+'</'+name+'>';
+};
+
+/*
+* @name cdataSection
+* @description
+* Returns a CDATA section for the given +content+. CDATA sections
+* are used to escape blocks of text containing characters which would
+* otherwise be recognized as markup. CDATA sections begin with the string
+* <tt>&lt;![CDATA[</tt> and } with (and may not contain) the string
+* <tt>]]></tt>.
+*/
+WYMeditor.XmlHelper.prototype.cdataSection = function(content)
+{
+ return '<![CDATA['+content+']]>';
+};
+
+
+/*
+* @name escapeOnce
+* @description
+* Returns the escaped +xml+ without affecting existing escaped entities.
+*
+* this.escapeOnce( "1 > 2 &amp; 3")
+* # => "1 &gt; 2 &amp; 3"
+*/
+WYMeditor.XmlHelper.prototype.escapeOnce = function(xml)
+{
+ return this._fixDoubleEscape(this.escapeEntities(xml));
+};
+
+/*
+* @name _fixDoubleEscape
+* @description
+* Fix double-escaped entities, such as &amp;amp;, &amp;#123;, etc.
+*/
+WYMeditor.XmlHelper.prototype._fixDoubleEscape = function(escaped)
+{
+ return escaped.replace(/&amp;([a-z]+|(#\d+));/ig, "&$1;");
+};
+
+/*
+* @name tagOptions
+* @description
+* Takes an array like the one generated by Tag.parseAttributes
+* [["src", "http://www.editam.com/?a=b&c=d&amp;f=g"], ["title", "Editam, <Simplified> CMS"]]
+* or an object like {src:"http://www.editam.com/?a=b&c=d&amp;f=g", title:"Editam, <Simplified> CMS"}
+* and returns a string properly escaped like
+* ' src = "http://www.editam.com/?a=b&amp;c=d&amp;f=g" title = "Editam, &lt;Simplified&gt; CMS"'
+* which is valid for strict XHTML
+*/
+WYMeditor.XmlHelper.prototype.tagOptions = function(options)
+{
+ var xml = this;
+ xml._formated_options = '';
+
+ for (var key in options) {
+ var formated_options = '';
+ var value = options[key];
+ if(typeof value != 'function' && value.length > 0) {
+
+ if(parseInt(key) == key && typeof value == 'object'){
+ key = value.shift();
+ value = value.pop();
+ }
+ if(key != '' && value != ''){
+ xml._formated_options += ' '+key+'="'+xml.escapeOnce(value)+'"';
+ }
+ }
+ }
+ return xml._formated_options;
+};
+
+/*
+* @name escapeEntities
+* @description
+* Escapes XML/HTML entities <, >, & and ". If seccond parameter is set to false it
+* will not escape ". If set to true it will also escape '
+*/
+WYMeditor.XmlHelper.prototype.escapeEntities = function(string, escape_quotes)
+{
+ this._entitiesDiv.innerHTML = string;
+ this._entitiesDiv.textContent = string;
+ var result = this._entitiesDiv.innerHTML;
+ if(typeof escape_quotes == 'undefined'){
+ if(escape_quotes != false) result = result.replace('"', '&quot;');
+ if(escape_quotes == true) result = result.replace('"', '&#039;');
+ }
+ return result;
+};
+
+/*
+* Parses a string conatining tag attributes and values an returns an array formated like
+* [["src", "http://www.editam.com"], ["title", "Editam, Simplified CMS"]]
+*/
+WYMeditor.XmlHelper.prototype.parseAttributes = function(tag_attributes)
+{
+ // Use a compounded regex to match single quoted, double quoted and unquoted attribute pairs
+ var result = [];
+ var matches = tag_attributes.split(/((=\s*")(")("))|((=\s*\')(\')(\'))|((=\s*[^>\s]*))/g);
+ if(matches.toString() != tag_attributes){
+ for (var k in matches) {
+ var v = matches[k];
+ if(typeof v != 'function' && v.length != 0){
+ var re = new RegExp('(\\w+)\\s*'+v);
+ if(match = tag_attributes.match(re) ){
+ var value = v.replace(/^[\s=]+/, "");
+ var delimiter = value.charAt(0);
+ delimiter = delimiter == '"' ? '"' : (delimiter=="'"?"'":'');
+ if(delimiter != ''){
+ value = delimiter == '"' ? value.replace(/^"|"+$/g, '') : value.replace(/^'|'+$/g, '');
+ }
+ tag_attributes = tag_attributes.replace(match[0],'');
+ result.push([match[1] , value]);
+ }
+ }
+ }
+ }
+ return result;
+};
+
+/**
+* XhtmlValidator for validating tag attributes
+*
+* @author Bermi Ferrer - http://bermi.org
+*/
+WYMeditor.XhtmlValidator = {
+ "_attributes":
+ {
+ "core":
+ {
+ "except":[
+ "base",
+ "head",
+ "html",
+ "meta",
+ "param",
+ "script",
+ "style",
+ "title"
+ ],
+ "attributes":[
+ "class",
+ "id",
+ "style",
+ "title",
+ "accesskey",
+ "tabindex"
+ ]
+ },
+ "language":
+ {
+ "except":[
+ "base",
+ "br",
+ "hr",
+ "iframe",
+ "param",
+ "script"
+ ],
+ "attributes":
+ {
+ "dir":[
+ "ltr",
+ "rtl"
+ ],
+ "0":"lang",
+ "1":"xml:lang"
+ }
+ },
+ "keyboard":
+ {
+ "attributes":
+ {
+ "accesskey":/^(\w){1}$/,
+ "tabindex":/^(\d)+$/
+ }
+ }
+ },
+ "_events":
+ {
+ "window":
+ {
+ "only":[
+ "body"
+ ],
+ "attributes":[
+ "onload",
+ "onunload"
+ ]
+ },
+ "form":
+ {
+ "only":[
+ "form",
+ "input",
+ "textarea",
+ "select",
+ "a",
+ "label",
+ "button"
+ ],
+ "attributes":[
+ "onchange",
+ "onsubmit",
+ "onreset",
+ "onselect",
+ "onblur",
+ "onfocus"
+ ]
+ },
+ "keyboard":
+ {
+ "except":[
+ "base",
+ "bdo",
+ "br",
+ "frame",
+ "frameset",
+ "head",
+ "html",
+ "iframe",
+ "meta",
+ "param",
+ "script",
+ "style",
+ "title"
+ ],
+ "attributes":[
+ "onkeydown",
+ "onkeypress",
+ "onkeyup"
+ ]
+ },
+ "mouse":
+ {
+ "except":[
+ "base",
+ "bdo",
+ "br",
+ "head",
+ "html",
+ "meta",
+ "param",
+ "script",
+ "style",
+ "title"
+ ],
+ "attributes":[
+ "onclick",
+ "ondblclick",
+ "onmousedown",
+ "onmousemove",
+ "onmouseover",
+ "onmouseout",
+ "onmouseup"
+ ]
+ }
+ },
+ "_tags":
+ {
+ "a":
+ {
+ "attributes":
+ {
+ "0":"charset",
+ "1":"coords",
+ "2":"href",
+ "3":"hreflang",
+ "4":"name",
+ "rel":/^(alternate|designates|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark| |shortcut|icon)+$/,
+ "rev":/^(alternate|designates|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark| |shortcut|icon)+$/,
+ "shape":/^(rect|rectangle|circ|circle|poly|polygon)$/,
+ "5":"type"
+ }
+ },
+ "0":"abbr",
+ "1":"acronym",
+ "2":"address",
+ "area":
+ {
+ "attributes":
+ {
+ "0":"alt",
+ "1":"coords",
+ "2":"href",
+ "nohref":/^(true|false)$/,
+ "shape":/^(rect|rectangle|circ|circle|poly|polygon)$/
+ },
+ "required":[
+ "alt"
+ ]
+ },
+ "3":"b",
+ "base":
+ {
+ "attributes":[
+ "href"
+ ],
+ "required":[
+ "href"
+ ]
+ },
+ "bdo":
+ {
+ "attributes":
+ {
+ "dir":/^(ltr|rtl)$/
+ },
+ "required":[
+ "dir"
+ ]
+ },
+ "4":"big",
+ "blockquote":
+ {
+ "attributes":[
+ "cite"
+ ]
+ },
+ "5":"body",
+ "6":"br",
+ "button":
+ {
+ "attributes":
+ {
+ "disabled":/^(disabled)$/,
+ "type":/^(button|reset|submit)$/,
+ "0":"value"
+ },
+ "inside":"form"
+ },
+ "7":"caption",
+ "8":"cite",
+ "9":"code",
+ "col":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify)$/,
+ "0":"char",
+ "1":"charoff",
+ "span":/^(\d)+$/,
+ "valign":/^(top|middle|bottom|baseline)$/,
+ "2":"width"
+ },
+ "inside":"colgroup"
+ },
+ "colgroup":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify)$/,
+ "0":"char",
+ "1":"charoff",
+ "span":/^(\d)+$/,
+ "valign":/^(top|middle|bottom|baseline)$/,
+ "2":"width"
+ }
+ },
+ "10":"dd",
+ "del":
+ {
+ "attributes":
+ {
+ "0":"cite",
+ "datetime":/^([0-9]){8}/
+ }
+ },
+ "11":"div",
+ "12":"dfn",
+ "13":"dl",
+ "14":"dt",
+ "15":"em",
+ "fieldset":
+ {
+ "inside":"form"
+ },
+ "form":
+ {
+ "attributes":
+ {
+ "0":"action",
+ "1":"accept",
+ "2":"accept-charset",
+ "3":"enctype",
+ "method":/^(get|post)$/
+ },
+ "required":[
+ "action"
+ ]
+ },
+ "head":
+ {
+ "attributes":[
+ "profile"
+ ]
+ },
+ "16":"h1",
+ "17":"h2",
+ "18":"h3",
+ "19":"h4",
+ "20":"h5",
+ "21":"h6",
+ "22":"hr",
+ "html":
+ {
+ "attributes":[
+ "xmlns"
+ ]
+ },
+ "23":"i",
+ "img":
+ {
+ "attributes":[
+ "alt",
+ "src",
+ "height",
+ "ismap",
+ "longdesc",
+ "usemap",
+ "width"
+ ],
+ "required":[
+ "alt",
+ "src"
+ ]
+ },
+ "input":
+ {
+ "attributes":
+ {
+ "0":"accept",
+ "1":"alt",
+ "checked":/^(checked)$/,
+ "disabled":/^(disabled)$/,
+ "maxlength":/^(\d)+$/,
+ "2":"name",
+ "readonly":/^(readonly)$/,
+ "size":/^(\d)+$/,
+ "3":"src",
+ "type":/^(button|checkbox|file|hidden|image|password|radio|reset|submit|text)$/,
+ "4":"value"
+ },
+ "inside":"form"
+ },
+ "ins":
+ {
+ "attributes":
+ {
+ "0":"cite",
+ "datetime":/^([0-9]){8}/
+ }
+ },
+ "24":"kbd",
+ "label":
+ {
+ "attributes":[
+ "for"
+ ],
+ "inside":"form"
+ },
+ "25":"legend",
+ "26":"li",
+ "link":
+ {
+ "attributes":
+ {
+ "0":"charset",
+ "1":"href",
+ "2":"hreflang",
+ "media":/^(all|braille|print|projection|screen|speech|,|;| )+$/i,
+ //next comment line required by Opera!
+ /*"rel":/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i,*/
+ "rel":/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i,
+ "rev":/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i,
+ "3":"type"
+ },
+ "inside":"head"
+ },
+ "map":
+ {
+ "attributes":[
+ "id",
+ "name"
+ ],
+ "required":[
+ "id"
+ ]
+ },
+ "meta":
+ {
+ "attributes":
+ {
+ "0":"content",
+ "http-equiv":/^(content\-type|expires|refresh|set\-cookie)$/i,
+ "1":"name",
+ "2":"scheme"
+ },
+ "required":[
+ "content"
+ ]
+ },
+ "27":"noscript",
+ "object":
+ {
+ "attributes":[
+ "archive",
+ "classid",
+ "codebase",
+ "codetype",
+ "data",
+ "declare",
+ "height",
+ "name",
+ "standby",
+ "type",
+ "usemap",
+ "width"
+ ]
+ },
+ "28":"ol",
+ "optgroup":
+ {
+ "attributes":
+ {
+ "0":"label",
+ "disabled": /^(disabled)$/
+ },
+ "required":[
+ "label"
+ ]
+ },
+ "option":
+ {
+ "attributes":
+ {
+ "0":"label",
+ "disabled":/^(disabled)$/,
+ "selected":/^(selected)$/,
+ "1":"value"
+ },
+ "inside":"select"
+ },
+ "29":"p",
+ "param":
+ {
+ "attributes":
+ {
+ "0":"type",
+ "valuetype":/^(data|ref|object)$/,
+ "1":"valuetype",
+ "2":"value"
+ },
+ "required":[
+ "name"
+ ]
+ },
+ "30":"pre",
+ "q":
+ {
+ "attributes":[
+ "cite"
+ ]
+ },
+ "31":"samp",
+ "script":
+ {
+ "attributes":
+ {
+ "type":/^(text\/ecmascript|text\/javascript|text\/jscript|text\/vbscript|text\/vbs|text\/xml)$/,
+ "0":"charset",
+ "defer":/^(defer)$/,
+ "1":"src"
+ },
+ "required":[
+ "type"
+ ]
+ },
+ "select":
+ {
+ "attributes":
+ {
+ "disabled":/^(disabled)$/,
+ "multiple":/^(multiple)$/,
+ "0":"name",
+ "1":"size"
+ },
+ "inside":"form"
+ },
+ "32":"small",
+ "33":"span",
+ "34":"strong",
+ "style":
+ {
+ "attributes":
+ {
+ "0":"type",
+ "media":/^(screen|tty|tv|projection|handheld|print|braille|aural|all)$/
+ },
+ "required":[
+ "type"
+ ]
+ },
+ "35":"sub",
+ "36":"sup",
+ "table":
+ {
+ "attributes":
+ {
+ "0":"border",
+ "1":"cellpadding",
+ "2":"cellspacing",
+ "frame":/^(void|above|below|hsides|lhs|rhs|vsides|box|border)$/,
+ "rules":/^(none|groups|rows|cols|all)$/,
+ "3":"summary",
+ "4":"width"
+ }
+ },
+ "tbody":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify)$/,
+ "0":"char",
+ "1":"charoff",
+ "valign":/^(top|middle|bottom|baseline)$/
+ }
+ },
+ "td":
+ {
+ "attributes":
+ {
+ "0":"abbr",
+ "align":/^(left|right|center|justify|char)$/,
+ "1":"axis",
+ "2":"char",
+ "3":"charoff",
+ "colspan":/^(\d)+$/,
+ "4":"headers",
+ "rowspan":/^(\d)+$/,
+ "scope":/^(col|colgroup|row|rowgroup)$/,
+ "valign":/^(top|middle|bottom|baseline)$/
+ }
+ },
+ "textarea":
+ {
+ "attributes":[
+ "cols",
+ "rows",
+ "disabled",
+ "name",
+ "readonly"
+ ],
+ "required":[
+ "cols",
+ "rows"
+ ],
+ "inside":"form"
+ },
+ "tfoot":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify)$/,
+ "0":"char",
+ "1":"charoff",
+ "valign":/^(top|middle|bottom)$/,
+ "2":"baseline"
+ }
+ },
+ "th":
+ {
+ "attributes":
+ {
+ "0":"abbr",
+ "align":/^(left|right|center|justify|char)$/,
+ "1":"axis",
+ "2":"char",
+ "3":"charoff",
+ "colspan":/^(\d)+$/,
+ "4":"headers",
+ "rowspan":/^(\d)+$/,
+ "scope":/^(col|colgroup|row|rowgroup)$/,
+ "valign":/^(top|middle|bottom|baseline)$/
+ }
+ },
+ "thead":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify)$/,
+ "0":"char",
+ "1":"charoff",
+ "valign":/^(top|middle|bottom|baseline)$/
+ }
+ },
+ "37":"title",
+ "tr":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify|char)$/,
+ "0":"char",
+ "1":"charoff",
+ "valign":/^(top|middle|bottom|baseline)$/
+ }
+ },
+ "38":"tt",
+ "39":"ul",
+ "40":"var"
+ },
+
+ // Temporary skiped attributes
+ skiped_attributes : [],
+ skiped_attribute_values : [],
+
+ getValidTagAttributes: function(tag, attributes)
+ {
+ var valid_attributes = {};
+ var possible_attributes = this.getPossibleTagAttributes(tag);
+ for(var attribute in attributes) {
+ var value = attributes[attribute];
+ var h = WYMeditor.Helper;
+ if(!h.contains(this.skiped_attributes, attribute) && !h.contains(this.skiped_attribute_values, value)){
+ if (typeof value != 'function' && h.contains(possible_attributes, attribute)) {
+ if (this.doesAttributeNeedsValidation(tag, attribute)) {
+ if(this.validateAttribute(tag, attribute, value)){
+ valid_attributes[attribute] = value;
+ }
+ }else{
+ valid_attributes[attribute] = value;
+ }
+ }
+ }
+ }
+ return valid_attributes;
+ },
+ getUniqueAttributesAndEventsForTag : function(tag)
+ {
+ var result = [];
+
+ if (this._tags[tag] && this._tags[tag]['attributes']) {
+ for (k in this._tags[tag]['attributes']) {
+ result.push(parseInt(k) == k ? this._tags[tag]['attributes'][k] : k);
+ }
+ }
+ return result;
+ },
+ getDefaultAttributesAndEventsForTags : function()
+ {
+ var result = [];
+ for (var key in this._events){
+ result.push(this._events[key]);
+ }
+ for (var key in this._attributes){
+ result.push(this._attributes[key]);
+ }
+ return result;
+ },
+ isValidTag : function(tag)
+ {
+ if(this._tags[tag]){
+ return true;
+ }
+ for(var key in this._tags){
+ if(this._tags[key] == tag){
+ return true;
+ }
+ }
+ return false;
+ },
+ getDefaultAttributesAndEventsForTag : function(tag)
+ {
+ var default_attributes = [];
+ if (this.isValidTag(tag)) {
+ var default_attributes_and_events = this.getDefaultAttributesAndEventsForTags();
+
+ for(var key in default_attributes_and_events) {
+ var defaults = default_attributes_and_events[key];
+ if(typeof defaults == 'object'){
+ var h = WYMeditor.Helper;
+ if ((defaults['except'] && h.contains(defaults['except'], tag)) || (defaults['only'] && !h.contains(defaults['only'], tag))) {
+ continue;
+ }
+
+ var tag_defaults = defaults['attributes'] ? defaults['attributes'] : defaults['events'];
+ for(var k in tag_defaults) {
+ default_attributes.push(typeof tag_defaults[k] != 'string' ? k : tag_defaults[k]);
+ }
+ }
+ }
+ }
+ return default_attributes;
+ },
+ doesAttributeNeedsValidation: function(tag, attribute)
+ {
+ return this._tags[tag] && ((this._tags[tag]['attributes'] && this._tags[tag]['attributes'][attribute]) || (this._tags[tag]['required'] &&
+ WYMeditor.Helper.contains(this._tags[tag]['required'], attribute)));
+ },
+ validateAttribute : function(tag, attribute, value)
+ {
+ if ( this._tags[tag] &&
+ (this._tags[tag]['attributes'] && this._tags[tag]['attributes'][attribute] && value.length > 0 && !value.match(this._tags[tag]['attributes'][attribute])) || // invalid format
+ (this._tags[tag] && this._tags[tag]['required'] && WYMeditor.Helper.contains(this._tags[tag]['required'], attribute) && value.length == 0) // required attribute
+ ) {
+ return false;
+ }
+ return typeof this._tags[tag] != 'undefined';
+ },
+ getPossibleTagAttributes : function(tag)
+ {
+ if (!this._possible_tag_attributes) {
+ this._possible_tag_attributes = {};
+ }
+ if (!this._possible_tag_attributes[tag]) {
+ this._possible_tag_attributes[tag] = this.getUniqueAttributesAndEventsForTag(tag).concat(this.getDefaultAttributesAndEventsForTag(tag));
+ }
+ return this._possible_tag_attributes[tag];
+ }
+};
+
+
+/**
+* Compounded regular expression. Any of
+* the contained patterns could match and
+* when one does, it's label is returned.
+*
+* Constructor. Starts with no patterns.
+* @param boolean case True for case sensitive, false
+* for insensitive.
+* @access public
+* @author Marcus Baker (http://lastcraft.com)
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.ParallelRegex = function(case_sensitive)
+{
+ this._case = case_sensitive;
+ this._patterns = [];
+ this._labels = [];
+ this._regex = null;
+ return this;
+};
+
+
+/**
+* Adds a pattern with an optional label.
+* @param string pattern Perl style regex, but ( and )
+* lose the usual meaning.
+* @param string label Label of regex to be returned
+* on a match.
+* @access public
+*/
+WYMeditor.ParallelRegex.prototype.addPattern = function(pattern, label)
+{
+ label = label || true;
+ var count = this._patterns.length;
+ this._patterns[count] = pattern;
+ this._labels[count] = label;
+ this._regex = null;
+};
+
+/**
+* Attempts to match all patterns at once against
+* a string.
+* @param string subject String to match against.
+*
+* @return boolean True on success.
+* @return string match First matched portion of
+* subject.
+* @access public
+*/
+WYMeditor.ParallelRegex.prototype.match = function(subject)
+{
+ if (this._patterns.length == 0) {
+ return [false, ''];
+ }
+ var matches = subject.match(this._getCompoundedRegex());
+
+ if(!matches){
+ return [false, ''];
+ }
+ var match = matches[0];
+ for (var i = 1; i < matches.length; i++) {
+ if (matches[i]) {
+ return [this._labels[i-1], match];
+ }
+ }
+ return [true, matches[0]];
+};
+
+/**
+* Compounds the patterns into a single
+* regular expression separated with the
+* "or" operator. Caches the regex.
+* Will automatically escape (, ) and / tokens.
+* @param array patterns List of patterns in order.
+* @access private
+*/
+WYMeditor.ParallelRegex.prototype._getCompoundedRegex = function()
+{
+ if (this._regex == null) {
+ for (var i = 0, count = this._patterns.length; i < count; i++) {
+ this._patterns[i] = '(' + this._untokenizeRegex(this._tokenizeRegex(this._patterns[i]).replace(/([\/\(\)])/g,'\\$1')) + ')';
+ }
+ this._regex = new RegExp(this._patterns.join("|") ,this._getPerlMatchingFlags());
+ }
+ return this._regex;
+};
+
+/**
+* Escape lookahead/lookbehind blocks
+*/
+WYMeditor.ParallelRegex.prototype._tokenizeRegex = function(regex)
+{
+ return regex.
+ replace(/\(\?(i|m|s|x|U)\)/, '~~~~~~Tk1\$1~~~~~~').
+ replace(/\(\?(\-[i|m|s|x|U])\)/, '~~~~~~Tk2\$1~~~~~~').
+ replace(/\(\?\=(.*)\)/, '~~~~~~Tk3\$1~~~~~~').
+ replace(/\(\?\!(.*)\)/, '~~~~~~Tk4\$1~~~~~~').
+ replace(/\(\?\<\=(.*)\)/, '~~~~~~Tk5\$1~~~~~~').
+ replace(/\(\?\<\!(.*)\)/, '~~~~~~Tk6\$1~~~~~~').
+ replace(/\(\?\:(.*)\)/, '~~~~~~Tk7\$1~~~~~~');
+};
+
+/**
+* Unscape lookahead/lookbehind blocks
+*/
+WYMeditor.ParallelRegex.prototype._untokenizeRegex = function(regex)
+{
+ return regex.
+ replace(/~~~~~~Tk1(.{1})~~~~~~/, "(?\$1)").
+ replace(/~~~~~~Tk2(.{2})~~~~~~/, "(?\$1)").
+ replace(/~~~~~~Tk3(.*)~~~~~~/, "(?=\$1)").
+ replace(/~~~~~~Tk4(.*)~~~~~~/, "(?!\$1)").
+ replace(/~~~~~~Tk5(.*)~~~~~~/, "(?<=\$1)").
+ replace(/~~~~~~Tk6(.*)~~~~~~/, "(?<!\$1)").
+ replace(/~~~~~~Tk7(.*)~~~~~~/, "(?:\$1)");
+};
+
+
+/**
+* Accessor for perl regex mode flags to use.
+* @return string Perl regex flags.
+* @access private
+*/
+WYMeditor.ParallelRegex.prototype._getPerlMatchingFlags = function()
+{
+ return (this._case ? "m" : "mi");
+};
+
+
+
+/**
+* States for a stack machine.
+*
+* Constructor. Starts in named state.
+* @param string start Starting state name.
+* @access public
+* @author Marcus Baker (http://lastcraft.com)
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.StateStack = function(start)
+{
+ this._stack = [start];
+ return this;
+};
+
+/**
+* Accessor for current state.
+* @return string State.
+* @access public
+*/
+WYMeditor.StateStack.prototype.getCurrent = function()
+{
+ return this._stack[this._stack.length - 1];
+};
+
+/**
+* Adds a state to the stack and sets it
+* to be the current state.
+* @param string state New state.
+* @access public
+*/
+WYMeditor.StateStack.prototype.enter = function(state)
+{
+ this._stack.push(state);
+};
+
+/**
+* Leaves the current state and reverts
+* to the previous one.
+* @return boolean False if we drop off
+* the bottom of the list.
+* @access public
+*/
+WYMeditor.StateStack.prototype.leave = function()
+{
+ if (this._stack.length == 1) {
+ return false;
+ }
+ this._stack.pop();
+ return true;
+};
+
+
+// GLOBALS
+WYMeditor.LEXER_ENTER = 1;
+WYMeditor.LEXER_MATCHED = 2;
+WYMeditor.LEXER_UNMATCHED = 3;
+WYMeditor.LEXER_EXIT = 4;
+WYMeditor.LEXER_SPECIAL = 5;
+
+
+/**
+* Accepts text and breaks it into tokens.
+* Some optimisation to make the sure the
+* content is only scanned by the PHP regex
+* parser once. Lexer modes must not start
+* with leading underscores.
+*
+* Sets up the lexer in case insensitive matching
+* by default.
+* @param Parser parser Handling strategy by reference.
+* @param string start Starting handler.
+* @param boolean case True for case sensitive.
+* @access public
+* @author Marcus Baker (http://lastcraft.com)
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.Lexer = function(parser, start, case_sensitive)
+{
+ start = start || 'accept';
+ this._case = case_sensitive || false;
+ this._regexes = {};
+ this._parser = parser;
+ this._mode = new WYMeditor.StateStack(start);
+ this._mode_handlers = {};
+ this._mode_handlers[start] = start;
+ return this;
+};
+
+/**
+* Adds a token search pattern for a particular
+* parsing mode. The pattern does not change the
+* current mode.
+* @param string pattern Perl style regex, but ( and )
+* lose the usual meaning.
+* @param string mode Should only apply this
+* pattern when dealing with
+* this type of input.
+* @access public
+*/
+WYMeditor.Lexer.prototype.addPattern = function(pattern, mode)
+{
+ var mode = mode || "accept";
+ if (typeof this._regexes[mode] == 'undefined') {
+ this._regexes[mode] = new WYMeditor.ParallelRegex(this._case);
+ }
+ this._regexes[mode].addPattern(pattern);
+ if (typeof this._mode_handlers[mode] == 'undefined') {
+ this._mode_handlers[mode] = mode;
+ }
+};
+
+/**
+* Adds a pattern that will enter a new parsing
+* mode. Useful for entering parenthesis, strings,
+* tags, etc.
+* @param string pattern Perl style regex, but ( and )
+* lose the usual meaning.
+* @param string mode Should only apply this
+* pattern when dealing with
+* this type of input.
+* @param string new_mode Change parsing to this new
+* nested mode.
+* @access public
+*/
+WYMeditor.Lexer.prototype.addEntryPattern = function(pattern, mode, new_mode)
+{
+ if (typeof this._regexes[mode] == 'undefined') {
+ this._regexes[mode] = new WYMeditor.ParallelRegex(this._case);
+ }
+ this._regexes[mode].addPattern(pattern, new_mode);
+ if (typeof this._mode_handlers[new_mode] == 'undefined') {
+ this._mode_handlers[new_mode] = new_mode;
+ }
+};
+
+/**
+* Adds a pattern that will exit the current mode
+* and re-enter the previous one.
+* @param string pattern Perl style regex, but ( and )
+* lose the usual meaning.
+* @param string mode Mode to leave.
+* @access public
+*/
+WYMeditor.Lexer.prototype.addExitPattern = function(pattern, mode)
+{
+ if (typeof this._regexes[mode] == 'undefined') {
+ this._regexes[mode] = new WYMeditor.ParallelRegex(this._case);
+ }
+ this._regexes[mode].addPattern(pattern, "__exit");
+ if (typeof this._mode_handlers[mode] == 'undefined') {
+ this._mode_handlers[mode] = mode;
+ }
+};
+
+/**
+* Adds a pattern that has a special mode. Acts as an entry
+* and exit pattern in one go, effectively calling a special
+* parser handler for this token only.
+* @param string pattern Perl style regex, but ( and )
+* lose the usual meaning.
+* @param string mode Should only apply this
+* pattern when dealing with
+* this type of input.
+* @param string special Use this mode for this one token.
+* @access public
+*/
+WYMeditor.Lexer.prototype.addSpecialPattern = function(pattern, mode, special)
+{
+ if (typeof this._regexes[mode] == 'undefined') {
+ this._regexes[mode] = new WYMeditor.ParallelRegex(this._case);
+ }
+ this._regexes[mode].addPattern(pattern, '_'+special);
+ if (typeof this._mode_handlers[special] == 'undefined') {
+ this._mode_handlers[special] = special;
+ }
+};
+
+/**
+* Adds a mapping from a mode to another handler.
+* @param string mode Mode to be remapped.
+* @param string handler New target handler.
+* @access public
+*/
+WYMeditor.Lexer.prototype.mapHandler = function(mode, handler)
+{
+ this._mode_handlers[mode] = handler;
+};
+
+/**
+* Splits the page text into tokens. Will fail
+* if the handlers report an error or if no
+* content is consumed. If successful then each
+* unparsed and parsed token invokes a call to the
+* held listener.
+* @param string raw Raw HTML text.
+* @return boolean True on success, else false.
+* @access public
+*/
+WYMeditor.Lexer.prototype.parse = function(raw)
+{
+ if (typeof this._parser == 'undefined') {
+ return false;
+ }
+
+ var length = raw.length;
+ var parsed;
+ while (typeof (parsed = this._reduce(raw)) == 'object') {
+ var raw = parsed[0];
+ var unmatched = parsed[1];
+ var matched = parsed[2];
+ var mode = parsed[3];
+
+ if (! this._dispatchTokens(unmatched, matched, mode)) {
+ return false;
+ }
+
+ if (raw == '') {
+ return true;
+ }
+ if (raw.length == length) {
+ return false;
+ }
+ length = raw.length;
+ }
+ if (! parsed ) {
+ return false;
+ }
+
+ return this._invokeParser(raw, WYMeditor.LEXER_UNMATCHED);
+};
+
+/**
+* Sends the matched token and any leading unmatched
+* text to the parser changing the lexer to a new
+* mode if one is listed.
+* @param string unmatched Unmatched leading portion.
+* @param string matched Actual token match.
+* @param string mode Mode after match. A boolean
+* false mode causes no change.
+* @return boolean False if there was any error
+* from the parser.
+* @access private
+*/
+WYMeditor.Lexer.prototype._dispatchTokens = function(unmatched, matched, mode)
+{
+ mode = mode || false;
+
+ if (! this._invokeParser(unmatched, WYMeditor.LEXER_UNMATCHED)) {
+ return false;
+ }
+
+ if (typeof mode == 'boolean') {
+ return this._invokeParser(matched, WYMeditor.LEXER_MATCHED);
+ }
+ if (this._isModeEnd(mode)) {
+ if (! this._invokeParser(matched, WYMeditor.LEXER_EXIT)) {
+ return false;
+ }
+ return this._mode.leave();
+ }
+ if (this._isSpecialMode(mode)) {
+ this._mode.enter(this._decodeSpecial(mode));
+ if (! this._invokeParser(matched, WYMeditor.LEXER_SPECIAL)) {
+ return false;
+ }
+ return this._mode.leave();
+ }
+ this._mode.enter(mode);
+
+ return this._invokeParser(matched, WYMeditor.LEXER_ENTER);
+};
+
+/**
+* Tests to see if the new mode is actually to leave
+* the current mode and pop an item from the matching
+* mode stack.
+* @param string mode Mode to test.
+* @return boolean True if this is the exit mode.
+* @access private
+*/
+WYMeditor.Lexer.prototype._isModeEnd = function(mode)
+{
+ return (mode === "__exit");
+};
+
+/**
+* Test to see if the mode is one where this mode
+* is entered for this token only and automatically
+* leaves immediately afterwoods.
+* @param string mode Mode to test.
+* @return boolean True if this is the exit mode.
+* @access private
+*/
+WYMeditor.Lexer.prototype._isSpecialMode = function(mode)
+{
+ return (mode.substring(0,1) == "_");
+};
+
+/**
+* Strips the magic underscore marking single token
+* modes.
+* @param string mode Mode to decode.
+* @return string Underlying mode name.
+* @access private
+*/
+WYMeditor.Lexer.prototype._decodeSpecial = function(mode)
+{
+ return mode.substring(1);
+};
+
+/**
+* Calls the parser method named after the current
+* mode. Empty content will be ignored. The lexer
+* has a parser handler for each mode in the lexer.
+* @param string content Text parsed.
+* @param boolean is_match Token is recognised rather
+* than unparsed data.
+* @access private
+*/
+WYMeditor.Lexer.prototype._invokeParser = function(content, is_match)
+{
+
+ if (content === '') {
+ return true;
+ }
+ var current = this._mode.getCurrent();
+ var handler = this._mode_handlers[current];
+ var result;
+ eval('result = this._parser.' + handler + '(content, is_match);');
+ return result;
+};
+
+/**
+* Tries to match a chunk of text and if successful
+* removes the recognised chunk and any leading
+* unparsed data. Empty strings will not be matched.
+* @param string raw The subject to parse. This is the
+* content that will be eaten.
+* @return array/boolean Three item list of unparsed
+* content followed by the
+* recognised token and finally the
+* action the parser is to take.
+* True if no match, false if there
+* is a parsing error.
+* @access private
+*/
+WYMeditor.Lexer.prototype._reduce = function(raw)
+{
+ var matched = this._regexes[this._mode.getCurrent()].match(raw);
+ var match = matched[1];
+ var action = matched[0];
+ if (action) {
+ var unparsed_character_count = raw.indexOf(match);
+ var unparsed = raw.substr(0, unparsed_character_count);
+ raw = raw.substring(unparsed_character_count + match.length);
+ return [raw, unparsed, match, action];
+ }
+ return true;
+};
+
+
+
+/**
+* This are the rules for breaking the XHTML code into events
+* handled by the provided parser.
+*
+* @author Marcus Baker (http://lastcraft.com)
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.XhtmlLexer = function(parser)
+{
+ jQuery.extend(this, new WYMeditor.Lexer(parser, 'Text'));
+
+ this.mapHandler('Text', 'Text');
+
+ this.addTokens();
+
+ this.init();
+
+ return this;
+};
+
+
+WYMeditor.XhtmlLexer.prototype.init = function()
+{
+};
+
+WYMeditor.XhtmlLexer.prototype.addTokens = function()
+{
+ this.addCommentTokens('Text');
+ this.addScriptTokens('Text');
+ this.addCssTokens('Text');
+ this.addTagTokens('Text');
+};
+
+WYMeditor.XhtmlLexer.prototype.addCommentTokens = function(scope)
+{
+ this.addEntryPattern("<!--", scope, 'Comment');
+ this.addExitPattern("-->", 'Comment');
+};
+
+WYMeditor.XhtmlLexer.prototype.addScriptTokens = function(scope)
+{
+ this.addEntryPattern("<script", scope, 'Script');
+ this.addExitPattern("</script>", 'Script');
+};
+
+WYMeditor.XhtmlLexer.prototype.addCssTokens = function(scope)
+{
+ this.addEntryPattern("<style", scope, 'Css');
+ this.addExitPattern("</style>", 'Css');
+};
+
+WYMeditor.XhtmlLexer.prototype.addTagTokens = function(scope)
+{
+ this.addSpecialPattern("<\\s*[a-z0-9:\-]+\\s*>", scope, 'OpeningTag');
+ this.addEntryPattern("<[a-z0-9:\-]+"+'[\\\/ \\\>]+', scope, 'OpeningTag');
+ this.addInTagDeclarationTokens('OpeningTag');
+
+ this.addSpecialPattern("</\\s*[a-z0-9:\-]+\\s*>", scope, 'ClosingTag');
+
+};
+
+WYMeditor.XhtmlLexer.prototype.addInTagDeclarationTokens = function(scope)
+{
+ this.addSpecialPattern('\\s+', scope, 'Ignore');
+
+ this.addAttributeTokens(scope);
+
+ this.addExitPattern('/>', scope);
+ this.addExitPattern('>', scope);
+
+};
+
+WYMeditor.XhtmlLexer.prototype.addAttributeTokens = function(scope)
+{
+ this.addSpecialPattern("\\s*[a-z-_0-9]*:?[a-z-_0-9]+\\s*(?=\=)\\s*", scope, 'TagAttributes');
+
+ this.addEntryPattern('=\\s*"', scope, 'DoubleQuotedAttribute');
+ this.addPattern("\\\\\"", 'DoubleQuotedAttribute');
+ this.addExitPattern('"', 'DoubleQuotedAttribute');
+
+ this.addEntryPattern("=\\s*'", scope, 'SingleQuotedAttribute');
+ this.addPattern("\\\\'", 'SingleQuotedAttribute');
+ this.addExitPattern("'", 'SingleQuotedAttribute');
+
+ this.addSpecialPattern('=\\s*[^>\\s]*', scope, 'UnquotedAttribute');
+};
+
+
+
+/**
+* XHTML Parser.
+*
+* This XHTML parser will trigger the events available on on
+* current SaxListener
+*
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.XhtmlParser = function(Listener, mode)
+{
+ var mode = mode || 'Text';
+ this._Lexer = new WYMeditor.XhtmlLexer(this);
+ this._Listener = Listener;
+ this._mode = mode;
+ this._matches = [];
+ this._last_match = '';
+ this._current_match = '';
+
+ return this;
+};
+
+WYMeditor.XhtmlParser.prototype.parse = function(raw)
+{
+ this._Lexer.parse(this.beforeParsing(raw));
+ return this.afterParsing(this._Listener.getResult());
+};
+
+WYMeditor.XhtmlParser.prototype.beforeParsing = function(raw)
+{
+ if(raw.match(/class="MsoNormal"/) || raw.match(/ns = "urn:schemas-microsoft-com/)){
+ // Usefull for cleaning up content pasted from other sources (MSWord)
+ this._Listener.avoidStylingTagsAndAttributes();
+ }
+ return this._Listener.beforeParsing(raw);
+};
+
+WYMeditor.XhtmlParser.prototype.afterParsing = function(parsed)
+{
+ if(this._Listener._avoiding_tags_implicitly){
+ this._Listener.allowStylingTagsAndAttributes();
+ }
+ return this._Listener.afterParsing(parsed);
+};
+
+
+WYMeditor.XhtmlParser.prototype.Ignore = function(match, state)
+{
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.Text = function(text)
+{
+ this._Listener.addContent(text);
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.Comment = function(match, status)
+{
+ return this._addNonTagBlock(match, status, 'addComment');
+};
+
+WYMeditor.XhtmlParser.prototype.Script = function(match, status)
+{
+ return this._addNonTagBlock(match, status, 'addScript');
+};
+
+WYMeditor.XhtmlParser.prototype.Css = function(match, status)
+{
+ return this._addNonTagBlock(match, status, 'addCss');
+};
+
+WYMeditor.XhtmlParser.prototype._addNonTagBlock = function(match, state, type)
+{
+ switch (state){
+ case WYMeditor.LEXER_ENTER:
+ this._non_tag = match;
+ break;
+ case WYMeditor.LEXER_UNMATCHED:
+ this._non_tag += match;
+ break;
+ case WYMeditor.LEXER_EXIT:
+ switch(type) {
+ case 'addComment':
+ this._Listener.addComment(this._non_tag+match);
+ break;
+ case 'addScript':
+ this._Listener.addScript(this._non_tag+match);
+ break;
+ case 'addCss':
+ this._Listener.addCss(this._non_tag+match);
+ break;
+ }
+ }
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.OpeningTag = function(match, state)
+{
+ switch (state){
+ case WYMeditor.LEXER_ENTER:
+ this._tag = this.normalizeTag(match);
+ this._tag_attributes = {};
+ break;
+ case WYMeditor.LEXER_SPECIAL:
+ this._callOpenTagListener(this.normalizeTag(match));
+ break;
+ case WYMeditor.LEXER_EXIT:
+ this._callOpenTagListener(this._tag, this._tag_attributes);
+ }
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.ClosingTag = function(match, state)
+{
+ this._callCloseTagListener(this.normalizeTag(match));
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype._callOpenTagListener = function(tag, attributes)
+{
+ var attributes = attributes || {};
+ this.autoCloseUnclosedBeforeNewOpening(tag);
+
+ if(this._Listener.isBlockTag(tag)){
+ this._Listener._tag_stack.push(tag);
+ this._Listener.fixNestingBeforeOpeningBlockTag(tag, attributes);
+ this._Listener.openBlockTag(tag, attributes);
+ this._increaseOpenTagCounter(tag);
+ }else if(this._Listener.isInlineTag(tag)){
+ this._Listener.inlineTag(tag, attributes);
+ }else{
+ this._Listener.openUnknownTag(tag, attributes);
+ this._increaseOpenTagCounter(tag);
+ }
+ this._Listener.last_tag = tag;
+ this._Listener.last_tag_opened = true;
+ this._Listener.last_tag_attributes = attributes;
+};
+
+WYMeditor.XhtmlParser.prototype._callCloseTagListener = function(tag)
+{
+ if(this._decreaseOpenTagCounter(tag)){
+ this.autoCloseUnclosedBeforeTagClosing(tag);
+
+ if(this._Listener.isBlockTag(tag)){
+ var expected_tag = this._Listener._tag_stack.pop();
+ if(expected_tag == false){
+ return;
+ }else if(expected_tag != tag){
+ tag = expected_tag;
+ }
+ this._Listener.closeBlockTag(tag);
+ }else{
+ this._Listener.closeUnknownTag(tag);
+ }
+ }else{
+ this._Listener.closeUnopenedTag(tag);
+ }
+ this._Listener.last_tag = tag;
+ this._Listener.last_tag_opened = false;
+};
+
+WYMeditor.XhtmlParser.prototype._increaseOpenTagCounter = function(tag)
+{
+ this._Listener._open_tags[tag] = this._Listener._open_tags[tag] || 0;
+ this._Listener._open_tags[tag]++;
+};
+
+WYMeditor.XhtmlParser.prototype._decreaseOpenTagCounter = function(tag)
+{
+ if(this._Listener._open_tags[tag]){
+ this._Listener._open_tags[tag]--;
+ if(this._Listener._open_tags[tag] == 0){
+ this._Listener._open_tags[tag] = undefined;
+ }
+ return true;
+ }
+ return false;
+};
+
+WYMeditor.XhtmlParser.prototype.autoCloseUnclosedBeforeNewOpening = function(new_tag)
+{
+ this._autoCloseUnclosed(new_tag, false);
+};
+
+WYMeditor.XhtmlParser.prototype.autoCloseUnclosedBeforeTagClosing = function(tag)
+{
+ this._autoCloseUnclosed(tag, true);
+};
+
+WYMeditor.XhtmlParser.prototype._autoCloseUnclosed = function(new_tag, closing)
+{
+ var closing = closing || false;
+ if(this._Listener._open_tags){
+ for (var tag in this._Listener._open_tags) {
+ var counter = this._Listener._open_tags[tag];
+ if(counter > 0 && this._Listener.shouldCloseTagAutomatically(tag, new_tag, closing)){
+ this._callCloseTagListener(tag, true);
+ }
+ }
+ }
+};
+
+WYMeditor.XhtmlParser.prototype.getTagReplacements = function()
+{
+ return this._Listener.getTagReplacements();
+};
+
+WYMeditor.XhtmlParser.prototype.normalizeTag = function(tag)
+{
+ tag = tag.replace(/^([\s<\/>]*)|([\s<\/>]*)$/gm,'').toLowerCase();
+ var tags = this._Listener.getTagReplacements();
+ if(tags[tag]){
+ return tags[tag];
+ }
+ return tag;
+};
+
+WYMeditor.XhtmlParser.prototype.TagAttributes = function(match, state)
+{
+ if(WYMeditor.LEXER_SPECIAL == state){
+ this._current_attribute = match;
+ }
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.DoubleQuotedAttribute = function(match, state)
+{
+ if(WYMeditor.LEXER_UNMATCHED == state){
+ this._tag_attributes[this._current_attribute] = match;
+ }
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.SingleQuotedAttribute = function(match, state)
+{
+ if(WYMeditor.LEXER_UNMATCHED == state){
+ this._tag_attributes[this._current_attribute] = match;
+ }
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.UnquotedAttribute = function(match, state)
+{
+ this._tag_attributes[this._current_attribute] = match.replace(/^=/,'');
+ return true;
+};
+
+
+
+/**
+* XHTML Sax parser.
+*
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.XhtmlSaxListener = function()
+{
+ this.output = '';
+ this.helper = new WYMeditor.XmlHelper();
+ this._open_tags = {};
+ this.validator = WYMeditor.XhtmlValidator;
+ this._tag_stack = [];
+ this.avoided_tags = [];
+
+ this.entities = {
+ '&nbsp;':'&#160;','&iexcl;':'&#161;','&cent;':'&#162;',
+ '&pound;':'&#163;','&curren;':'&#164;','&yen;':'&#165;',
+ '&brvbar;':'&#166;','&sect;':'&#167;','&uml;':'&#168;',
+ '&copy;':'&#169;','&ordf;':'&#170;','&laquo;':'&#171;',
+ '&not;':'&#172;','&shy;':'&#173;','&reg;':'&#174;',
+ '&macr;':'&#175;','&deg;':'&#176;','&plusmn;':'&#177;',
+ '&sup2;':'&#178;','&sup3;':'&#179;','&acute;':'&#180;',
+ '&micro;':'&#181;','&para;':'&#182;','&middot;':'&#183;',
+ '&cedil;':'&#184;','&sup1;':'&#185;','&ordm;':'&#186;',
+ '&raquo;':'&#187;','&frac14;':'&#188;','&frac12;':'&#189;',
+ '&frac34;':'&#190;','&iquest;':'&#191;','&Agrave;':'&#192;',
+ '&Aacute;':'&#193;','&Acirc;':'&#194;','&Atilde;':'&#195;',
+ '&Auml;':'&#196;','&Aring;':'&#197;','&AElig;':'&#198;',
+ '&Ccedil;':'&#199;','&Egrave;':'&#200;','&Eacute;':'&#201;',
+ '&Ecirc;':'&#202;','&Euml;':'&#203;','&Igrave;':'&#204;',
+ '&Iacute;':'&#205;','&Icirc;':'&#206;','&Iuml;':'&#207;',
+ '&ETH;':'&#208;','&Ntilde;':'&#209;','&Ograve;':'&#210;',
+ '&Oacute;':'&#211;','&Ocirc;':'&#212;','&Otilde;':'&#213;',
+ '&Ouml;':'&#214;','&times;':'&#215;','&Oslash;':'&#216;',
+ '&Ugrave;':'&#217;','&Uacute;':'&#218;','&Ucirc;':'&#219;',
+ '&Uuml;':'&#220;','&Yacute;':'&#221;','&THORN;':'&#222;',
+ '&szlig;':'&#223;','&agrave;':'&#224;','&aacute;':'&#225;',
+ '&acirc;':'&#226;','&atilde;':'&#227;','&auml;':'&#228;',
+ '&aring;':'&#229;','&aelig;':'&#230;','&ccedil;':'&#231;',
+ '&egrave;':'&#232;','&eacute;':'&#233;','&ecirc;':'&#234;',
+ '&euml;':'&#235;','&igrave;':'&#236;','&iacute;':'&#237;',
+ '&icirc;':'&#238;','&iuml;':'&#239;','&eth;':'&#240;',
+ '&ntilde;':'&#241;','&ograve;':'&#242;','&oacute;':'&#243;',
+ '&ocirc;':'&#244;','&otilde;':'&#245;','&ouml;':'&#246;',
+ '&divide;':'&#247;','&oslash;':'&#248;','&ugrave;':'&#249;',
+ '&uacute;':'&#250;','&ucirc;':'&#251;','&uuml;':'&#252;',
+ '&yacute;':'&#253;','&thorn;':'&#254;','&yuml;':'&#255;',
+ '&OElig;':'&#338;','&oelig;':'&#339;','&Scaron;':'&#352;',
+ '&scaron;':'&#353;','&Yuml;':'&#376;','&fnof;':'&#402;',
+ '&circ;':'&#710;','&tilde;':'&#732;','&Alpha;':'&#913;',
+ '&Beta;':'&#914;','&Gamma;':'&#915;','&Delta;':'&#916;',
+ '&Epsilon;':'&#917;','&Zeta;':'&#918;','&Eta;':'&#919;',
+ '&Theta;':'&#920;','&Iota;':'&#921;','&Kappa;':'&#922;',
+ '&Lambda;':'&#923;','&Mu;':'&#924;','&Nu;':'&#925;',
+ '&Xi;':'&#926;','&Omicron;':'&#927;','&Pi;':'&#928;',
+ '&Rho;':'&#929;','&Sigma;':'&#931;','&Tau;':'&#932;',
+ '&Upsilon;':'&#933;','&Phi;':'&#934;','&Chi;':'&#935;',
+ '&Psi;':'&#936;','&Omega;':'&#937;','&alpha;':'&#945;',
+ '&beta;':'&#946;','&gamma;':'&#947;','&delta;':'&#948;',
+ '&epsilon;':'&#949;','&zeta;':'&#950;','&eta;':'&#951;',
+ '&theta;':'&#952;','&iota;':'&#953;','&kappa;':'&#954;',
+ '&lambda;':'&#955;','&mu;':'&#956;','&nu;':'&#957;',
+ '&xi;':'&#958;','&omicron;':'&#959;','&pi;':'&#960;',
+ '&rho;':'&#961;','&sigmaf;':'&#962;','&sigma;':'&#963;',
+ '&tau;':'&#964;','&upsilon;':'&#965;','&phi;':'&#966;',
+ '&chi;':'&#967;','&psi;':'&#968;','&omega;':'&#969;',
+ '&thetasym;':'&#977;','&upsih;':'&#978;','&piv;':'&#982;',
+ '&ensp;':'&#8194;','&emsp;':'&#8195;','&thinsp;':'&#8201;',
+ '&zwnj;':'&#8204;','&zwj;':'&#8205;','&lrm;':'&#8206;',
+ '&rlm;':'&#8207;','&ndash;':'&#8211;','&mdash;':'&#8212;',
+ '&lsquo;':'&#8216;','&rsquo;':'&#8217;','&sbquo;':'&#8218;',
+ '&ldquo;':'&#8220;','&rdquo;':'&#8221;','&bdquo;':'&#8222;',
+ '&dagger;':'&#8224;','&Dagger;':'&#8225;','&bull;':'&#8226;',
+ '&hellip;':'&#8230;','&permil;':'&#8240;','&prime;':'&#8242;',
+ '&Prime;':'&#8243;','&lsaquo;':'&#8249;','&rsaquo;':'&#8250;',
+ '&oline;':'&#8254;','&frasl;':'&#8260;','&euro;':'&#8364;',
+ '&image;':'&#8465;','&weierp;':'&#8472;','&real;':'&#8476;',
+ '&trade;':'&#8482;','&alefsym;':'&#8501;','&larr;':'&#8592;',
+ '&uarr;':'&#8593;','&rarr;':'&#8594;','&darr;':'&#8595;',
+ '&harr;':'&#8596;','&crarr;':'&#8629;','&lArr;':'&#8656;',
+ '&uArr;':'&#8657;','&rArr;':'&#8658;','&dArr;':'&#8659;',
+ '&hArr;':'&#8660;','&forall;':'&#8704;','&part;':'&#8706;',
+ '&exist;':'&#8707;','&empty;':'&#8709;','&nabla;':'&#8711;',
+ '&isin;':'&#8712;','&notin;':'&#8713;','&ni;':'&#8715;',
+ '&prod;':'&#8719;','&sum;':'&#8721;','&minus;':'&#8722;',
+ '&lowast;':'&#8727;','&radic;':'&#8730;','&prop;':'&#8733;',
+ '&infin;':'&#8734;','&ang;':'&#8736;','&and;':'&#8743;',
+ '&or;':'&#8744;','&cap;':'&#8745;','&cup;':'&#8746;',
+ '&int;':'&#8747;','&there4;':'&#8756;','&sim;':'&#8764;',
+ '&cong;':'&#8773;','&asymp;':'&#8776;','&ne;':'&#8800;',
+ '&equiv;':'&#8801;','&le;':'&#8804;','&ge;':'&#8805;',
+ '&sub;':'&#8834;','&sup;':'&#8835;','&nsub;':'&#8836;',
+ '&sube;':'&#8838;','&supe;':'&#8839;','&oplus;':'&#8853;',
+ '&otimes;':'&#8855;','&perp;':'&#8869;','&sdot;':'&#8901;',
+ '&lceil;':'&#8968;','&rceil;':'&#8969;','&lfloor;':'&#8970;',
+ '&rfloor;':'&#8971;','&lang;':'&#9001;','&rang;':'&#9002;',
+ '&loz;':'&#9674;','&spades;':'&#9824;','&clubs;':'&#9827;',
+ '&hearts;':'&#9829;','&diams;':'&#9830;'};
+
+ this.block_tags = ["a", "abbr", "acronym", "address", "area", "b",
+ "base", "bdo", "big", "blockquote", "body", "button",
+ "caption", "cite", "code", "col", "colgroup", "dd", "del", "div",
+ "dfn", "dl", "dt", "em", "fieldset", "form", "head", "h1", "h2",
+ "h3", "h4", "h5", "h6", "html", "i", "ins",
+ "kbd", "label", "legend", "li", "map", "noscript",
+ "object", "ol", "optgroup", "option", "p", "param", "pre", "q",
+ "samp", "script", "select", "small", "span", "strong", "style",
+ "sub", "sup", "table", "tbody", "td", "textarea", "tfoot", "th",
+ "thead", "title", "tr", "tt", "ul", "var", "extends"];
+
+
+ this.inline_tags = ["br", "hr", "img", "input"];
+
+ return this;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.shouldCloseTagAutomatically = function(tag, now_on_tag, closing)
+{
+ var closing = closing || false;
+ if(tag == 'td'){
+ if((closing && now_on_tag == 'tr') || (!closing && now_on_tag == 'td')){
+ return true;
+ }
+ }
+ if(tag == 'option'){
+ if((closing && now_on_tag == 'select') || (!closing && now_on_tag == 'option')){
+ return true;
+ }
+ }
+ return false;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.beforeParsing = function(raw)
+{
+ this.output = '';
+ return raw;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.afterParsing = function(xhtml)
+{
+ xhtml = this.replaceNamedEntities(xhtml);
+ xhtml = this.joinRepeatedEntities(xhtml);
+ xhtml = this.removeEmptyTags(xhtml);
+ xhtml = this.removeBrInPre(xhtml);
+ return xhtml;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.replaceNamedEntities = function(xhtml)
+{
+ for (var entity in this.entities) {
+ xhtml = xhtml.replace(new RegExp(entity, 'g'), this.entities[entity]);
+ }
+ return xhtml;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.joinRepeatedEntities = function(xhtml)
+{
+ var tags = 'em|strong|sub|sup|acronym|pre|del|address';
+ return xhtml.replace(new RegExp('<\/('+tags+')><\\1>' ,''),'').
+ replace(new RegExp('(\s*<('+tags+')>\s*){2}(.*)(\s*<\/\\2>\s*){2}' ,''),'<\$2>\$3<\$2>');
+};
+
+WYMeditor.XhtmlSaxListener.prototype.removeEmptyTags = function(xhtml)
+{
+ return xhtml.replace(new RegExp('<('+this.block_tags.join("|").replace(/\|td/,'').replace(/\|th/, '')+')>(<br \/>|&#160;|&nbsp;|\\s)*<\/\\1>' ,'g'),'');
+};
+
+WYMeditor.XhtmlSaxListener.prototype.removeBrInPre = function(xhtml)
+{
+ var matches = xhtml.match(new RegExp('<pre[^>]*>(.*?)<\/pre>','gmi'));
+ if(matches) {
+ for(var i=0; i<matches.length; i++) {
+ xhtml = xhtml.replace(matches[i], matches[i].replace(new RegExp('<br \/>', 'g'), String.fromCharCode(13,10)));
+ }
+ }
+ return xhtml;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.getResult = function()
+{
+ return this.output;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.getTagReplacements = function()
+{
+ return {'b':'strong', 'i':'em'};
+};
+
+WYMeditor.XhtmlSaxListener.prototype.addContent = function(text)
+{
+ this.output += text;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.addComment = function(text)
+{
+ if(this.remove_comments){
+ this.output += text;
+ }
+};
+
+WYMeditor.XhtmlSaxListener.prototype.addScript = function(text)
+{
+ if(!this.remove_scripts){
+ this.output += text;
+ }
+};
+
+WYMeditor.XhtmlSaxListener.prototype.addCss = function(text)
+{
+ if(!this.remove_embeded_styles){
+ this.output += text;
+ }
+};
+
+WYMeditor.XhtmlSaxListener.prototype.openBlockTag = function(tag, attributes)
+{
+ this.output += this.helper.tag(tag, this.validator.getValidTagAttributes(tag, attributes), true);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.inlineTag = function(tag, attributes)
+{
+ this.output += this.helper.tag(tag, this.validator.getValidTagAttributes(tag, attributes));
+};
+
+WYMeditor.XhtmlSaxListener.prototype.openUnknownTag = function(tag, attributes)
+{
+ //this.output += this.helper.tag(tag, attributes, true);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.closeBlockTag = function(tag)
+{
+ this.output = this.output.replace(/<br \/>$/, '')+this._getClosingTagContent('before', tag)+"</"+tag+">"+this._getClosingTagContent('after', tag);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.closeUnknownTag = function(tag)
+{
+ //this.output += "</"+tag+">";
+};
+
+WYMeditor.XhtmlSaxListener.prototype.closeUnopenedTag = function(tag)
+{
+ this.output += "</"+tag+">";
+};
+
+WYMeditor.XhtmlSaxListener.prototype.avoidStylingTagsAndAttributes = function()
+{
+ this.avoided_tags = ['div','span'];
+ this.validator.skiped_attributes = ['style'];
+ this.validator.skiped_attribute_values = ['MsoNormal','main1']; // MS Word attributes for class
+ this._avoiding_tags_implicitly = true;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.allowStylingTagsAndAttributes = function()
+{
+ this.avoided_tags = [];
+ this.validator.skiped_attributes = [];
+ this.validator.skiped_attribute_values = [];
+ this._avoiding_tags_implicitly = false;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.isBlockTag = function(tag)
+{
+ return !WYMeditor.Helper.contains(this.avoided_tags, tag) && WYMeditor.Helper.contains(this.block_tags, tag);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.isInlineTag = function(tag)
+{
+ return !WYMeditor.Helper.contains(this.avoided_tags, tag) && WYMeditor.Helper.contains(this.inline_tags, tag);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.insertContentAfterClosingTag = function(tag, content)
+{
+ this._insertContentWhenClosingTag('after', tag, content);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.insertContentBeforeClosingTag = function(tag, content)
+{
+ this._insertContentWhenClosingTag('before', tag, content);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.fixNestingBeforeOpeningBlockTag = function(tag, attributes)
+{
+ if(tag != 'li' && (tag == 'ul' || tag == 'ol') && this.last_tag && !this.last_tag_opened && this.last_tag == 'li'){
+ this.output = this.output.replace(/<\/li>$/, '');
+ this.insertContentAfterClosingTag(tag, '</li>');
+ }
+};
+
+WYMeditor.XhtmlSaxListener.prototype._insertContentWhenClosingTag = function(position, tag, content)
+{
+ if(!this['_insert_'+position+'_closing']){
+ this['_insert_'+position+'_closing'] = [];
+ }
+ if(!this['_insert_'+position+'_closing'][tag]){
+ this['_insert_'+position+'_closing'][tag] = [];
+ }
+ this['_insert_'+position+'_closing'][tag].push(content);
+};
+
+WYMeditor.XhtmlSaxListener.prototype._getClosingTagContent = function(position, tag)
+{
+ if( this['_insert_'+position+'_closing'] &&
+ this['_insert_'+position+'_closing'][tag] &&
+ this['_insert_'+position+'_closing'][tag].length > 0){
+ return this['_insert_'+position+'_closing'][tag].pop();
+ }
+ return '';
+};
+
+
+/********** CSS PARSER **********/
+
+
+WYMeditor.WymCssLexer = function(parser, only_wym_blocks)
+{
+ var only_wym_blocks = (typeof only_wym_blocks == 'undefined' ? true : only_wym_blocks);
+
+ jQuery.extend(this, new WYMeditor.Lexer(parser, (only_wym_blocks?'Ignore':'WymCss')));
+
+ this.mapHandler('WymCss', 'Ignore');
+
+ if(only_wym_blocks == true){
+ this.addEntryPattern("/\\\x2a[<\\s]*WYMeditor[>\\s]*\\\x2a/", 'Ignore', 'WymCss');
+ this.addExitPattern("/\\\x2a[<\/\\s]*WYMeditor[>\\s]*\\\x2a/", 'WymCss');
+ }
+
+ this.addSpecialPattern("[\\sa-z1-6]*\\\x2e[a-z-_0-9]+", 'WymCss', 'WymCssStyleDeclaration');
+
+ this.addEntryPattern("/\\\x2a", 'WymCss', 'WymCssComment');
+ this.addExitPattern("\\\x2a/", 'WymCssComment');
+
+ this.addEntryPattern("\x7b", 'WymCss', 'WymCssStyle');
+ this.addExitPattern("\x7d", 'WymCssStyle');
+
+ this.addEntryPattern("/\\\x2a", 'WymCssStyle', 'WymCssFeedbackStyle');
+ this.addExitPattern("\\\x2a/", 'WymCssFeedbackStyle');
+
+ return this;
+};
+
+WYMeditor.WymCssParser = function()
+{
+ this._in_style = false;
+ this._has_title = false;
+ this.only_wym_blocks = true;
+ this.css_settings = {'classesItems':[], 'editorStyles':[], 'dialogStyles':[]};
+ return this;
+};
+
+WYMeditor.WymCssParser.prototype.parse = function(raw, only_wym_blocks)
+{
+ var only_wym_blocks = (typeof only_wym_blocks == 'undefined' ? this.only_wym_blocks : only_wym_blocks);
+ this._Lexer = new WYMeditor.WymCssLexer(this, only_wym_blocks);
+ this._Lexer.parse(raw);
+};
+
+WYMeditor.WymCssParser.prototype.Ignore = function(match, state)
+{
+ return true;
+};
+
+WYMeditor.WymCssParser.prototype.WymCssComment = function(text, status)
+{
+ if(text.match(/end[a-z0-9\s]*wym[a-z0-9\s]*/mi)){
+ return false;
+ }
+ if(status == WYMeditor.LEXER_UNMATCHED){
+ if(!this._in_style){
+ this._has_title = true;
+ this._current_item = {'title':WYMeditor.Helper.trim(text)};
+ }else{
+ if(this._current_item[this._current_element]){
+ if(!this._current_item[this._current_element].expressions){
+ this._current_item[this._current_element].expressions = [text];
+ }else{
+ this._current_item[this._current_element].expressions.push(text);
+ }
+ }
+ }
+ this._in_style = true;
+ }
+ return true;
+};
+
+WYMeditor.WymCssParser.prototype.WymCssStyle = function(match, status)
+{
+ if(status == WYMeditor.LEXER_UNMATCHED){
+ match = WYMeditor.Helper.trim(match);
+ if(match != ''){
+ this._current_item[this._current_element].style = match;
+ }
+ }else if (status == WYMeditor.LEXER_EXIT){
+ this._in_style = false;
+ this._has_title = false;
+ this.addStyleSetting(this._current_item);
+ }
+ return true;
+};
+
+WYMeditor.WymCssParser.prototype.WymCssFeedbackStyle = function(match, status)
+{
+ if(status == WYMeditor.LEXER_UNMATCHED){
+ this._current_item[this._current_element].feedback_style = match.replace(/^([\s\/\*]*)|([\s\/\*]*)$/gm,'');
+ }
+ return true;
+};
+
+WYMeditor.WymCssParser.prototype.WymCssStyleDeclaration = function(match)
+{
+ match = match.replace(/^([\s\.]*)|([\s\.*]*)$/gm, '');
+
+ var tag = '';
+ if(match.indexOf('.') > 0){
+ var parts = match.split('.');
+ this._current_element = parts[1];
+ var tag = parts[0];
+ }else{
+ this._current_element = match;
+ }
+
+ if(!this._has_title){
+ this._current_item = {'title':(!tag?'':tag.toUpperCase()+': ')+this._current_element};
+ this._has_title = true;
+ }
+
+ if(!this._current_item[this._current_element]){
+ this._current_item[this._current_element] = {'name':this._current_element};
+ }
+ if(tag){
+ if(!this._current_item[this._current_element].tags){
+ this._current_item[this._current_element].tags = [tag];
+ }else{
+ this._current_item[this._current_element].tags.push(tag);
+ }
+ }
+ return true;
+};
+
+WYMeditor.WymCssParser.prototype.addStyleSetting = function(style_details)
+{
+ for (var name in style_details){
+ var details = style_details[name];
+ if(typeof details == 'object' && name != 'title'){
+
+ this.css_settings.classesItems.push({
+ 'name': WYMeditor.Helper.trim(details.name),
+ 'title': style_details.title,
+ 'expr' : WYMeditor.Helper.trim((details.expressions||details.tags).join(', '))
+ });
+ if(details.feedback_style){
+ this.css_settings.editorStyles.push({
+ 'name': '.'+ WYMeditor.Helper.trim(details.name),
+ 'css': details.feedback_style
+ });
+ }
+ if(details.style){
+ this.css_settings.dialogStyles.push({
+ 'name': '.'+ WYMeditor.Helper.trim(details.name),
+ 'css': details.style
+ });
+ }
+ }
+ }
+};
+
+/********** HELPERS **********/
+
+// Returns true if it is a text node with whitespaces only
+jQuery.fn.isPhantomNode = function() {
+ if (this[0].nodeType == 3)
+ return !(/[^\t\n\r ]/.test(this[0].data));
+
+ return false;
+};
+
+WYMeditor.isPhantomNode = function(n) {
+ if (n.nodeType == 3)
+ return !(/[^\t\n\r ]/.test(n.data));
+
+ return false;
+};
+
+WYMeditor.isPhantomString = function(str) {
+ return !(/[^\t\n\r ]/.test(str));
+};
+
+// Returns the Parents or the node itself
+// jqexpr = a jQuery expression
+jQuery.fn.parentsOrSelf = function(jqexpr) {
+ var n = this;
+
+ if (n[0].nodeType == 3)
+ n = n.parents().slice(0,1);
+
+// if (n.is(jqexpr)) // XXX should work, but doesn't (probably a jQuery bug)
+ if (n.filter(jqexpr).size() == 1)
+ return n;
+ else
+ return n.parents(jqexpr).slice(0,1);
+};
+
+// String & array helpers
+
+WYMeditor.Helper = {
+
+ //replace all instances of 'old' by 'rep' in 'str' string
+ replaceAll: function(str, old, rep) {
+ var rExp = new RegExp(old, "g");
+ return(str.replace(rExp, rep));
+ },
+
+ //insert 'inserted' at position 'pos' in 'str' string
+ insertAt: function(str, inserted, pos) {
+ return(str.substr(0,pos) + inserted + str.substring(pos));
+ },
+
+ //trim 'str' string
+ trim: function(str) {
+ return str.replace(/^(\s*)|(\s*)$/gm,'');
+ },
+
+ //return true if 'arr' array contains 'elem', or false
+ contains: function(arr, elem) {
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i] === elem) return true;
+ }
+ return false;
+ },
+
+ //return 'item' position in 'arr' array, or -1
+ indexOf: function(arr, item) {
+ var ret=-1;
+ for(var i = 0; i < arr.length; i++) {
+ if (arr[i] == item) {
+ ret = i;
+ break;
+ }
+ }
+ return(ret);
+ },
+
+ //return 'item' object in 'arr' array, checking its 'name' property, or null
+ findByName: function(arr, name) {
+ for(var i = 0; i < arr.length; i++) {
+ var item = arr[i];
+ if(item.name == name) return(item);
+ }
+ return(null);
+ }
+};
+
+
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.explorer.js
+ * MSIE specific class and functions.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ * Bermi Ferrer (wymeditor a-t bermi dotorg)
+ * Frédéric Palluel-Lafleur (fpalluel a-t gmail dotcom)
+ * Jonatan Lundin (jonatan.lundin a-t gmail dotcom)
+ */
+
+WYMeditor.WymClassExplorer = function(wym) {
+
+ this._wym = wym;
+ this._class = "className";
+ this._newLine = "\r\n";
+
+};
+
+WYMeditor.WymClassExplorer.prototype.initIframe = function(iframe) {
+
+ //This function is executed twice, though it is called once!
+ //But MSIE needs that, otherwise designMode won't work.
+ //Weird.
+
+ this._iframe = iframe;
+ this._doc = iframe.contentWindow.document;
+
+ //add css rules from options
+ var styles = this._doc.styleSheets[0];
+ var aCss = eval(this._options.editorStyles);
+
+ this.addCssRules(this._doc, aCss);
+
+ this._doc.title = this._wym._index;
+
+ //set the text direction
+ jQuery('html', this._doc).attr('dir', this._options.direction);
+
+ //init html value
+ jQuery(this._doc.body).html(this._wym._html);
+
+ //handle events
+ var wym = this;
+
+ this._doc.body.onfocus = function()
+ {wym._doc.designMode = "on"; wym._doc = iframe.contentWindow.document;};
+ this._doc.onbeforedeactivate = function() {wym.saveCaret();};
+ this._doc.onkeyup = function() {
+ wym.saveCaret();
+ wym.keyup();
+ };
+ this._doc.onclick = function() {wym.saveCaret();};
+
+ this._doc.body.onbeforepaste = function() {
+ wym._iframe.contentWindow.event.returnValue = false;
+ };
+
+ this._doc.body.onpaste = function() {
+ wym._iframe.contentWindow.event.returnValue = false;
+ wym.paste(window.clipboardData.getData("Text"));
+ };
+
+ //callback can't be executed twice, so we check
+ if(this._initialized) {
+
+ //pre-bind functions
+ if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
+
+ //bind external events
+ this._wym.bindEvents();
+
+ //post-init functions
+ if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
+
+ //add event listeners to doc elements, e.g. images
+ this.listen();
+ }
+
+ this._initialized = true;
+
+ //init designMode
+ this._doc.designMode="on";
+ try{
+ // (bermi's note) noticed when running unit tests on IE6
+ // Is this really needed, it trigger an unexisting property on IE6
+ this._doc = iframe.contentWindow.document;
+ }catch(e){}
+};
+
+WYMeditor.WymClassExplorer.prototype._exec = function(cmd,param) {
+
+ switch(cmd) {
+
+ case WYMeditor.INDENT: case WYMeditor.OUTDENT:
+
+ var container = this.findUp(this.container(), WYMeditor.LI);
+ if(container) {
+ var ancestor = container.parentNode.parentNode;
+ if(container.parentNode.childNodes.length>1
+ || ancestor.tagName.toLowerCase() == WYMeditor.OL
+ || ancestor.tagName.toLowerCase() == WYMeditor.UL)
+ this._doc.execCommand(cmd);
+ }
+ break;
+ default:
+ if(param) this._doc.execCommand(cmd,false,param);
+ else this._doc.execCommand(cmd);
+ break;
+ }
+
+};
+
+WYMeditor.WymClassExplorer.prototype.selected = function() {
+
+ var caretPos = this._iframe.contentWindow.document.caretPos;
+ if(caretPos!=null) {
+ if(caretPos.parentElement!=undefined)
+ return(caretPos.parentElement());
+ }
+};
+
+WYMeditor.WymClassExplorer.prototype.saveCaret = function() {
+
+ this._doc.caretPos = this._doc.selection.createRange();
+};
+
+WYMeditor.WymClassExplorer.prototype.addCssRule = function(styles, oCss) {
+
+ styles.addRule(oCss.name, oCss.css);
+};
+
+WYMeditor.WymClassExplorer.prototype.insert = function(html) {
+
+ // Get the current selection
+ var range = this._doc.selection.createRange();
+
+ // Check if the current selection is inside the editor
+ if ( jQuery(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) {
+ try {
+ // Overwrite selection with provided html
+ range.pasteHTML(html);
+ } catch (e) { }
+ } else {
+ // Fall back to the internal paste function if there's no selection
+ this.paste(html);
+ }
+};
+
+WYMeditor.WymClassExplorer.prototype.wrap = function(left, right) {
+
+ // Get the current selection
+ var range = this._doc.selection.createRange();
+
+ // Check if the current selection is inside the editor
+ if ( jQuery(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) {
+ try {
+ // Overwrite selection with provided html
+ range.pasteHTML(left + range.text + right);
+ } catch (e) { }
+ }
+};
+
+WYMeditor.WymClassExplorer.prototype.unwrap = function() {
+
+ // Get the current selection
+ var range = this._doc.selection.createRange();
+
+ // Check if the current selection is inside the editor
+ if ( jQuery(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) {
+ try {
+ // Unwrap selection
+ var text = range.text;
+ this._exec( 'Cut' );
+ range.pasteHTML( text );
+ } catch (e) { }
+ }
+};
+
+//keyup handler
+WYMeditor.WymClassExplorer.prototype.keyup = function() {
+ this._selected_image = null;
+};
+
+WYMeditor.WymClassExplorer.prototype.setFocusToNode = function(node, toStart) {
+ var range = this._doc.selection.createRange();
+ toStart = toStart ? true : false;
+
+ range.moveToElementText(node);
+ range.collapse(toStart);
+ range.select();
+ node.focus();
+};
+
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.mozilla.js
+ * Gecko specific class and functions.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ * Volker Mische (vmx a-t gmx dotde)
+ * Bermi Ferrer (wymeditor a-t bermi dotorg)
+ * Frédéric Palluel-Lafleur (fpalluel a-t gmail dotcom)
+ * Jonatan Lundin (jonatan.lundin a-t gmail dotcom)
+ */
+
+WYMeditor.WymClassMozilla = function(wym) {
+
+ this._wym = wym;
+ this._class = "class";
+ this._newLine = "\n";
+};
+
+WYMeditor.WymClassMozilla.prototype.initIframe = function(iframe) {
+ var wym = this;
+
+ this._iframe = iframe;
+ this._doc = iframe.contentDocument;
+
+ //add css rules from options
+
+ var styles = this._doc.styleSheets[0];
+ var aCss = eval(this._options.editorStyles);
+
+ this.addCssRules(this._doc, aCss);
+
+ this._doc.title = this._wym._index;
+
+ //set the text direction
+ jQuery('html', this._doc).attr('dir', this._options.direction);
+
+ //init html value
+ this.html(this._wym._html);
+
+ //init designMode
+ this.enableDesignMode();
+
+ //pre-bind functions
+ if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
+
+ //bind external events
+ this._wym.bindEvents();
+
+ //bind editor keydown events
+ jQuery(this._doc).bind("keydown", this.keydown);
+
+ //bind editor keyup events
+ jQuery(this._doc).bind("keyup", this.keyup);
+
+ //bind editor focus events (used to reset designmode - Gecko bug)
+ jQuery(this._doc).bind("focus", function () {
+ // Fix scope
+ wym.enableDesignMode.call(wym);
+ });
+
+ //post-init functions
+ if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
+
+ //add event listeners to doc elements, e.g. images
+ this.listen();
+};
+
+/* @name html
+ * @description Get/Set the html value
+ */
+WYMeditor.WymClassMozilla.prototype.html = function(html) {
+
+ if(typeof html === 'string') {
+
+ //disable designMode
+ try { this._doc.designMode = "off"; } catch(e) { };
+
+ //replace em by i and strong by bold
+ //(designMode issue)
+ html = html.replace(/<em(\b[^>]*)>/gi, "<i$1>")
+ .replace(/<\/em>/gi, "</i>")
+ .replace(/<strong(\b[^>]*)>/gi, "<b$1>")
+ .replace(/<\/strong>/gi, "</b>");
+
+ //update the html body
+ jQuery(this._doc.body).html(html);
+
+ //re-init designMode
+ this.enableDesignMode();
+ }
+ else return(jQuery(this._doc.body).html());
+};
+
+WYMeditor.WymClassMozilla.prototype._exec = function(cmd,param) {
+
+ if(!this.selected()) return(false);
+
+ switch(cmd) {
+
+ case WYMeditor.INDENT: case WYMeditor.OUTDENT:
+
+ var focusNode = this.selected();
+ var sel = this._iframe.contentWindow.getSelection();
+ var anchorNode = sel.anchorNode;
+ if(anchorNode.nodeName == "#text") anchorNode = anchorNode.parentNode;
+
+ focusNode = this.findUp(focusNode, WYMeditor.BLOCKS);
+ anchorNode = this.findUp(anchorNode, WYMeditor.BLOCKS);
+
+ if(focusNode && focusNode == anchorNode
+ && focusNode.tagName.toLowerCase() == WYMeditor.LI) {
+
+ var ancestor = focusNode.parentNode.parentNode;
+
+ if(focusNode.parentNode.childNodes.length>1
+ || ancestor.tagName.toLowerCase() == WYMeditor.OL
+ || ancestor.tagName.toLowerCase() == WYMeditor.UL)
+ this._doc.execCommand(cmd,'',null);
+ }
+
+ break;
+
+ default:
+
+ if(param) this._doc.execCommand(cmd,'',param);
+ else this._doc.execCommand(cmd,'',null);
+ }
+
+ //set to P if parent = BODY
+ var container = this.selected();
+ if(container.tagName.toLowerCase() == WYMeditor.BODY)
+ this._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
+};
+
+/* @name selected
+ * @description Returns the selected container
+ */
+WYMeditor.WymClassMozilla.prototype.selected = function() {
+
+ var sel = this._iframe.contentWindow.getSelection();
+ var node = sel.focusNode;
+ if(node) {
+ if(node.nodeName == "#text") return(node.parentNode);
+ else return(node);
+ } else return(null);
+};
+
+WYMeditor.WymClassMozilla.prototype.addCssRule = function(styles, oCss) {
+
+ styles.insertRule(oCss.name + " {" + oCss.css + "}",
+ styles.cssRules.length);
+};
+
+
+//keydown handler, mainly used for keyboard shortcuts
+WYMeditor.WymClassMozilla.prototype.keydown = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+ var container = null;
+
+ if(evt.ctrlKey){
+ if(evt.keyCode == 66){
+ //CTRL+b => STRONG
+ wym._exec(WYMeditor.BOLD);
+ return false;
+ }
+ if(evt.keyCode == 73){
+ //CTRL+i => EMPHASIS
+ wym._exec(WYMeditor.ITALIC);
+ return false;
+ }
+ }
+
+ else if(evt.keyCode == 13) {
+ if(!evt.shiftKey){
+ //fix PRE bug #73
+ container = wym.selected();
+ if(container && container.tagName.toLowerCase() == WYMeditor.PRE) {
+ evt.preventDefault();
+ wym.insert('<p></p>');
+ }
+ }
+ }
+};
+
+//keyup handler, mainly used for cleanups
+WYMeditor.WymClassMozilla.prototype.keyup = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+
+ wym._selected_image = null;
+ var container = null;
+
+ if(evt.keyCode == 13 && !evt.shiftKey) {
+
+ //RETURN key
+ //cleanup <br><br> between paragraphs
+ jQuery(wym._doc.body).children(WYMeditor.BR).remove();
+ }
+
+ if(evt.keyCode != 8
+ && evt.keyCode != 17
+ && evt.keyCode != 46
+ && evt.keyCode != 224
+ && !evt.metaKey
+ && !evt.ctrlKey) {
+
+ //NOT BACKSPACE, NOT DELETE, NOT CTRL, NOT COMMAND
+ //text nodes replaced by P
+
+ container = wym.selected();
+ var name = container.tagName.toLowerCase();
+
+ //fix forbidden main containers
+ if(
+ name == "strong" ||
+ name == "b" ||
+ name == "em" ||
+ name == "i" ||
+ name == "sub" ||
+ name == "sup" ||
+ name == "a"
+
+ ) name = container.parentNode.tagName.toLowerCase();
+
+ if(name == WYMeditor.BODY) wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
+ }
+};
+
+WYMeditor.WymClassMozilla.prototype.enableDesignMode = function() {
+ if(this._doc.designMode == "off") {
+ try {
+ this._doc.designMode = "on";
+ this._doc.execCommand("styleWithCSS", '', false);
+ } catch(e) { }
+ }
+};
+
+WYMeditor.WymClassMozilla.prototype.openBlockTag = function(tag, attributes)
+{
+ var attributes = this.validator.getValidTagAttributes(tag, attributes);
+
+ // Handle Mozilla styled spans
+ if(tag == 'span' && attributes.style){
+ var new_tag = this.getTagForStyle(attributes.style);
+ if(new_tag){
+ this._tag_stack.pop();
+ var tag = new_tag;
+ this._tag_stack.push(new_tag);
+ attributes.style = '';
+ }else{
+ return;
+ }
+ }
+
+ this.output += this.helper.tag(tag, attributes, true);
+};
+
+WYMeditor.WymClassMozilla.prototype.getTagForStyle = function(style) {
+
+ if(/bold/.test(style)) return 'strong';
+ if(/italic/.test(style)) return 'em';
+ if(/sub/.test(style)) return 'sub';
+ if(/super/.test(style)) return 'sup';
+ return false;
+};
+
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.opera.js
+ * Opera specific class and functions.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ */
+
+WYMeditor.WymClassOpera = function(wym) {
+
+ this._wym = wym;
+ this._class = "class";
+ this._newLine = "\r\n";
+};
+
+WYMeditor.WymClassOpera.prototype.initIframe = function(iframe) {
+
+ this._iframe = iframe;
+ this._doc = iframe.contentWindow.document;
+
+ //add css rules from options
+ var styles = this._doc.styleSheets[0];
+ var aCss = eval(this._options.editorStyles);
+
+ this.addCssRules(this._doc, aCss);
+
+ this._doc.title = this._wym._index;
+
+ //set the text direction
+ jQuery('html', this._doc).attr('dir', this._options.direction);
+
+ //init designMode
+ this._doc.designMode = "on";
+
+ //init html value
+ this.html(this._wym._html);
+
+ //pre-bind functions
+ if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
+
+ //bind external events
+ this._wym.bindEvents();
+
+ //bind editor keydown events
+ jQuery(this._doc).bind("keydown", this.keydown);
+
+ //bind editor events
+ jQuery(this._doc).bind("keyup", this.keyup);
+
+ //post-init functions
+ if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
+
+ //add event listeners to doc elements, e.g. images
+ this.listen();
+};
+
+WYMeditor.WymClassOpera.prototype._exec = function(cmd,param) {
+
+ if(param) this._doc.execCommand(cmd,false,param);
+ else this._doc.execCommand(cmd);
+
+};
+
+WYMeditor.WymClassOpera.prototype.selected = function() {
+
+ var sel=this._iframe.contentWindow.getSelection();
+ var node=sel.focusNode;
+ if(node) {
+ if(node.nodeName=="#text")return(node.parentNode);
+ else return(node);
+ } else return(null);
+};
+
+WYMeditor.WymClassOpera.prototype.addCssRule = function(styles, oCss) {
+
+ styles.insertRule(oCss.name + " {" + oCss.css + "}",
+ styles.cssRules.length);
+};
+
+//keydown handler
+WYMeditor.WymClassOpera.prototype.keydown = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+ var sel = wym._iframe.contentWindow.getSelection();
+ startNode = sel.getRangeAt(0).startContainer;
+
+ //Get a P instead of no container
+ if(!jQuery(startNode).parentsOrSelf(
+ WYMeditor.MAIN_CONTAINERS.join(","))[0]
+ && !jQuery(startNode).parentsOrSelf('li')
+ && evt.keyCode != WYMeditor.KEY.ENTER
+ && evt.keyCode != WYMeditor.KEY.LEFT
+ && evt.keyCode != WYMeditor.KEY.UP
+ && evt.keyCode != WYMeditor.KEY.RIGHT
+ && evt.keyCode != WYMeditor.KEY.DOWN
+ && evt.keyCode != WYMeditor.KEY.BACKSPACE
+ && evt.keyCode != WYMeditor.KEY.DELETE)
+ wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
+
+};
+
+//keyup handler
+WYMeditor.WymClassOpera.prototype.keyup = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+ wym._selected_image = null;
+};
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.safari.js
+ * Safari specific class and functions.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ * Scott Lewis (lewiscot a-t gmail dotcom)
+ */
+
+WYMeditor.WymClassSafari = function(wym) {
+
+ this._wym = wym;
+ this._class = "class";
+ this._newLine = "\n";
+};
+
+WYMeditor.WymClassSafari.prototype.initIframe = function(iframe) {
+
+ this._iframe = iframe;
+ this._doc = iframe.contentDocument;
+
+ //add css rules from options
+
+ var styles = this._doc.styleSheets[0];
+ var aCss = eval(this._options.editorStyles);
+
+ this.addCssRules(this._doc, aCss);
+
+ this._doc.title = this._wym._index;
+
+ //set the text direction
+ jQuery('html', this._doc).attr('dir', this._options.direction);
+
+ //init designMode
+ this._doc.designMode = "on";
+
+ //init html value
+ this.html(this._wym._html);
+
+ //pre-bind functions
+ if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
+
+ //bind external events
+ this._wym.bindEvents();
+
+ //bind editor keydown events
+ jQuery(this._doc).bind("keydown", this.keydown);
+
+ //bind editor keyup events
+ jQuery(this._doc).bind("keyup", this.keyup);
+
+ //post-init functions
+ if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
+
+ //add event listeners to doc elements, e.g. images
+ this.listen();
+};
+
+WYMeditor.WymClassSafari.prototype._exec = function(cmd,param) {
+
+ if(!this.selected()) return(false);
+
+ switch(cmd) {
+
+ case WYMeditor.INDENT: case WYMeditor.OUTDENT:
+
+ var focusNode = this.selected();
+ var sel = this._iframe.contentWindow.getSelection();
+ var anchorNode = sel.anchorNode;
+ if(anchorNode.nodeName == "#text") anchorNode = anchorNode.parentNode;
+
+ focusNode = this.findUp(focusNode, WYMeditor.BLOCKS);
+ anchorNode = this.findUp(anchorNode, WYMeditor.BLOCKS);
+
+ if(focusNode && focusNode == anchorNode
+ && focusNode.tagName.toLowerCase() == WYMeditor.LI) {
+
+ var ancestor = focusNode.parentNode.parentNode;
+
+ if(focusNode.parentNode.childNodes.length>1
+ || ancestor.tagName.toLowerCase() == WYMeditor.OL
+ || ancestor.tagName.toLowerCase() == WYMeditor.UL)
+ this._doc.execCommand(cmd,'',null);
+ }
+
+ break;
+
+ case WYMeditor.INSERT_ORDEREDLIST: case WYMeditor.INSERT_UNORDEREDLIST:
+
+ this._doc.execCommand(cmd,'',null);
+
+ //Safari creates lists in e.g. paragraphs.
+ //Find the container, and remove it.
+ var focusNode = this.selected();
+ var container = this.findUp(focusNode, WYMeditor.MAIN_CONTAINERS);
+ if(container) jQuery(container).replaceWith(jQuery(container).html());
+
+ break;
+
+ default:
+
+ if(param) this._doc.execCommand(cmd,'',param);
+ else this._doc.execCommand(cmd,'',null);
+ }
+
+ //set to P if parent = BODY
+ var container = this.selected();
+ if(container && container.tagName.toLowerCase() == WYMeditor.BODY)
+ this._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
+
+};
+
+/* @name selected
+ * @description Returns the selected container
+ */
+WYMeditor.WymClassSafari.prototype.selected = function() {
+
+ var sel = this._iframe.contentWindow.getSelection();
+ var node = sel.focusNode;
+ if(node) {
+ if(node.nodeName == "#text") return(node.parentNode);
+ else return(node);
+ } else return(null);
+};
+
+WYMeditor.WymClassSafari.prototype.addCssRule = function(styles, oCss) {
+
+ styles.insertRule(oCss.name + " {" + oCss.css + "}",
+ styles.cssRules.length);
+};
+
+
+//keydown handler, mainly used for keyboard shortcuts
+WYMeditor.WymClassSafari.prototype.keydown = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+
+ if(evt.ctrlKey){
+ if(evt.keyCode == 66){
+ //CTRL+b => STRONG
+ wym._exec(WYMeditor.BOLD);
+ return false;
+ }
+ if(evt.keyCode == 73){
+ //CTRL+i => EMPHASIS
+ wym._exec(WYMeditor.ITALIC);
+ return false;
+ }
+ }
+};
+
+//keyup handler, mainly used for cleanups
+WYMeditor.WymClassSafari.prototype.keyup = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+
+ wym._selected_image = null;
+ var container = null;
+
+ if(evt.keyCode == 13 && !evt.shiftKey) {
+
+ //RETURN key
+ //cleanup <br><br> between paragraphs
+ jQuery(wym._doc.body).children(WYMeditor.BR).remove();
+
+ //fix PRE bug #73
+ container = wym.selected();
+ if(container && container.tagName.toLowerCase() == WYMeditor.PRE)
+ wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); //create P after PRE
+ }
+
+ //fix #112
+ if(evt.keyCode == 13 && evt.shiftKey) {
+ wym._exec('InsertLineBreak');
+ }
+
+ if(evt.keyCode != 8
+ && evt.keyCode != 17
+ && evt.keyCode != 46
+ && evt.keyCode != 224
+ && !evt.metaKey
+ && !evt.ctrlKey) {
+
+ //NOT BACKSPACE, NOT DELETE, NOT CTRL, NOT COMMAND
+ //text nodes replaced by P
+
+ container = wym.selected();
+ var name = container.tagName.toLowerCase();
+
+ //fix forbidden main containers
+ if(
+ name == "strong" ||
+ name == "b" ||
+ name == "em" ||
+ name == "i" ||
+ name == "sub" ||
+ name == "sup" ||
+ name == "a" ||
+ name == "span" //fix #110
+
+ ) name = container.parentNode.tagName.toLowerCase();
+
+ if(name == WYMeditor.BODY || name == WYMeditor.DIV) wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); //fix #110 for DIV
+ }
+};
+
+WYMeditor.WymClassSafari.prototype.openBlockTag = function(tag, attributes)
+{
+ var attributes = this.validator.getValidTagAttributes(tag, attributes);
+
+ // Handle Safari styled spans
+ if(tag == 'span' && attributes.style) {
+ var new_tag = this.getTagForStyle(attributes.style);
+ if(new_tag){
+ this._tag_stack.pop();
+ var tag = new_tag;
+ this._tag_stack.push(new_tag);
+ attributes.style = '';
+
+ //should fix #125 - also removed the xhtml() override
+ if(typeof attributes['class'] == 'string')
+ attributes['class'] = attributes['class'].replace(/apple-style-span/gi, '');
+
+ } else {
+ return;
+ }
+ }
+
+ this.output += this.helper.tag(tag, attributes, true);
+};
+
+WYMeditor.WymClassSafari.prototype.getTagForStyle = function(style) {
+
+ if(/bold/.test(style)) return 'strong';
+ if(/italic/.test(style)) return 'em';
+ if(/sub/.test(style)) return 'sub';
+ if(/super/.test(style)) return 'sup';
+ return false;
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.min.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.min.js
new file mode 100644
index 0000000..a7f9018
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.min.js
@@ -0,0 +1 @@
+if(!WYMeditor){var WYMeditor={}}(function(){if(!window.console||!console.firebug){var b=["log","debug","info","warn","error","assert","dir","dirxml","group","groupEnd","time","timeEnd","count","trace","profile","profileEnd"];WYMeditor.console={};for(var a=0;a<b.length;++a){WYMeditor.console[b[a]]=function(){}}}else{WYMeditor.console=window.console}})();jQuery.extend(WYMeditor,{VERSION:"0.5-rc1",INSTANCES:[],STRINGS:[],SKINS:[],NAME:"name",INDEX:"{Wym_Index}",WYM_INDEX:"wym_index",BASE_PATH:"{Wym_Base_Path}",CSS_PATH:"{Wym_Css_Path}",WYM_PATH:"{Wym_Wym_Path}",SKINS_DEFAULT_PATH:"skins/",SKINS_DEFAULT_CSS:"skin.css",SKINS_DEFAULT_JS:"skin.js",LANG_DEFAULT_PATH:"lang/",IFRAME_BASE_PATH:"{Wym_Iframe_Base_Path}",IFRAME_DEFAULT:"iframe/default/",JQUERY_PATH:"{Wym_Jquery_Path}",DIRECTION:"{Wym_Direction}",LOGO:"{Wym_Logo}",TOOLS:"{Wym_Tools}",TOOLS_ITEMS:"{Wym_Tools_Items}",TOOL_NAME:"{Wym_Tool_Name}",TOOL_TITLE:"{Wym_Tool_Title}",TOOL_CLASS:"{Wym_Tool_Class}",CLASSES:"{Wym_Classes}",CLASSES_ITEMS:"{Wym_Classes_Items}",CLASS_NAME:"{Wym_Class_Name}",CLASS_TITLE:"{Wym_Class_Title}",CONTAINERS:"{Wym_Containers}",CONTAINERS_ITEMS:"{Wym_Containers_Items}",CONTAINER_NAME:"{Wym_Container_Name}",CONTAINER_TITLE:"{Wym_Containers_Title}",CONTAINER_CLASS:"{Wym_Container_Class}",HTML:"{Wym_Html}",IFRAME:"{Wym_Iframe}",STATUS:"{Wym_Status}",DIALOG_TITLE:"{Wym_Dialog_Title}",DIALOG_BODY:"{Wym_Dialog_Body}",STRING:"string",BODY:"body",DIV:"div",P:"p",H1:"h1",H2:"h2",H3:"h3",H4:"h4",H5:"h5",H6:"h6",PRE:"pre",BLOCKQUOTE:"blockquote",A:"a",BR:"br",IMG:"img",TABLE:"table",TD:"td",TH:"th",UL:"ul",OL:"ol",LI:"li",CLASS:"class",HREF:"href",SRC:"src",TITLE:"title",ALT:"alt",DIALOG_LINK:"Link",DIALOG_IMAGE:"Image",DIALOG_TABLE:"Table",DIALOG_PASTE:"Paste_From_Word",BOLD:"Bold",ITALIC:"Italic",CREATE_LINK:"CreateLink",INSERT_IMAGE:"InsertImage",INSERT_TABLE:"InsertTable",INSERT_HTML:"InsertHTML",PASTE:"Paste",INDENT:"Indent",OUTDENT:"Outdent",TOGGLE_HTML:"ToggleHtml",FORMAT_BLOCK:"FormatBlock",PREVIEW:"Preview",UNLINK:"Unlink",INSERT_UNORDEREDLIST:"InsertUnorderedList",INSERT_ORDEREDLIST:"InsertOrderedList",MAIN_CONTAINERS:new Array("p","h1","h2","h3","h4","h5","h6","pre","blockquote"),BLOCKS:new Array("address","blockquote","div","dl","fieldset","form","h1","h2","h3","h4","h5","h6","hr","noscript","ol","p","pre","table","ul","dd","dt","li","tbody","td","tfoot","th","thead","tr"),KEY:{BACKSPACE:8,ENTER:13,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,CURSOR:new Array(37,38,39,40),DELETE:46},NODE:{ELEMENT:1,ATTRIBUTE:2,TEXT:3},editor:function(b,a){this._index=WYMeditor.INSTANCES.push(this)-1;this._element=b;this._options=a;this._html=jQuery(b).val();if(this._options.html){this._html=this._options.html}this._options.basePath=this._options.basePath||this.computeBasePath();this._options.skinPath=this._options.skinPath||this._options.basePath+WYMeditor.SKINS_DEFAULT_PATH+this._options.skin+"/";this._options.wymPath=this._options.wymPath||this.computeWymPath();this._options.langPath=this._options.langPath||this._options.basePath+WYMeditor.LANG_DEFAULT_PATH;this._options.iframeBasePath=this._options.iframeBasePath||this._options.basePath+WYMeditor.IFRAME_DEFAULT;this._options.jQueryPath=this._options.jQueryPath||this.computeJqueryPath();this.init()}});jQuery.fn.wymeditor=function(a){a=jQuery.extend({html:"",basePath:false,skinPath:false,wymPath:false,iframeBasePath:false,jQueryPath:false,styles:false,stylesheet:false,skin:"default",initSkin:true,loadSkin:true,lang:"en",direction:"ltr",boxHtml:"<div class='wym_box'><div class='wym_area_top'>"+WYMeditor.TOOLS+"</div><div class='wym_area_left'></div><div class='wym_area_right'>"+WYMeditor.CONTAINERS+WYMeditor.CLASSES+"</div><div class='wym_area_main'>"+WYMeditor.HTML+WYMeditor.IFRAME+WYMeditor.STATUS+"</div><div class='wym_area_bottom'>"+WYMeditor.LOGO+"</div></div>",logoHtml:"<a class='wym_wymeditor_link' href='http://www.wymeditor.org/'>WYMeditor</a>",iframeHtml:"<div class='wym_iframe wym_section'><iframe src='"+WYMeditor.IFRAME_BASE_PATH+"wymiframe.html' onload='this.contentWindow.parent.WYMeditor.INSTANCES["+WYMeditor.INDEX+"].initIframe(this)'></iframe></div>",editorStyles:[],toolsHtml:"<div class='wym_tools wym_section'><h2>{Tools}</h2><ul>"+WYMeditor.TOOLS_ITEMS+"</ul></div>",toolsItemHtml:"<li class='"+WYMeditor.TOOL_CLASS+"'><a href='#' name='"+WYMeditor.TOOL_NAME+"' title='"+WYMeditor.TOOL_TITLE+"'>"+WYMeditor.TOOL_TITLE+"</a></li>",toolsItems:[{name:"Bold",title:"Strong",css:"wym_tools_strong"},{name:"Italic",title:"Emphasis",css:"wym_tools_emphasis"},{name:"Superscript",title:"Superscript",css:"wym_tools_superscript"},{name:"Subscript",title:"Subscript",css:"wym_tools_subscript"},{name:"InsertOrderedList",title:"Ordered_List",css:"wym_tools_ordered_list"},{name:"InsertUnorderedList",title:"Unordered_List",css:"wym_tools_unordered_list"},{name:"Indent",title:"Indent",css:"wym_tools_indent"},{name:"Outdent",title:"Outdent",css:"wym_tools_outdent"},{name:"Undo",title:"Undo",css:"wym_tools_undo"},{name:"Redo",title:"Redo",css:"wym_tools_redo"},{name:"CreateLink",title:"Link",css:"wym_tools_link"},{name:"Unlink",title:"Unlink",css:"wym_tools_unlink"},{name:"InsertImage",title:"Image",css:"wym_tools_image"},{name:"InsertTable",title:"Table",css:"wym_tools_table"},{name:"Paste",title:"Paste_From_Word",css:"wym_tools_paste"},{name:"ToggleHtml",title:"HTML",css:"wym_tools_html"},{name:"Preview",title:"Preview",css:"wym_tools_preview"}],containersHtml:"<div class='wym_containers wym_section'><h2>{Containers}</h2><ul>"+WYMeditor.CONTAINERS_ITEMS+"</ul></div>",containersItemHtml:"<li class='"+WYMeditor.CONTAINER_CLASS+"'><a href='#' name='"+WYMeditor.CONTAINER_NAME+"'>"+WYMeditor.CONTAINER_TITLE+"</a></li>",containersItems:[{name:"P",title:"Paragraph",css:"wym_containers_p"},{name:"H1",title:"Heading_1",css:"wym_containers_h1"},{name:"H2",title:"Heading_2",css:"wym_containers_h2"},{name:"H3",title:"Heading_3",css:"wym_containers_h3"},{name:"H4",title:"Heading_4",css:"wym_containers_h4"},{name:"H5",title:"Heading_5",css:"wym_containers_h5"},{name:"H6",title:"Heading_6",css:"wym_containers_h6"},{name:"PRE",title:"Preformatted",css:"wym_containers_pre"},{name:"BLOCKQUOTE",title:"Blockquote",css:"wym_containers_blockquote"},{name:"TH",title:"Table_Header",css:"wym_containers_th"}],classesHtml:"<div class='wym_classes wym_section'><h2>{Classes}</h2><ul>"+WYMeditor.CLASSES_ITEMS+"</ul></div>",classesItemHtml:"<li class='wym_classes_"+WYMeditor.CLASS_NAME+"'><a href='#' name='"+WYMeditor.CLASS_NAME+"'>"+WYMeditor.CLASS_TITLE+"</a></li>",classesItems:[],statusHtml:"<div class='wym_status wym_section'><h2>{Status}</h2></div>",htmlHtml:"<div class='wym_html wym_section'><h2>{Source_Code}</h2><textarea class='wym_html_val'></textarea></div>",boxSelector:".wym_box",toolsSelector:".wym_tools",toolsListSelector:" ul",containersSelector:".wym_containers",classesSelector:".wym_classes",htmlSelector:".wym_html",iframeSelector:".wym_iframe iframe",iframeBodySelector:".wym_iframe",statusSelector:".wym_status",toolSelector:".wym_tools a",containerSelector:".wym_containers a",classSelector:".wym_classes a",htmlValSelector:".wym_html_val",hrefSelector:".wym_href",srcSelector:".wym_src",titleSelector:".wym_title",altSelector:".wym_alt",textSelector:".wym_text",rowsSelector:".wym_rows",colsSelector:".wym_cols",captionSelector:".wym_caption",summarySelector:".wym_summary",submitSelector:".wym_submit",cancelSelector:".wym_cancel",previewSelector:"",dialogTypeSelector:".wym_dialog_type",dialogLinkSelector:".wym_dialog_link",dialogImageSelector:".wym_dialog_image",dialogTableSelector:".wym_dialog_table",dialogPasteSelector:".wym_dialog_paste",dialogPreviewSelector:".wym_dialog_preview",updateSelector:".wymupdate",updateEvent:"click",dialogFeatures:"menubar=no,titlebar=no,toolbar=no,resizable=no,width=560,height=300,top=0,left=0",dialogFeaturesPreview:"menubar=no,titlebar=no,toolbar=no,resizable=no,scrollbars=yes,width=560,height=300,top=0,left=0",dialogHtml:"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'><html dir='"+WYMeditor.DIRECTION+"'><head><link rel='stylesheet' type='text/css' media='screen' href='"+WYMeditor.CSS_PATH+"' /><title>"+WYMeditor.DIALOG_TITLE+"</title><script type='text/javascript' src='"+WYMeditor.JQUERY_PATH+"'><\/script><script type='text/javascript' src='"+WYMeditor.WYM_PATH+"'><\/script></head>"+WYMeditor.DIALOG_BODY+"</html>",dialogLinkHtml:"<body class='wym_dialog wym_dialog_link' onload='WYMeditor.INIT_DIALOG("+WYMeditor.INDEX+")'><form><fieldset><input type='hidden' class='wym_dialog_type' value='"+WYMeditor.DIALOG_LINK+"' /><legend>{Link}</legend><div class='row'><label>{URL}</label><input type='text' class='wym_href' value='' size='40' /></div><div class='row'><label>{Title}</label><input type='text' class='wym_title' value='' size='40' /></div><div class='row row-indent'><input class='wym_submit' type='button' value='{Submit}' /><input class='wym_cancel' type='button'value='{Cancel}' /></div></fieldset></form></body>",dialogImageHtml:"<body class='wym_dialog wym_dialog_image' onload='WYMeditor.INIT_DIALOG("+WYMeditor.INDEX+")'><form><fieldset><input type='hidden' class='wym_dialog_type' value='"+WYMeditor.DIALOG_IMAGE+"' /><legend>{Image}</legend><div class='row'><label>{URL}</label><input type='text' class='wym_src' value='' size='40' /></div><div class='row'><label>{Alternative_Text}</label><input type='text' class='wym_alt' value='' size='40' /></div><div class='row'><label>{Title}</label><input type='text' class='wym_title' value='' size='40' /></div><div class='row row-indent'><input class='wym_submit' type='button' value='{Submit}' /><input class='wym_cancel' type='button'value='{Cancel}' /></div></fieldset></form></body>",dialogTableHtml:"<body class='wym_dialog wym_dialog_table' onload='WYMeditor.INIT_DIALOG("+WYMeditor.INDEX+")'><form><fieldset><input type='hidden' class='wym_dialog_type' value='"+WYMeditor.DIALOG_TABLE+"' /><legend>{Table}</legend><div class='row'><label>{Caption}</label><input type='text' class='wym_caption' value='' size='40' /></div><div class='row'><label>{Summary}</label><input type='text' class='wym_summary' value='' size='40' /></div><div class='row'><label>{Number_Of_Rows}</label><input type='text' class='wym_rows' value='3' size='3' /></div><div class='row'><label>{Number_Of_Cols}</label><input type='text' class='wym_cols' value='2' size='3' /></div><div class='row row-indent'><input class='wym_submit' type='button' value='{Submit}' /><input class='wym_cancel' type='button'value='{Cancel}' /></div></fieldset></form></body>",dialogPasteHtml:"<body class='wym_dialog wym_dialog_paste' onload='WYMeditor.INIT_DIALOG("+WYMeditor.INDEX+")'><form><input type='hidden' class='wym_dialog_type' value='"+WYMeditor.DIALOG_PASTE+"' /><fieldset><legend>{Paste_From_Word}</legend><div class='row'><textarea class='wym_text' rows='10' cols='50'></textarea></div><div class='row'><input class='wym_submit' type='button' value='{Submit}' /><input class='wym_cancel' type='button'value='{Cancel}' /></div></fieldset></form></body>",dialogPreviewHtml:"<body class='wym_dialog wym_dialog_preview' onload='WYMeditor.INIT_DIALOG("+WYMeditor.INDEX+")'></body>",dialogStyles:[],stringDelimiterLeft:"{",stringDelimiterRight:"}",preInit:null,preBind:null,postInit:null,preInitDialog:null,postInitDialog:null},a);return this.each(function(){new WYMeditor.editor(jQuery(this),a)})};jQuery.extend({wymeditors:function(a){return(WYMeditor.INSTANCES[a])}});WYMeditor.editor.prototype.init=function(){if(jQuery.browser.msie){var WymClass=new WYMeditor.WymClassExplorer(this)}else{if(jQuery.browser.mozilla){var WymClass=new WYMeditor.WymClassMozilla(this)}else{if(jQuery.browser.opera){var WymClass=new WYMeditor.WymClassOpera(this)}else{if(jQuery.browser.safari){var WymClass=new WYMeditor.WymClassSafari(this)}}}}if(WymClass){if(jQuery.isFunction(this._options.preInit)){this._options.preInit(this)}var SaxListener=new WYMeditor.XhtmlSaxListener();jQuery.extend(SaxListener,WymClass);this.parser=new WYMeditor.XhtmlParser(SaxListener);if(this._options.styles||this._options.stylesheet){this.configureEditorUsingRawCss()}this.helper=new WYMeditor.XmlHelper();for(var prop in WymClass){this[prop]=WymClass[prop]}this._box=jQuery(this._element).hide().after(this._options.boxHtml).next().addClass("wym_box_"+this._index);if(jQuery.isFunction(jQuery.fn.data)){jQuery.data(this._box.get(0),WYMeditor.WYM_INDEX,this._index);jQuery.data(this._element.get(0),WYMeditor.WYM_INDEX,this._index)}var h=WYMeditor.Helper;var iframeHtml=this._options.iframeHtml;iframeHtml=h.replaceAll(iframeHtml,WYMeditor.INDEX,this._index);iframeHtml=h.replaceAll(iframeHtml,WYMeditor.IFRAME_BASE_PATH,this._options.iframeBasePath);var boxHtml=jQuery(this._box).html();boxHtml=h.replaceAll(boxHtml,WYMeditor.LOGO,this._options.logoHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.TOOLS,this._options.toolsHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.CONTAINERS,this._options.containersHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.CLASSES,this._options.classesHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.HTML,this._options.htmlHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.IFRAME,iframeHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.STATUS,this._options.statusHtml);var aTools=eval(this._options.toolsItems);var sTools="";for(var i=0;i<aTools.length;i++){var oTool=aTools[i];if(oTool.name&&oTool.title){var sTool=this._options.toolsItemHtml}var sTool=h.replaceAll(sTool,WYMeditor.TOOL_NAME,oTool.name);sTool=h.replaceAll(sTool,WYMeditor.TOOL_TITLE,this._options.stringDelimiterLeft+oTool.title+this._options.stringDelimiterRight);sTool=h.replaceAll(sTool,WYMeditor.TOOL_CLASS,oTool.css);sTools+=sTool}boxHtml=h.replaceAll(boxHtml,WYMeditor.TOOLS_ITEMS,sTools);var aClasses=eval(this._options.classesItems);var sClasses="";for(var i=0;i<aClasses.length;i++){var oClass=aClasses[i];if(oClass.name&&oClass.title){var sClass=this._options.classesItemHtml}sClass=h.replaceAll(sClass,WYMeditor.CLASS_NAME,oClass.name);sClass=h.replaceAll(sClass,WYMeditor.CLASS_TITLE,oClass.title);sClasses+=sClass}boxHtml=h.replaceAll(boxHtml,WYMeditor.CLASSES_ITEMS,sClasses);var aContainers=eval(this._options.containersItems);var sContainers="";for(var i=0;i<aContainers.length;i++){var oContainer=aContainers[i];if(oContainer.name&&oContainer.title){var sContainer=this._options.containersItemHtml}sContainer=h.replaceAll(sContainer,WYMeditor.CONTAINER_NAME,oContainer.name);sContainer=h.replaceAll(sContainer,WYMeditor.CONTAINER_TITLE,this._options.stringDelimiterLeft+oContainer.title+this._options.stringDelimiterRight);sContainer=h.replaceAll(sContainer,WYMeditor.CONTAINER_CLASS,oContainer.css);sContainers+=sContainer}boxHtml=h.replaceAll(boxHtml,WYMeditor.CONTAINERS_ITEMS,sContainers);boxHtml=this.replaceStrings(boxHtml);jQuery(this._box).html(boxHtml);jQuery(this._box).find(this._options.htmlSelector).hide();this.loadSkin()}};WYMeditor.editor.prototype.bindEvents=function(){var wym=this;jQuery(this._box).find(this._options.toolSelector).click(function(){wym._iframe.contentWindow.focus();wym.exec(jQuery(this).attr(WYMeditor.NAME));return(false)});jQuery(this._box).find(this._options.containerSelector).click(function(){wym.container(jQuery(this).attr(WYMeditor.NAME));return(false)});jQuery(this._box).find(this._options.htmlValSelector).keyup(function(){jQuery(wym._doc.body).html(jQuery(this).val())}).focus(function(){jQuery(this).toggleClass("hasfocus")}).blur(function(){jQuery(this).toggleClass("hasfocus")});jQuery(this._box).find(this._options.classSelector).click(function(){var aClasses=eval(wym._options.classesItems);var sName=jQuery(this).attr(WYMeditor.NAME);var oClass=WYMeditor.Helper.findByName(aClasses,sName);if(oClass){var jqexpr=oClass.expr;wym.toggleClass(sName,jqexpr)}wym._iframe.contentWindow.focus();return(false)});jQuery(this._options.updateSelector).bind(this._options.updateEvent,function(){wym.update()})};WYMeditor.editor.prototype.ready=function(){return(this._doc!=null)};WYMeditor.editor.prototype.box=function(){return(this._box)};WYMeditor.editor.prototype.html=function(a){if(typeof a==="string"){jQuery(this._doc.body).html(a)}else{return(jQuery(this._doc.body).html())}};WYMeditor.editor.prototype.xhtml=function(){return this.parser.parse(this.html())};WYMeditor.editor.prototype.exec=function(b){switch(b){case WYMeditor.CREATE_LINK:var a=this.container();if(a||this._selected_image){this.dialog(WYMeditor.DIALOG_LINK)}break;case WYMeditor.INSERT_IMAGE:this.dialog(WYMeditor.DIALOG_IMAGE);break;case WYMeditor.INSERT_TABLE:this.dialog(WYMeditor.DIALOG_TABLE);break;case WYMeditor.PASTE:this.dialog(WYMeditor.DIALOG_PASTE);break;case WYMeditor.TOGGLE_HTML:this.update();this.toggleHtml();break;case WYMeditor.PREVIEW:this.dialog(WYMeditor.PREVIEW,this._options.dialogFeaturesPreview);break;default:this._exec(b);break}};WYMeditor.editor.prototype.container=function(a){if(a){var d=null;if(a.toLowerCase()==WYMeditor.TH){d=this.container();switch(d.tagName.toLowerCase()){case WYMeditor.TD:case WYMeditor.TH:break;default:var e=new Array(WYMeditor.TD,WYMeditor.TH);d=this.findUp(this.container(),e);break}if(d!=null){a=(d.tagName.toLowerCase()==WYMeditor.TD)?WYMeditor.TH:WYMeditor.TD;this.switchTo(d,a);this.update()}}else{var e=new Array(WYMeditor.P,WYMeditor.H1,WYMeditor.H2,WYMeditor.H3,WYMeditor.H4,WYMeditor.H5,WYMeditor.H6,WYMeditor.PRE,WYMeditor.BLOCKQUOTE);d=this.findUp(this.container(),e);if(d){var i=null;if(a.toLowerCase()==WYMeditor.BLOCKQUOTE){var f=this.findUp(this.container(),WYMeditor.BLOCKQUOTE);if(f==null){i=this._doc.createElement(a);d.parentNode.insertBefore(i,d);i.appendChild(d);this.setFocusToNode(i.firstChild)}else{var c=f.childNodes;var g=c.length;var b=null;if(g>0){b=c.item(0)}for(var h=0;h<g;h++){f.parentNode.insertBefore(c.item(0),f)}f.parentNode.removeChild(f);if(b){this.setFocusToNode(b)}}}else{this.switchTo(d,a)}this.update()}}}else{return(this.selected())}};WYMeditor.editor.prototype.toggleClass=function(c,b){var a=(this._selected_image?this._selected_image:jQuery(this.selected()));a=jQuery(a).parentsOrSelf(b);jQuery(a).toggleClass(c);if(!jQuery(a).attr(WYMeditor.CLASS)){jQuery(a).removeAttr(this._class)}};WYMeditor.editor.prototype.findUp=function(d,c){if(d){var e=d.tagName.toLowerCase();if(typeof(c)==WYMeditor.STRING){while(e!=c&&e!=WYMeditor.BODY){d=d.parentNode;e=d.tagName.toLowerCase()}}else{var b=false;while(!b&&e!=WYMeditor.BODY){for(var a=0;a<c.length;a++){if(e==c[a]){b=true;break}}if(!b){d=d.parentNode;e=d.tagName.toLowerCase()}}}if(e!=WYMeditor.BODY){return(d)}else{return(null)}}else{return(null)}};WYMeditor.editor.prototype.switchTo=function(c,d){var b=this._doc.createElement(d);var a=jQuery(c).html();c.parentNode.replaceChild(b,c);jQuery(b).html(a);this.setFocusToNode(b)};WYMeditor.editor.prototype.replaceStrings=function(sVal){if(!WYMeditor.STRINGS[this._options.lang]){try{eval(jQuery.ajax({url:this._options.langPath+this._options.lang+".js",async:false}).responseText)}catch(e){WYMeditor.console.error("WYMeditor: error while parsing language file.");return sVal}}for(var key in WYMeditor.STRINGS[this._options.lang]){sVal=WYMeditor.Helper.replaceAll(sVal,this._options.stringDelimiterLeft+key+this._options.stringDelimiterRight,WYMeditor.STRINGS[this._options.lang][key])}return(sVal)};WYMeditor.editor.prototype.encloseString=function(a){return(this._options.stringDelimiterLeft+a+this._options.stringDelimiterRight)};WYMeditor.editor.prototype.status=function(a){jQuery(this._box).find(this._options.statusSelector).html(a)};WYMeditor.editor.prototype.update=function(){var a=this.xhtml();jQuery(this._element).val(a);jQuery(this._box).find(this._options.htmlValSelector).not(".hasfocus").val(a)};WYMeditor.editor.prototype.dialog=function(j,c,f){var a=c||this._wym._options.dialogFeatures;var d=window.open("","dialog",a);if(d){var b="";switch(j){case (WYMeditor.DIALOG_LINK):b=this._options.dialogLinkHtml;break;case (WYMeditor.DIALOG_IMAGE):b=this._options.dialogImageHtml;break;case (WYMeditor.DIALOG_TABLE):b=this._options.dialogTableHtml;break;case (WYMeditor.DIALOG_PASTE):b=this._options.dialogPasteHtml;break;case (WYMeditor.PREVIEW):b=this._options.dialogPreviewHtml;break;default:b=f}var e=WYMeditor.Helper;var g=this._options.dialogHtml;g=e.replaceAll(g,WYMeditor.BASE_PATH,this._options.basePath);g=e.replaceAll(g,WYMeditor.DIRECTION,this._options.direction);g=e.replaceAll(g,WYMeditor.CSS_PATH,this._options.skinPath+WYMeditor.SKINS_DEFAULT_CSS);g=e.replaceAll(g,WYMeditor.WYM_PATH,this._options.wymPath);g=e.replaceAll(g,WYMeditor.JQUERY_PATH,this._options.jQueryPath);g=e.replaceAll(g,WYMeditor.DIALOG_TITLE,this.encloseString(j));g=e.replaceAll(g,WYMeditor.DIALOG_BODY,b);g=e.replaceAll(g,WYMeditor.INDEX,this._index);g=this.replaceStrings(g);var i=d.document;i.write(g);i.close()}};WYMeditor.editor.prototype.toggleHtml=function(){jQuery(this._box).find(this._options.htmlSelector).toggle()};WYMeditor.editor.prototype.uniqueStamp=function(){var a=new Date();return("wym-"+a.getTime())};WYMeditor.editor.prototype.paste=function(b){var e;var a=this.selected();var c=b.split(this._newLine+this._newLine);var d=new RegExp(this._newLine,"g");if(a&&a.tagName.toLowerCase()!=WYMeditor.BODY){for(x=c.length-1;x>=0;x--){e=c[x];e=e.replace(d,"<br />");jQuery(a).after("<p>"+e+"</p>")}}else{for(x=0;x<c.length;x++){e=c[x];e=e.replace(d,"<br />");jQuery(this._doc.body).append("<p>"+e+"</p>")}}};WYMeditor.editor.prototype.insert=function(a){if(this._iframe.contentWindow.getSelection().focusNode!=null){this._exec(WYMeditor.INSERT_HTML,a)}else{this.paste(a)}};WYMeditor.editor.prototype.wrap=function(b,a){if(this._iframe.contentWindow.getSelection().focusNode!=null){this._exec(WYMeditor.INSERT_HTML,b+this._iframe.contentWindow.getSelection().toString()+a)}};WYMeditor.editor.prototype.unwrap=function(){if(this._iframe.contentWindow.getSelection().focusNode!=null){this._exec(WYMeditor.INSERT_HTML,this._iframe.contentWindow.getSelection().toString())}};WYMeditor.editor.prototype.setFocusToNode=function(d,b){var a=this._doc.createRange(),c=this._iframe.contentWindow.getSelection();b=b?0:1;a.selectNodeContents(d);c.addRange(a);c.collapse(d,b);this._iframe.contentWindow.focus()};WYMeditor.editor.prototype.addCssRules=function(e,c){var b=e.styleSheets[0];if(b){for(var a=0;a<c.length;a++){var d=c[a];if(d.name&&d.css){this.addCssRule(b,d)}}}};WYMeditor.editor.prototype.computeBasePath=function(){return jQuery(jQuery.grep(jQuery("script"),function(a){return(a.src&&a.src.match(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/))})).attr("src").replace(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/,"")};WYMeditor.editor.prototype.computeWymPath=function(){return jQuery(jQuery.grep(jQuery("script"),function(a){return(a.src&&a.src.match(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/))})).attr("src")};WYMeditor.editor.prototype.computeJqueryPath=function(){return jQuery(jQuery.grep(jQuery("script"),function(a){return(a.src&&a.src.match(/jquery(-(.*)){0,1}(\.pack|\.min|\.packed)?\.js(\?.*)?$/))})).attr("src")};WYMeditor.editor.prototype.computeCssPath=function(){return jQuery(jQuery.grep(jQuery("link"),function(a){return(a.href&&a.href.match(/wymeditor\/skins\/(.*)screen\.css(\?.*)?$/))})).attr("href")};WYMeditor.editor.prototype.configureEditorUsingRawCss=function(){var a=new WYMeditor.WymCssParser();if(this._options.stylesheet){a.parse(jQuery.ajax({url:this._options.stylesheet,async:false}).responseText)}else{a.parse(this._options.styles,false)}if(this._options.classesItems.length==0){this._options.classesItems=a.css_settings.classesItems}if(this._options.editorStyles.length==0){this._options.editorStyles=a.css_settings.editorStyles}if(this._options.dialogStyles.length==0){this._options.dialogStyles=a.css_settings.dialogStyles}};WYMeditor.editor.prototype.listen=function(){jQuery(this._doc.body).bind("mousedown",this.mousedown)};WYMeditor.editor.prototype.mousedown=function(a){var b=WYMeditor.INSTANCES[this.ownerDocument.title];b._selected_image=(a.target.tagName.toLowerCase()==WYMeditor.IMG)?a.target:null};WYMeditor.loadCss=function(a){var c=document.createElement("link");c.rel="stylesheet";c.href=a;var b=jQuery("head").get(0);b.appendChild(c)};WYMeditor.editor.prototype.loadSkin=function(){if(this._options.loadSkin&&!WYMeditor.SKINS[this._options.skin]){var found=false;var rExp=new RegExp(this._options.skin+"/"+WYMeditor.SKINS_DEFAULT_CSS+"$");jQuery("link").each(function(){if(this.href.match(rExp)){found=true}});if(!found){WYMeditor.loadCss(this._options.skinPath+WYMeditor.SKINS_DEFAULT_CSS)}}jQuery(this._box).addClass("wym_skin_"+this._options.skin);if(this._options.initSkin&&!WYMeditor.SKINS[this._options.skin]){eval(jQuery.ajax({url:this._options.skinPath+WYMeditor.SKINS_DEFAULT_JS,async:false}).responseText)}if(WYMeditor.SKINS[this._options.skin]&&WYMeditor.SKINS[this._options.skin].init){WYMeditor.SKINS[this._options.skin].init(this)}};WYMeditor.INIT_DIALOG=function(index){var wym=window.opener.WYMeditor.INSTANCES[index];var doc=window.document;var selected=wym.selected();var dialogType=jQuery(wym._options.dialogTypeSelector).val();var sStamp=wym.uniqueStamp();switch(dialogType){case WYMeditor.DIALOG_LINK:if(selected&&selected.tagName&&selected.tagName.toLowerCase!=WYMeditor.A){selected=jQuery(selected).parentsOrSelf(WYMeditor.A)}if(!selected&&wym._selected_image){selected=jQuery(wym._selected_image).parentsOrSelf(WYMeditor.A)}break}if(jQuery.isFunction(wym._options.preInitDialog)){wym._options.preInitDialog(wym,window)}var styles=doc.styleSheets[0];var aCss=eval(wym._options.dialogStyles);wym.addCssRules(doc,aCss);if(selected){jQuery(wym._options.hrefSelector).val(jQuery(selected).attr(WYMeditor.HREF));jQuery(wym._options.srcSelector).val(jQuery(selected).attr(WYMeditor.SRC));jQuery(wym._options.titleSelector).val(jQuery(selected).attr(WYMeditor.TITLE));jQuery(wym._options.altSelector).val(jQuery(selected).attr(WYMeditor.ALT))}if(wym._selected_image){jQuery(wym._options.dialogImageSelector+" "+wym._options.srcSelector).val(jQuery(wym._selected_image).attr(WYMeditor.SRC));jQuery(wym._options.dialogImageSelector+" "+wym._options.titleSelector).val(jQuery(wym._selected_image).attr(WYMeditor.TITLE));jQuery(wym._options.dialogImageSelector+" "+wym._options.altSelector).val(jQuery(wym._selected_image).attr(WYMeditor.ALT))}jQuery(wym._options.dialogLinkSelector+" "+wym._options.submitSelector).click(function(){var sUrl=jQuery(wym._options.hrefSelector).val();if(sUrl.length>0){var link;if(selected[0]&&selected[0].tagName.toLowerCase()==WYMeditor.A){link=selected}else{wym._exec(WYMeditor.CREATE_LINK,sStamp);link=jQuery("a[href="+sStamp+"]",wym._doc.body)}link.attr(WYMeditor.HREF,sUrl).attr(WYMeditor.TITLE,jQuery(wym._options.titleSelector).val())}window.close()});jQuery(wym._options.dialogImageSelector+" "+wym._options.submitSelector).click(function(){var sUrl=jQuery(wym._options.srcSelector).val();if(sUrl.length>0){wym._exec(WYMeditor.INSERT_IMAGE,sStamp);jQuery("img[src$="+sStamp+"]",wym._doc.body).attr(WYMeditor.SRC,sUrl).attr(WYMeditor.TITLE,jQuery(wym._options.titleSelector).val()).attr(WYMeditor.ALT,jQuery(wym._options.altSelector).val())}window.close()});jQuery(wym._options.dialogTableSelector+" "+wym._options.submitSelector).click(function(){var iRows=jQuery(wym._options.rowsSelector).val();var iCols=jQuery(wym._options.colsSelector).val();if(iRows>0&&iCols>0){var table=wym._doc.createElement(WYMeditor.TABLE);var newRow=null;var newCol=null;var sCaption=jQuery(wym._options.captionSelector).val();var newCaption=table.createCaption();newCaption.innerHTML=sCaption;for(x=0;x<iRows;x++){newRow=table.insertRow(x);for(y=0;y<iCols;y++){newRow.insertCell(y)}}jQuery(table).attr("summary",jQuery(wym._options.summarySelector).val());var node=jQuery(wym.findUp(wym.container(),WYMeditor.MAIN_CONTAINERS)).get(0);if(!node||!node.parentNode){jQuery(wym._doc.body).append(table)}else{jQuery(node).after(table)}}window.close()});jQuery(wym._options.dialogPasteSelector+" "+wym._options.submitSelector).click(function(){var sText=jQuery(wym._options.textSelector).val();wym.paste(sText);window.close()});jQuery(wym._options.dialogPreviewSelector+" "+wym._options.previewSelector).html(wym.xhtml());jQuery(wym._options.cancelSelector).mousedown(function(){window.close()});if(jQuery.isFunction(wym._options.postInitDialog)){wym._options.postInitDialog(wym,window)}};WYMeditor.XmlHelper=function(){this._entitiesDiv=document.createElement("div");return this};WYMeditor.XmlHelper.prototype.tag=function(c,b,a){b=b||false;a=a||false;return"<"+c+(b?this.tagOptions(b):"")+(a?">":" />")};WYMeditor.XmlHelper.prototype.contentTag=function(b,c,a){a=a||false;return"<"+b+(a?this.tagOptions(a):"")+">"+c+"</"+b+">"};WYMeditor.XmlHelper.prototype.cdataSection=function(a){return"<![CDATA["+a+"]]>"};WYMeditor.XmlHelper.prototype.escapeOnce=function(a){return this._fixDoubleEscape(this.escapeEntities(a))};WYMeditor.XmlHelper.prototype._fixDoubleEscape=function(a){return a.replace(/&amp;([a-z]+|(#\d+));/ig,"&$1;")};WYMeditor.XmlHelper.prototype.tagOptions=function(b){var a=this;a._formated_options="";for(var c in b){var d="";var e=b[c];if(typeof e!="function"&&e.length>0){if(parseInt(c)==c&&typeof e=="object"){c=e.shift();e=e.pop()}if(c!=""&&e!=""){a._formated_options+=" "+c+'="'+a.escapeOnce(e)+'"'}}}return a._formated_options};WYMeditor.XmlHelper.prototype.escapeEntities=function(c,b){this._entitiesDiv.innerHTML=c;this._entitiesDiv.textContent=c;var a=this._entitiesDiv.innerHTML;if(typeof b=="undefined"){if(b!=false){a=a.replace('"',"&quot;")}if(b==true){a=a.replace('"',"&#039;")}}return a};WYMeditor.XmlHelper.prototype.parseAttributes=function(h){var a=[];var g=h.split(/((=\s*")(")("))|((=\s*\')(\')(\'))|((=\s*[^>\s]*))/g);if(g.toString()!=h){for(var d in g){var c=g[d];if(typeof c!="function"&&c.length!=0){var e=new RegExp("(\\w+)\\s*"+c);if(match=h.match(e)){var f=c.replace(/^[\s=]+/,"");var b=f.charAt(0);b=b=='"'?'"':(b=="'"?"'":"");if(b!=""){f=b=='"'?f.replace(/^"|"+$/g,""):f.replace(/^'|'+$/g,"")}h=h.replace(match[0],"");a.push([match[1],f])}}}}return a};WYMeditor.XhtmlValidator={_attributes:{core:{except:["base","head","html","meta","param","script","style","title"],attributes:["class","id","style","title","accesskey","tabindex"]},language:{except:["base","br","hr","iframe","param","script"],attributes:{dir:["ltr","rtl"],"0":"lang","1":"xml:lang"}},keyboard:{attributes:{accesskey:/^(\w){1}$/,tabindex:/^(\d)+$/}}},_events:{window:{only:["body"],attributes:["onload","onunload"]},form:{only:["form","input","textarea","select","a","label","button"],attributes:["onchange","onsubmit","onreset","onselect","onblur","onfocus"]},keyboard:{except:["base","bdo","br","frame","frameset","head","html","iframe","meta","param","script","style","title"],attributes:["onkeydown","onkeypress","onkeyup"]},mouse:{except:["base","bdo","br","head","html","meta","param","script","style","title"],attributes:["onclick","ondblclick","onmousedown","onmousemove","onmouseover","onmouseout","onmouseup"]}},_tags:{a:{attributes:{"0":"charset","1":"coords","2":"href","3":"hreflang","4":"name",rel:/^(alternate|designates|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark| |shortcut|icon)+$/,rev:/^(alternate|designates|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark| |shortcut|icon)+$/,shape:/^(rect|rectangle|circ|circle|poly|polygon)$/,"5":"type"}},"0":"abbr","1":"acronym","2":"address",area:{attributes:{"0":"alt","1":"coords","2":"href",nohref:/^(true|false)$/,shape:/^(rect|rectangle|circ|circle|poly|polygon)$/},required:["alt"]},"3":"b",base:{attributes:["href"],required:["href"]},bdo:{attributes:{dir:/^(ltr|rtl)$/},required:["dir"]},"4":"big",blockquote:{attributes:["cite"]},"5":"body","6":"br",button:{attributes:{disabled:/^(disabled)$/,type:/^(button|reset|submit)$/,"0":"value"},inside:"form"},"7":"caption","8":"cite","9":"code",col:{attributes:{align:/^(right|left|center|justify)$/,"0":"char","1":"charoff",span:/^(\d)+$/,valign:/^(top|middle|bottom|baseline)$/,"2":"width"},inside:"colgroup"},colgroup:{attributes:{align:/^(right|left|center|justify)$/,"0":"char","1":"charoff",span:/^(\d)+$/,valign:/^(top|middle|bottom|baseline)$/,"2":"width"}},"10":"dd",del:{attributes:{"0":"cite",datetime:/^([0-9]){8}/}},"11":"div","12":"dfn","13":"dl","14":"dt","15":"em",fieldset:{inside:"form"},form:{attributes:{"0":"action","1":"accept","2":"accept-charset","3":"enctype",method:/^(get|post)$/},required:["action"]},head:{attributes:["profile"]},"16":"h1","17":"h2","18":"h3","19":"h4","20":"h5","21":"h6","22":"hr",html:{attributes:["xmlns"]},"23":"i",img:{attributes:["alt","src","height","ismap","longdesc","usemap","width"],required:["alt","src"]},input:{attributes:{"0":"accept","1":"alt",checked:/^(checked)$/,disabled:/^(disabled)$/,maxlength:/^(\d)+$/,"2":"name",readonly:/^(readonly)$/,size:/^(\d)+$/,"3":"src",type:/^(button|checkbox|file|hidden|image|password|radio|reset|submit|text)$/,"4":"value"},inside:"form"},ins:{attributes:{"0":"cite",datetime:/^([0-9]){8}/}},"24":"kbd",label:{attributes:["for"],inside:"form"},"25":"legend","26":"li",link:{attributes:{"0":"charset","1":"href","2":"hreflang",media:/^(all|braille|print|projection|screen|speech|,|;| )+$/i,rel:/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i,rev:/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i,"3":"type"},inside:"head"},map:{attributes:["id","name"],required:["id"]},meta:{attributes:{"0":"content","http-equiv":/^(content\-type|expires|refresh|set\-cookie)$/i,"1":"name","2":"scheme"},required:["content"]},"27":"noscript",object:{attributes:["archive","classid","codebase","codetype","data","declare","height","name","standby","type","usemap","width"]},"28":"ol",optgroup:{attributes:{"0":"label",disabled:/^(disabled)$/},required:["label"]},option:{attributes:{"0":"label",disabled:/^(disabled)$/,selected:/^(selected)$/,"1":"value"},inside:"select"},"29":"p",param:{attributes:{"0":"type",valuetype:/^(data|ref|object)$/,"1":"valuetype","2":"value"},required:["name"]},"30":"pre",q:{attributes:["cite"]},"31":"samp",script:{attributes:{type:/^(text\/ecmascript|text\/javascript|text\/jscript|text\/vbscript|text\/vbs|text\/xml)$/,"0":"charset",defer:/^(defer)$/,"1":"src"},required:["type"]},select:{attributes:{disabled:/^(disabled)$/,multiple:/^(multiple)$/,"0":"name","1":"size"},inside:"form"},"32":"small","33":"span","34":"strong",style:{attributes:{"0":"type",media:/^(screen|tty|tv|projection|handheld|print|braille|aural|all)$/},required:["type"]},"35":"sub","36":"sup",table:{attributes:{"0":"border","1":"cellpadding","2":"cellspacing",frame:/^(void|above|below|hsides|lhs|rhs|vsides|box|border)$/,rules:/^(none|groups|rows|cols|all)$/,"3":"summary","4":"width"}},tbody:{attributes:{align:/^(right|left|center|justify)$/,"0":"char","1":"charoff",valign:/^(top|middle|bottom|baseline)$/}},td:{attributes:{"0":"abbr",align:/^(left|right|center|justify|char)$/,"1":"axis","2":"char","3":"charoff",colspan:/^(\d)+$/,"4":"headers",rowspan:/^(\d)+$/,scope:/^(col|colgroup|row|rowgroup)$/,valign:/^(top|middle|bottom|baseline)$/}},textarea:{attributes:["cols","rows","disabled","name","readonly"],required:["cols","rows"],inside:"form"},tfoot:{attributes:{align:/^(right|left|center|justify)$/,"0":"char","1":"charoff",valign:/^(top|middle|bottom)$/,"2":"baseline"}},th:{attributes:{"0":"abbr",align:/^(left|right|center|justify|char)$/,"1":"axis","2":"char","3":"charoff",colspan:/^(\d)+$/,"4":"headers",rowspan:/^(\d)+$/,scope:/^(col|colgroup|row|rowgroup)$/,valign:/^(top|middle|bottom|baseline)$/}},thead:{attributes:{align:/^(right|left|center|justify)$/,"0":"char","1":"charoff",valign:/^(top|middle|bottom|baseline)$/}},"37":"title",tr:{attributes:{align:/^(right|left|center|justify|char)$/,"0":"char","1":"charoff",valign:/^(top|middle|bottom|baseline)$/}},"38":"tt","39":"ul","40":"var"},skiped_attributes:[],skiped_attribute_values:[],getValidTagAttributes:function(a,b){var c={};var g=this.getPossibleTagAttributes(a);for(var e in b){var f=b[e];var d=WYMeditor.Helper;if(!d.contains(this.skiped_attributes,e)&&!d.contains(this.skiped_attribute_values,f)){if(typeof f!="function"&&d.contains(g,e)){if(this.doesAttributeNeedsValidation(a,e)){if(this.validateAttribute(a,e,f)){c[e]=f}}else{c[e]=f}}}}return c},getUniqueAttributesAndEventsForTag:function(b){var a=[];if(this._tags[b]&&this._tags[b]["attributes"]){for(k in this._tags[b]["attributes"]){a.push(parseInt(k)==k?this._tags[b]["attributes"][k]:k)}}return a},getDefaultAttributesAndEventsForTags:function(){var a=[];for(var b in this._events){a.push(this._events[b])}for(var b in this._attributes){a.push(this._attributes[b])}return a},isValidTag:function(a){if(this._tags[a]){return true}for(var b in this._tags){if(this._tags[b]==a){return true}}return false},getDefaultAttributesAndEventsForTag:function(a){var i=[];if(this.isValidTag(a)){var g=this.getDefaultAttributesAndEventsForTags();for(var d in g){var f=g[d];if(typeof f=="object"){var e=WYMeditor.Helper;if((f.except&&e.contains(f.except,a))||(f.only&&!e.contains(f.only,a))){continue}var c=f.attributes?f.attributes:f.events;for(var b in c){i.push(typeof c[b]!="string"?b:c[b])}}}}return i},doesAttributeNeedsValidation:function(a,b){return this._tags[a]&&((this._tags[a]["attributes"]&&this._tags[a]["attributes"][b])||(this._tags[a]["required"]&&WYMeditor.Helper.contains(this._tags[a]["required"],b)))},validateAttribute:function(a,b,c){if(this._tags[a]&&(this._tags[a]["attributes"]&&this._tags[a]["attributes"][b]&&c.length>0&&!c.match(this._tags[a]["attributes"][b]))||(this._tags[a]&&this._tags[a]["required"]&&WYMeditor.Helper.contains(this._tags[a]["required"],b)&&c.length==0)){return false}return typeof this._tags[a]!="undefined"},getPossibleTagAttributes:function(a){if(!this._possible_tag_attributes){this._possible_tag_attributes={}}if(!this._possible_tag_attributes[a]){this._possible_tag_attributes[a]=this.getUniqueAttributesAndEventsForTag(a).concat(this.getDefaultAttributesAndEventsForTag(a))}return this._possible_tag_attributes[a]}};WYMeditor.ParallelRegex=function(a){this._case=a;this._patterns=[];this._labels=[];this._regex=null;return this};WYMeditor.ParallelRegex.prototype.addPattern=function(c,a){a=a||true;var b=this._patterns.length;this._patterns[b]=c;this._labels[b]=a;this._regex=null};WYMeditor.ParallelRegex.prototype.match=function(c){if(this._patterns.length==0){return[false,""]}var d=c.match(this._getCompoundedRegex());if(!d){return[false,""]}var a=d[0];for(var b=1;b<d.length;b++){if(d[b]){return[this._labels[b-1],a]}}return[true,d[0]]};WYMeditor.ParallelRegex.prototype._getCompoundedRegex=function(){if(this._regex==null){for(var a=0,b=this._patterns.length;a<b;a++){this._patterns[a]="("+this._untokenizeRegex(this._tokenizeRegex(this._patterns[a]).replace(/([\/\(\)])/g,"\\$1"))+")"}this._regex=new RegExp(this._patterns.join("|"),this._getPerlMatchingFlags())}return this._regex};WYMeditor.ParallelRegex.prototype._tokenizeRegex=function(a){return a.replace(/\(\?(i|m|s|x|U)\)/,"~~~~~~Tk1$1~~~~~~").replace(/\(\?(\-[i|m|s|x|U])\)/,"~~~~~~Tk2$1~~~~~~").replace(/\(\?\=(.*)\)/,"~~~~~~Tk3$1~~~~~~").replace(/\(\?\!(.*)\)/,"~~~~~~Tk4$1~~~~~~").replace(/\(\?\<\=(.*)\)/,"~~~~~~Tk5$1~~~~~~").replace(/\(\?\<\!(.*)\)/,"~~~~~~Tk6$1~~~~~~").replace(/\(\?\:(.*)\)/,"~~~~~~Tk7$1~~~~~~")};WYMeditor.ParallelRegex.prototype._untokenizeRegex=function(a){return a.replace(/~~~~~~Tk1(.{1})~~~~~~/,"(?$1)").replace(/~~~~~~Tk2(.{2})~~~~~~/,"(?$1)").replace(/~~~~~~Tk3(.*)~~~~~~/,"(?=$1)").replace(/~~~~~~Tk4(.*)~~~~~~/,"(?!$1)").replace(/~~~~~~Tk5(.*)~~~~~~/,"(?<=$1)").replace(/~~~~~~Tk6(.*)~~~~~~/,"(?<!$1)").replace(/~~~~~~Tk7(.*)~~~~~~/,"(?:$1)")};WYMeditor.ParallelRegex.prototype._getPerlMatchingFlags=function(){return(this._case?"m":"mi")};WYMeditor.StateStack=function(a){this._stack=[a];return this};WYMeditor.StateStack.prototype.getCurrent=function(){return this._stack[this._stack.length-1]};WYMeditor.StateStack.prototype.enter=function(a){this._stack.push(a)};WYMeditor.StateStack.prototype.leave=function(){if(this._stack.length==1){return false}this._stack.pop();return true};WYMeditor.LEXER_ENTER=1;WYMeditor.LEXER_MATCHED=2;WYMeditor.LEXER_UNMATCHED=3;WYMeditor.LEXER_EXIT=4;WYMeditor.LEXER_SPECIAL=5;WYMeditor.Lexer=function(c,b,a){b=b||"accept";this._case=a||false;this._regexes={};this._parser=c;this._mode=new WYMeditor.StateStack(b);this._mode_handlers={};this._mode_handlers[b]=b;return this};WYMeditor.Lexer.prototype.addPattern=function(a,b){var b=b||"accept";if(typeof this._regexes[b]=="undefined"){this._regexes[b]=new WYMeditor.ParallelRegex(this._case)}this._regexes[b].addPattern(a);if(typeof this._mode_handlers[b]=="undefined"){this._mode_handlers[b]=b}};WYMeditor.Lexer.prototype.addEntryPattern=function(b,c,a){if(typeof this._regexes[c]=="undefined"){this._regexes[c]=new WYMeditor.ParallelRegex(this._case)}this._regexes[c].addPattern(b,a);if(typeof this._mode_handlers[a]=="undefined"){this._mode_handlers[a]=a}};WYMeditor.Lexer.prototype.addExitPattern=function(a,b){if(typeof this._regexes[b]=="undefined"){this._regexes[b]=new WYMeditor.ParallelRegex(this._case)}this._regexes[b].addPattern(a,"__exit");if(typeof this._mode_handlers[b]=="undefined"){this._mode_handlers[b]=b}};WYMeditor.Lexer.prototype.addSpecialPattern=function(b,c,a){if(typeof this._regexes[c]=="undefined"){this._regexes[c]=new WYMeditor.ParallelRegex(this._case)}this._regexes[c].addPattern(b,"_"+a);if(typeof this._mode_handlers[a]=="undefined"){this._mode_handlers[a]=a}};WYMeditor.Lexer.prototype.mapHandler=function(b,a){this._mode_handlers[b]=a};WYMeditor.Lexer.prototype.parse=function(d){if(typeof this._parser=="undefined"){return false}var e=d.length;var c;while(typeof(c=this._reduce(d))=="object"){var d=c[0];var b=c[1];var a=c[2];var f=c[3];if(!this._dispatchTokens(b,a,f)){return false}if(d==""){return true}if(d.length==e){return false}e=d.length}if(!c){return false}return this._invokeParser(d,WYMeditor.LEXER_UNMATCHED)};WYMeditor.Lexer.prototype._dispatchTokens=function(b,a,c){c=c||false;if(!this._invokeParser(b,WYMeditor.LEXER_UNMATCHED)){return false}if(typeof c=="boolean"){return this._invokeParser(a,WYMeditor.LEXER_MATCHED)}if(this._isModeEnd(c)){if(!this._invokeParser(a,WYMeditor.LEXER_EXIT)){return false}return this._mode.leave()}if(this._isSpecialMode(c)){this._mode.enter(this._decodeSpecial(c));if(!this._invokeParser(a,WYMeditor.LEXER_SPECIAL)){return false}return this._mode.leave()}this._mode.enter(c);return this._invokeParser(a,WYMeditor.LEXER_ENTER)};WYMeditor.Lexer.prototype._isModeEnd=function(a){return(a==="__exit")};WYMeditor.Lexer.prototype._isSpecialMode=function(a){return(a.substring(0,1)=="_")};WYMeditor.Lexer.prototype._decodeSpecial=function(a){return a.substring(1)};WYMeditor.Lexer.prototype._invokeParser=function(content,is_match){if(content===""){return true}var current=this._mode.getCurrent();var handler=this._mode_handlers[current];var result;eval("result = this._parser."+handler+"(content, is_match);");return result};WYMeditor.Lexer.prototype._reduce=function(c){var a=this._regexes[this._mode.getCurrent()].match(c);var b=a[1];var e=a[0];if(e){var f=c.indexOf(b);var d=c.substr(0,f);c=c.substring(f+b.length);return[c,d,b,e]}return true};WYMeditor.XhtmlLexer=function(a){jQuery.extend(this,new WYMeditor.Lexer(a,"Text"));this.mapHandler("Text","Text");this.addTokens();this.init();return this};WYMeditor.XhtmlLexer.prototype.init=function(){};WYMeditor.XhtmlLexer.prototype.addTokens=function(){this.addCommentTokens("Text");this.addScriptTokens("Text");this.addCssTokens("Text");this.addTagTokens("Text")};WYMeditor.XhtmlLexer.prototype.addCommentTokens=function(a){this.addEntryPattern("<!--",a,"Comment");this.addExitPattern("-->","Comment")};WYMeditor.XhtmlLexer.prototype.addScriptTokens=function(a){this.addEntryPattern("<script",a,"Script");this.addExitPattern("<\/script>","Script")};WYMeditor.XhtmlLexer.prototype.addCssTokens=function(a){this.addEntryPattern("<style",a,"Css");this.addExitPattern("</style>","Css")};WYMeditor.XhtmlLexer.prototype.addTagTokens=function(a){this.addSpecialPattern("<\\s*[a-z0-9:-]+\\s*>",a,"OpeningTag");this.addEntryPattern("<[a-z0-9:-]+[\\/ \\>]+",a,"OpeningTag");this.addInTagDeclarationTokens("OpeningTag");this.addSpecialPattern("</\\s*[a-z0-9:-]+\\s*>",a,"ClosingTag")};WYMeditor.XhtmlLexer.prototype.addInTagDeclarationTokens=function(a){this.addSpecialPattern("\\s+",a,"Ignore");this.addAttributeTokens(a);this.addExitPattern("/>",a);this.addExitPattern(">",a)};WYMeditor.XhtmlLexer.prototype.addAttributeTokens=function(a){this.addSpecialPattern("\\s*[a-z-_0-9]*:?[a-z-_0-9]+\\s*(?==)\\s*",a,"TagAttributes");this.addEntryPattern('=\\s*"',a,"DoubleQuotedAttribute");this.addPattern('\\\\"',"DoubleQuotedAttribute");this.addExitPattern('"',"DoubleQuotedAttribute");this.addEntryPattern("=\\s*'",a,"SingleQuotedAttribute");this.addPattern("\\\\'","SingleQuotedAttribute");this.addExitPattern("'","SingleQuotedAttribute");this.addSpecialPattern("=\\s*[^>\\s]*",a,"UnquotedAttribute")};WYMeditor.XhtmlParser=function(a,b){var b=b||"Text";this._Lexer=new WYMeditor.XhtmlLexer(this);this._Listener=a;this._mode=b;this._matches=[];this._last_match="";this._current_match="";return this};WYMeditor.XhtmlParser.prototype.parse=function(a){this._Lexer.parse(this.beforeParsing(a));return this.afterParsing(this._Listener.getResult())};WYMeditor.XhtmlParser.prototype.beforeParsing=function(a){if(a.match(/class="MsoNormal"/)||a.match(/ns = "urn:schemas-microsoft-com/)){this._Listener.avoidStylingTagsAndAttributes()}return this._Listener.beforeParsing(a)};WYMeditor.XhtmlParser.prototype.afterParsing=function(a){if(this._Listener._avoiding_tags_implicitly){this._Listener.allowStylingTagsAndAttributes()}return this._Listener.afterParsing(a)};WYMeditor.XhtmlParser.prototype.Ignore=function(a,b){return true};WYMeditor.XhtmlParser.prototype.Text=function(a){this._Listener.addContent(a);return true};WYMeditor.XhtmlParser.prototype.Comment=function(b,a){return this._addNonTagBlock(b,a,"addComment")};WYMeditor.XhtmlParser.prototype.Script=function(b,a){return this._addNonTagBlock(b,a,"addScript")};WYMeditor.XhtmlParser.prototype.Css=function(b,a){return this._addNonTagBlock(b,a,"addCss")};WYMeditor.XhtmlParser.prototype._addNonTagBlock=function(a,c,b){switch(c){case WYMeditor.LEXER_ENTER:this._non_tag=a;break;case WYMeditor.LEXER_UNMATCHED:this._non_tag+=a;break;case WYMeditor.LEXER_EXIT:switch(b){case"addComment":this._Listener.addComment(this._non_tag+a);break;case"addScript":this._Listener.addScript(this._non_tag+a);break;case"addCss":this._Listener.addCss(this._non_tag+a);break}}return true};WYMeditor.XhtmlParser.prototype.OpeningTag=function(a,b){switch(b){case WYMeditor.LEXER_ENTER:this._tag=this.normalizeTag(a);this._tag_attributes={};break;case WYMeditor.LEXER_SPECIAL:this._callOpenTagListener(this.normalizeTag(a));break;case WYMeditor.LEXER_EXIT:this._callOpenTagListener(this._tag,this._tag_attributes)}return true};WYMeditor.XhtmlParser.prototype.ClosingTag=function(a,b){this._callCloseTagListener(this.normalizeTag(a));return true};WYMeditor.XhtmlParser.prototype._callOpenTagListener=function(a,b){var b=b||{};this.autoCloseUnclosedBeforeNewOpening(a);if(this._Listener.isBlockTag(a)){this._Listener._tag_stack.push(a);this._Listener.fixNestingBeforeOpeningBlockTag(a,b);this._Listener.openBlockTag(a,b);this._increaseOpenTagCounter(a)}else{if(this._Listener.isInlineTag(a)){this._Listener.inlineTag(a,b)}else{this._Listener.openUnknownTag(a,b);this._increaseOpenTagCounter(a)}}this._Listener.last_tag=a;this._Listener.last_tag_opened=true;this._Listener.last_tag_attributes=b};WYMeditor.XhtmlParser.prototype._callCloseTagListener=function(a){if(this._decreaseOpenTagCounter(a)){this.autoCloseUnclosedBeforeTagClosing(a);if(this._Listener.isBlockTag(a)){var b=this._Listener._tag_stack.pop();if(b==false){return}else{if(b!=a){a=b}}this._Listener.closeBlockTag(a)}else{this._Listener.closeUnknownTag(a)}}else{this._Listener.closeUnopenedTag(a)}this._Listener.last_tag=a;this._Listener.last_tag_opened=false};WYMeditor.XhtmlParser.prototype._increaseOpenTagCounter=function(a){this._Listener._open_tags[a]=this._Listener._open_tags[a]||0;this._Listener._open_tags[a]++};WYMeditor.XhtmlParser.prototype._decreaseOpenTagCounter=function(a){if(this._Listener._open_tags[a]){this._Listener._open_tags[a]--;if(this._Listener._open_tags[a]==0){this._Listener._open_tags[a]=undefined}return true}return false};WYMeditor.XhtmlParser.prototype.autoCloseUnclosedBeforeNewOpening=function(a){this._autoCloseUnclosed(a,false)};WYMeditor.XhtmlParser.prototype.autoCloseUnclosedBeforeTagClosing=function(a){this._autoCloseUnclosed(a,true)};WYMeditor.XhtmlParser.prototype._autoCloseUnclosed=function(c,d){var d=d||false;if(this._Listener._open_tags){for(var a in this._Listener._open_tags){var b=this._Listener._open_tags[a];if(b>0&&this._Listener.shouldCloseTagAutomatically(a,c,d)){this._callCloseTagListener(a,true)}}}};WYMeditor.XhtmlParser.prototype.getTagReplacements=function(){return this._Listener.getTagReplacements()};WYMeditor.XhtmlParser.prototype.normalizeTag=function(a){a=a.replace(/^([\s<\/>]*)|([\s<\/>]*)$/gm,"").toLowerCase();var b=this._Listener.getTagReplacements();if(b[a]){return b[a]}return a};WYMeditor.XhtmlParser.prototype.TagAttributes=function(a,b){if(WYMeditor.LEXER_SPECIAL==b){this._current_attribute=a}return true};WYMeditor.XhtmlParser.prototype.DoubleQuotedAttribute=function(a,b){if(WYMeditor.LEXER_UNMATCHED==b){this._tag_attributes[this._current_attribute]=a}return true};WYMeditor.XhtmlParser.prototype.SingleQuotedAttribute=function(a,b){if(WYMeditor.LEXER_UNMATCHED==b){this._tag_attributes[this._current_attribute]=a}return true};WYMeditor.XhtmlParser.prototype.UnquotedAttribute=function(a,b){this._tag_attributes[this._current_attribute]=a.replace(/^=/,"");return true};WYMeditor.XhtmlSaxListener=function(){this.output="";this.helper=new WYMeditor.XmlHelper();this._open_tags={};this.validator=WYMeditor.XhtmlValidator;this._tag_stack=[];this.avoided_tags=[];this.entities={"&nbsp;":"&#160;","&iexcl;":"&#161;","&cent;":"&#162;","&pound;":"&#163;","&curren;":"&#164;","&yen;":"&#165;","&brvbar;":"&#166;","&sect;":"&#167;","&uml;":"&#168;","&copy;":"&#169;","&ordf;":"&#170;","&laquo;":"&#171;","&not;":"&#172;","&shy;":"&#173;","&reg;":"&#174;","&macr;":"&#175;","&deg;":"&#176;","&plusmn;":"&#177;","&sup2;":"&#178;","&sup3;":"&#179;","&acute;":"&#180;","&micro;":"&#181;","&para;":"&#182;","&middot;":"&#183;","&cedil;":"&#184;","&sup1;":"&#185;","&ordm;":"&#186;","&raquo;":"&#187;","&frac14;":"&#188;","&frac12;":"&#189;","&frac34;":"&#190;","&iquest;":"&#191;","&Agrave;":"&#192;","&Aacute;":"&#193;","&Acirc;":"&#194;","&Atilde;":"&#195;","&Auml;":"&#196;","&Aring;":"&#197;","&AElig;":"&#198;","&Ccedil;":"&#199;","&Egrave;":"&#200;","&Eacute;":"&#201;","&Ecirc;":"&#202;","&Euml;":"&#203;","&Igrave;":"&#204;","&Iacute;":"&#205;","&Icirc;":"&#206;","&Iuml;":"&#207;","&ETH;":"&#208;","&Ntilde;":"&#209;","&Ograve;":"&#210;","&Oacute;":"&#211;","&Ocirc;":"&#212;","&Otilde;":"&#213;","&Ouml;":"&#214;","&times;":"&#215;","&Oslash;":"&#216;","&Ugrave;":"&#217;","&Uacute;":"&#218;","&Ucirc;":"&#219;","&Uuml;":"&#220;","&Yacute;":"&#221;","&THORN;":"&#222;","&szlig;":"&#223;","&agrave;":"&#224;","&aacute;":"&#225;","&acirc;":"&#226;","&atilde;":"&#227;","&auml;":"&#228;","&aring;":"&#229;","&aelig;":"&#230;","&ccedil;":"&#231;","&egrave;":"&#232;","&eacute;":"&#233;","&ecirc;":"&#234;","&euml;":"&#235;","&igrave;":"&#236;","&iacute;":"&#237;","&icirc;":"&#238;","&iuml;":"&#239;","&eth;":"&#240;","&ntilde;":"&#241;","&ograve;":"&#242;","&oacute;":"&#243;","&ocirc;":"&#244;","&otilde;":"&#245;","&ouml;":"&#246;","&divide;":"&#247;","&oslash;":"&#248;","&ugrave;":"&#249;","&uacute;":"&#250;","&ucirc;":"&#251;","&uuml;":"&#252;","&yacute;":"&#253;","&thorn;":"&#254;","&yuml;":"&#255;","&OElig;":"&#338;","&oelig;":"&#339;","&Scaron;":"&#352;","&scaron;":"&#353;","&Yuml;":"&#376;","&fnof;":"&#402;","&circ;":"&#710;","&tilde;":"&#732;","&Alpha;":"&#913;","&Beta;":"&#914;","&Gamma;":"&#915;","&Delta;":"&#916;","&Epsilon;":"&#917;","&Zeta;":"&#918;","&Eta;":"&#919;","&Theta;":"&#920;","&Iota;":"&#921;","&Kappa;":"&#922;","&Lambda;":"&#923;","&Mu;":"&#924;","&Nu;":"&#925;","&Xi;":"&#926;","&Omicron;":"&#927;","&Pi;":"&#928;","&Rho;":"&#929;","&Sigma;":"&#931;","&Tau;":"&#932;","&Upsilon;":"&#933;","&Phi;":"&#934;","&Chi;":"&#935;","&Psi;":"&#936;","&Omega;":"&#937;","&alpha;":"&#945;","&beta;":"&#946;","&gamma;":"&#947;","&delta;":"&#948;","&epsilon;":"&#949;","&zeta;":"&#950;","&eta;":"&#951;","&theta;":"&#952;","&iota;":"&#953;","&kappa;":"&#954;","&lambda;":"&#955;","&mu;":"&#956;","&nu;":"&#957;","&xi;":"&#958;","&omicron;":"&#959;","&pi;":"&#960;","&rho;":"&#961;","&sigmaf;":"&#962;","&sigma;":"&#963;","&tau;":"&#964;","&upsilon;":"&#965;","&phi;":"&#966;","&chi;":"&#967;","&psi;":"&#968;","&omega;":"&#969;","&thetasym;":"&#977;","&upsih;":"&#978;","&piv;":"&#982;","&ensp;":"&#8194;","&emsp;":"&#8195;","&thinsp;":"&#8201;","&zwnj;":"&#8204;","&zwj;":"&#8205;","&lrm;":"&#8206;","&rlm;":"&#8207;","&ndash;":"&#8211;","&mdash;":"&#8212;","&lsquo;":"&#8216;","&rsquo;":"&#8217;","&sbquo;":"&#8218;","&ldquo;":"&#8220;","&rdquo;":"&#8221;","&bdquo;":"&#8222;","&dagger;":"&#8224;","&Dagger;":"&#8225;","&bull;":"&#8226;","&hellip;":"&#8230;","&permil;":"&#8240;","&prime;":"&#8242;","&Prime;":"&#8243;","&lsaquo;":"&#8249;","&rsaquo;":"&#8250;","&oline;":"&#8254;","&frasl;":"&#8260;","&euro;":"&#8364;","&image;":"&#8465;","&weierp;":"&#8472;","&real;":"&#8476;","&trade;":"&#8482;","&alefsym;":"&#8501;","&larr;":"&#8592;","&uarr;":"&#8593;","&rarr;":"&#8594;","&darr;":"&#8595;","&harr;":"&#8596;","&crarr;":"&#8629;","&lArr;":"&#8656;","&uArr;":"&#8657;","&rArr;":"&#8658;","&dArr;":"&#8659;","&hArr;":"&#8660;","&forall;":"&#8704;","&part;":"&#8706;","&exist;":"&#8707;","&empty;":"&#8709;","&nabla;":"&#8711;","&isin;":"&#8712;","&notin;":"&#8713;","&ni;":"&#8715;","&prod;":"&#8719;","&sum;":"&#8721;","&minus;":"&#8722;","&lowast;":"&#8727;","&radic;":"&#8730;","&prop;":"&#8733;","&infin;":"&#8734;","&ang;":"&#8736;","&and;":"&#8743;","&or;":"&#8744;","&cap;":"&#8745;","&cup;":"&#8746;","&int;":"&#8747;","&there4;":"&#8756;","&sim;":"&#8764;","&cong;":"&#8773;","&asymp;":"&#8776;","&ne;":"&#8800;","&equiv;":"&#8801;","&le;":"&#8804;","&ge;":"&#8805;","&sub;":"&#8834;","&sup;":"&#8835;","&nsub;":"&#8836;","&sube;":"&#8838;","&supe;":"&#8839;","&oplus;":"&#8853;","&otimes;":"&#8855;","&perp;":"&#8869;","&sdot;":"&#8901;","&lceil;":"&#8968;","&rceil;":"&#8969;","&lfloor;":"&#8970;","&rfloor;":"&#8971;","&lang;":"&#9001;","&rang;":"&#9002;","&loz;":"&#9674;","&spades;":"&#9824;","&clubs;":"&#9827;","&hearts;":"&#9829;","&diams;":"&#9830;"};this.block_tags=["a","abbr","acronym","address","area","b","base","bdo","big","blockquote","body","button","caption","cite","code","col","colgroup","dd","del","div","dfn","dl","dt","em","fieldset","form","head","h1","h2","h3","h4","h5","h6","html","i","ins","kbd","label","legend","li","map","noscript","object","ol","optgroup","option","p","param","pre","q","samp","script","select","small","span","strong","style","sub","sup","table","tbody","td","textarea","tfoot","th","thead","title","tr","tt","ul","var","extends"];this.inline_tags=["br","hr","img","input"];return this};WYMeditor.XhtmlSaxListener.prototype.shouldCloseTagAutomatically=function(a,c,b){var b=b||false;if(a=="td"){if((b&&c=="tr")||(!b&&c=="td")){return true}}if(a=="option"){if((b&&c=="select")||(!b&&c=="option")){return true}}return false};WYMeditor.XhtmlSaxListener.prototype.beforeParsing=function(a){this.output="";return a};WYMeditor.XhtmlSaxListener.prototype.afterParsing=function(a){a=this.replaceNamedEntities(a);a=this.joinRepeatedEntities(a);a=this.removeEmptyTags(a);a=this.removeBrInPre(a);return a};WYMeditor.XhtmlSaxListener.prototype.replaceNamedEntities=function(b){for(var a in this.entities){b=b.replace(new RegExp(a,"g"),this.entities[a])}return b};WYMeditor.XhtmlSaxListener.prototype.joinRepeatedEntities=function(b){var a="em|strong|sub|sup|acronym|pre|del|address";return b.replace(new RegExp("</("+a+")><\\1>",""),"").replace(new RegExp("(s*<("+a+")>s*){2}(.*)(s*</\\2>s*){2}",""),"<$2>$3<$2>")};WYMeditor.XhtmlSaxListener.prototype.removeEmptyTags=function(a){return a.replace(new RegExp("<("+this.block_tags.join("|").replace(/\|td/,"").replace(/\|th/,"")+")>(<br />|&#160;|&nbsp;|\\s)*</\\1>","g"),"")};WYMeditor.XhtmlSaxListener.prototype.removeBrInPre=function(c){var b=c.match(new RegExp("<pre[^>]*>(.*?)</pre>","gmi"));if(b){for(var a=0;a<b.length;a++){c=c.replace(b[a],b[a].replace(new RegExp("<br />","g"),String.fromCharCode(13,10)))}}return c};WYMeditor.XhtmlSaxListener.prototype.getResult=function(){return this.output};WYMeditor.XhtmlSaxListener.prototype.getTagReplacements=function(){return{b:"strong",i:"em"}};WYMeditor.XhtmlSaxListener.prototype.addContent=function(a){this.output+=a};WYMeditor.XhtmlSaxListener.prototype.addComment=function(a){if(this.remove_comments){this.output+=a}};WYMeditor.XhtmlSaxListener.prototype.addScript=function(a){if(!this.remove_scripts){this.output+=a}};WYMeditor.XhtmlSaxListener.prototype.addCss=function(a){if(!this.remove_embeded_styles){this.output+=a}};WYMeditor.XhtmlSaxListener.prototype.openBlockTag=function(a,b){this.output+=this.helper.tag(a,this.validator.getValidTagAttributes(a,b),true)};WYMeditor.XhtmlSaxListener.prototype.inlineTag=function(a,b){this.output+=this.helper.tag(a,this.validator.getValidTagAttributes(a,b))};WYMeditor.XhtmlSaxListener.prototype.openUnknownTag=function(a,b){};WYMeditor.XhtmlSaxListener.prototype.closeBlockTag=function(a){this.output=this.output.replace(/<br \/>$/,"")+this._getClosingTagContent("before",a)+"</"+a+">"+this._getClosingTagContent("after",a)};WYMeditor.XhtmlSaxListener.prototype.closeUnknownTag=function(a){};WYMeditor.XhtmlSaxListener.prototype.closeUnopenedTag=function(a){this.output+="</"+a+">"};WYMeditor.XhtmlSaxListener.prototype.avoidStylingTagsAndAttributes=function(){this.avoided_tags=["div","span"];this.validator.skiped_attributes=["style"];this.validator.skiped_attribute_values=["MsoNormal","main1"];this._avoiding_tags_implicitly=true};WYMeditor.XhtmlSaxListener.prototype.allowStylingTagsAndAttributes=function(){this.avoided_tags=[];this.validator.skiped_attributes=[];this.validator.skiped_attribute_values=[];this._avoiding_tags_implicitly=false};WYMeditor.XhtmlSaxListener.prototype.isBlockTag=function(a){return !WYMeditor.Helper.contains(this.avoided_tags,a)&&WYMeditor.Helper.contains(this.block_tags,a)};WYMeditor.XhtmlSaxListener.prototype.isInlineTag=function(a){return !WYMeditor.Helper.contains(this.avoided_tags,a)&&WYMeditor.Helper.contains(this.inline_tags,a)};WYMeditor.XhtmlSaxListener.prototype.insertContentAfterClosingTag=function(a,b){this._insertContentWhenClosingTag("after",a,b)};WYMeditor.XhtmlSaxListener.prototype.insertContentBeforeClosingTag=function(a,b){this._insertContentWhenClosingTag("before",a,b)};WYMeditor.XhtmlSaxListener.prototype.fixNestingBeforeOpeningBlockTag=function(a,b){if(a!="li"&&(a=="ul"||a=="ol")&&this.last_tag&&!this.last_tag_opened&&this.last_tag=="li"){this.output=this.output.replace(/<\/li>$/,"");this.insertContentAfterClosingTag(a,"</li>")}};WYMeditor.XhtmlSaxListener.prototype._insertContentWhenClosingTag=function(b,a,c){if(!this["_insert_"+b+"_closing"]){this["_insert_"+b+"_closing"]=[]}if(!this["_insert_"+b+"_closing"][a]){this["_insert_"+b+"_closing"][a]=[]}this["_insert_"+b+"_closing"][a].push(c)};WYMeditor.XhtmlSaxListener.prototype._getClosingTagContent=function(b,a){if(this["_insert_"+b+"_closing"]&&this["_insert_"+b+"_closing"][a]&&this["_insert_"+b+"_closing"][a].length>0){return this["_insert_"+b+"_closing"][a].pop()}return""};WYMeditor.WymCssLexer=function(b,a){var a=(typeof a=="undefined"?true:a);jQuery.extend(this,new WYMeditor.Lexer(b,(a?"Ignore":"WymCss")));this.mapHandler("WymCss","Ignore");if(a==true){this.addEntryPattern("/\\\x2a[<\\s]*WYMeditor[>\\s]*\\\x2a/","Ignore","WymCss");this.addExitPattern("/\\\x2a[</\\s]*WYMeditor[>\\s]*\\\x2a/","WymCss")}this.addSpecialPattern("[\\sa-z1-6]*\\\x2e[a-z-_0-9]+","WymCss","WymCssStyleDeclaration");this.addEntryPattern("/\\\x2a","WymCss","WymCssComment");this.addExitPattern("\\\x2a/","WymCssComment");this.addEntryPattern("\x7b","WymCss","WymCssStyle");this.addExitPattern("\x7d","WymCssStyle");this.addEntryPattern("/\\\x2a","WymCssStyle","WymCssFeedbackStyle");this.addExitPattern("\\\x2a/","WymCssFeedbackStyle");return this};WYMeditor.WymCssParser=function(){this._in_style=false;this._has_title=false;this.only_wym_blocks=true;this.css_settings={classesItems:[],editorStyles:[],dialogStyles:[]};return this};WYMeditor.WymCssParser.prototype.parse=function(a,b){var b=(typeof b=="undefined"?this.only_wym_blocks:b);this._Lexer=new WYMeditor.WymCssLexer(this,b);this._Lexer.parse(a)};WYMeditor.WymCssParser.prototype.Ignore=function(a,b){return true};WYMeditor.WymCssParser.prototype.WymCssComment=function(b,a){if(b.match(/end[a-z0-9\s]*wym[a-z0-9\s]*/mi)){return false}if(a==WYMeditor.LEXER_UNMATCHED){if(!this._in_style){this._has_title=true;this._current_item={title:WYMeditor.Helper.trim(b)}}else{if(this._current_item[this._current_element]){if(!this._current_item[this._current_element].expressions){this._current_item[this._current_element].expressions=[b]}else{this._current_item[this._current_element].expressions.push(b)}}}this._in_style=true}return true};WYMeditor.WymCssParser.prototype.WymCssStyle=function(b,a){if(a==WYMeditor.LEXER_UNMATCHED){b=WYMeditor.Helper.trim(b);if(b!=""){this._current_item[this._current_element].style=b}}else{if(a==WYMeditor.LEXER_EXIT){this._in_style=false;this._has_title=false;this.addStyleSetting(this._current_item)}}return true};WYMeditor.WymCssParser.prototype.WymCssFeedbackStyle=function(b,a){if(a==WYMeditor.LEXER_UNMATCHED){this._current_item[this._current_element].feedback_style=b.replace(/^([\s\/\*]*)|([\s\/\*]*)$/gm,"")}return true};WYMeditor.WymCssParser.prototype.WymCssStyleDeclaration=function(b){b=b.replace(/^([\s\.]*)|([\s\.*]*)$/gm,"");var a="";if(b.indexOf(".")>0){var c=b.split(".");this._current_element=c[1];var a=c[0]}else{this._current_element=b}if(!this._has_title){this._current_item={title:(!a?"":a.toUpperCase()+": ")+this._current_element};this._has_title=true}if(!this._current_item[this._current_element]){this._current_item[this._current_element]={name:this._current_element}}if(a){if(!this._current_item[this._current_element].tags){this._current_item[this._current_element].tags=[a]}else{this._current_item[this._current_element].tags.push(a)}}return true};WYMeditor.WymCssParser.prototype.addStyleSetting=function(a){for(var b in a){var c=a[b];if(typeof c=="object"&&b!="title"){this.css_settings.classesItems.push({name:WYMeditor.Helper.trim(c.name),title:a.title,expr:WYMeditor.Helper.trim((c.expressions||c.tags).join(", "))});if(c.feedback_style){this.css_settings.editorStyles.push({name:"."+WYMeditor.Helper.trim(c.name),css:c.feedback_style})}if(c.style){this.css_settings.dialogStyles.push({name:"."+WYMeditor.Helper.trim(c.name),css:c.style})}}}};jQuery.fn.isPhantomNode=function(){if(this[0].nodeType==3){return !(/[^\t\n\r ]/.test(this[0].data))}return false};WYMeditor.isPhantomNode=function(a){if(a.nodeType==3){return !(/[^\t\n\r ]/.test(a.data))}return false};WYMeditor.isPhantomString=function(a){return !(/[^\t\n\r ]/.test(a))};jQuery.fn.parentsOrSelf=function(b){var a=this;if(a[0].nodeType==3){a=a.parents().slice(0,1)}if(a.filter(b).size()==1){return a}else{return a.parents(b).slice(0,1)}};WYMeditor.Helper={replaceAll:function(d,a,c){var b=new RegExp(a,"g");return(d.replace(b,c))},insertAt:function(b,a,c){return(b.substr(0,c)+a+b.substring(c))},trim:function(a){return a.replace(/^(\s*)|(\s*)$/gm,"")},contains:function(a,c){for(var b=0;b<a.length;b++){if(a[b]===c){return true}}return false},indexOf:function(a,d){var b=-1;for(var c=0;c<a.length;c++){if(a[c]==d){b=c;break}}return(b)},findByName:function(a,b){for(var c=0;c<a.length;c++){var d=a[c];if(d.name==b){return(d)}}return(null)}};WYMeditor.WymClassExplorer=function(a){this._wym=a;this._class="className";this._newLine="\r\n"};WYMeditor.WymClassExplorer.prototype.initIframe=function(iframe){this._iframe=iframe;this._doc=iframe.contentWindow.document;var styles=this._doc.styleSheets[0];var aCss=eval(this._options.editorStyles);this.addCssRules(this._doc,aCss);this._doc.title=this._wym._index;jQuery("html",this._doc).attr("dir",this._options.direction);jQuery(this._doc.body).html(this._wym._html);var wym=this;this._doc.body.onfocus=function(){wym._doc.designMode="on";wym._doc=iframe.contentWindow.document};this._doc.onbeforedeactivate=function(){wym.saveCaret()};this._doc.onkeyup=function(){wym.saveCaret();wym.keyup()};this._doc.onclick=function(){wym.saveCaret()};this._doc.body.onbeforepaste=function(){wym._iframe.contentWindow.event.returnValue=false};this._doc.body.onpaste=function(){wym._iframe.contentWindow.event.returnValue=false;wym.paste(window.clipboardData.getData("Text"))};if(this._initialized){if(jQuery.isFunction(this._options.preBind)){this._options.preBind(this)}this._wym.bindEvents();if(jQuery.isFunction(this._options.postInit)){this._options.postInit(this)}this.listen()}this._initialized=true;this._doc.designMode="on";try{this._doc=iframe.contentWindow.document}catch(e){}};WYMeditor.WymClassExplorer.prototype._exec=function(c,d){switch(c){case WYMeditor.INDENT:case WYMeditor.OUTDENT:var a=this.findUp(this.container(),WYMeditor.LI);if(a){var b=a.parentNode.parentNode;if(a.parentNode.childNodes.length>1||b.tagName.toLowerCase()==WYMeditor.OL||b.tagName.toLowerCase()==WYMeditor.UL){this._doc.execCommand(c)}}break;default:if(d){this._doc.execCommand(c,false,d)}else{this._doc.execCommand(c)}break}};WYMeditor.WymClassExplorer.prototype.selected=function(){var a=this._iframe.contentWindow.document.caretPos;if(a!=null){if(a.parentElement!=undefined){return(a.parentElement())}}};WYMeditor.WymClassExplorer.prototype.saveCaret=function(){this._doc.caretPos=this._doc.selection.createRange()};WYMeditor.WymClassExplorer.prototype.addCssRule=function(a,b){a.addRule(b.name,b.css)};WYMeditor.WymClassExplorer.prototype.insert=function(b){var a=this._doc.selection.createRange();if(jQuery(a.parentElement()).parents(this._options.iframeBodySelector).is("*")){try{a.pasteHTML(b)}catch(c){}}else{this.paste(b)}};WYMeditor.WymClassExplorer.prototype.wrap=function(d,b){var a=this._doc.selection.createRange();if(jQuery(a.parentElement()).parents(this._options.iframeBodySelector).is("*")){try{a.pasteHTML(d+a.text+b)}catch(c){}}};WYMeditor.WymClassExplorer.prototype.unwrap=function(){var a=this._doc.selection.createRange();if(jQuery(a.parentElement()).parents(this._options.iframeBodySelector).is("*")){try{var c=a.text;this._exec("Cut");a.pasteHTML(c)}catch(b){}}};WYMeditor.WymClassExplorer.prototype.keyup=function(){this._selected_image=null};WYMeditor.WymClassExplorer.prototype.setFocusToNode=function(c,b){var a=this._doc.selection.createRange();b=b?true:false;a.moveToElementText(c);a.collapse(b);a.select();c.focus()};WYMeditor.WymClassMozilla=function(a){this._wym=a;this._class="class";this._newLine="\n"};WYMeditor.WymClassMozilla.prototype.initIframe=function(iframe){var wym=this;this._iframe=iframe;this._doc=iframe.contentDocument;var styles=this._doc.styleSheets[0];var aCss=eval(this._options.editorStyles);this.addCssRules(this._doc,aCss);this._doc.title=this._wym._index;jQuery("html",this._doc).attr("dir",this._options.direction);this.html(this._wym._html);this.enableDesignMode();if(jQuery.isFunction(this._options.preBind)){this._options.preBind(this)}this._wym.bindEvents();jQuery(this._doc).bind("keydown",this.keydown);jQuery(this._doc).bind("keyup",this.keyup);jQuery(this._doc).bind("focus",function(){wym.enableDesignMode.call(wym)});if(jQuery.isFunction(this._options.postInit)){this._options.postInit(this)}this.listen()};WYMeditor.WymClassMozilla.prototype.html=function(a){if(typeof a==="string"){try{this._doc.designMode="off"}catch(b){}a=a.replace(/<em(\b[^>]*)>/gi,"<i$1>").replace(/<\/em>/gi,"</i>").replace(/<strong(\b[^>]*)>/gi,"<b$1>").replace(/<\/strong>/gi,"</b>");jQuery(this._doc.body).html(a);this.enableDesignMode()}else{return(jQuery(this._doc.body).html())}};WYMeditor.WymClassMozilla.prototype._exec=function(e,g){if(!this.selected()){return(false)}switch(e){case WYMeditor.INDENT:case WYMeditor.OUTDENT:var f=this.selected();var d=this._iframe.contentWindow.getSelection();var b=d.anchorNode;if(b.nodeName=="#text"){b=b.parentNode}f=this.findUp(f,WYMeditor.BLOCKS);b=this.findUp(b,WYMeditor.BLOCKS);if(f&&f==b&&f.tagName.toLowerCase()==WYMeditor.LI){var c=f.parentNode.parentNode;if(f.parentNode.childNodes.length>1||c.tagName.toLowerCase()==WYMeditor.OL||c.tagName.toLowerCase()==WYMeditor.UL){this._doc.execCommand(e,"",null)}}break;default:if(g){this._doc.execCommand(e,"",g)}else{this._doc.execCommand(e,"",null)}}var a=this.selected();if(a.tagName.toLowerCase()==WYMeditor.BODY){this._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}};WYMeditor.WymClassMozilla.prototype.selected=function(){var b=this._iframe.contentWindow.getSelection();var a=b.focusNode;if(a){if(a.nodeName=="#text"){return(a.parentNode)}else{return(a)}}else{return(null)}};WYMeditor.WymClassMozilla.prototype.addCssRule=function(a,b){a.insertRule(b.name+" {"+b.css+"}",a.cssRules.length)};WYMeditor.WymClassMozilla.prototype.keydown=function(b){var c=WYMeditor.INSTANCES[this.title];var a=null;if(b.ctrlKey){if(b.keyCode==66){c._exec(WYMeditor.BOLD);return false}if(b.keyCode==73){c._exec(WYMeditor.ITALIC);return false}}else{if(b.keyCode==13){if(!b.shiftKey){a=c.selected();if(a&&a.tagName.toLowerCase()==WYMeditor.PRE){b.preventDefault();c.insert("<p></p>")}}}}};WYMeditor.WymClassMozilla.prototype.keyup=function(b){var d=WYMeditor.INSTANCES[this.title];d._selected_image=null;var a=null;if(b.keyCode==13&&!b.shiftKey){jQuery(d._doc.body).children(WYMeditor.BR).remove()}if(b.keyCode!=8&&b.keyCode!=17&&b.keyCode!=46&&b.keyCode!=224&&!b.metaKey&&!b.ctrlKey){a=d.selected();var c=a.tagName.toLowerCase();if(c=="strong"||c=="b"||c=="em"||c=="i"||c=="sub"||c=="sup"||c=="a"){c=a.parentNode.tagName.toLowerCase()}if(c==WYMeditor.BODY){d._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}}};WYMeditor.WymClassMozilla.prototype.enableDesignMode=function(){if(this._doc.designMode=="off"){try{this._doc.designMode="on";this._doc.execCommand("styleWithCSS","",false)}catch(a){}}};WYMeditor.WymClassMozilla.prototype.openBlockTag=function(a,c){var c=this.validator.getValidTagAttributes(a,c);if(a=="span"&&c.style){var b=this.getTagForStyle(c.style);if(b){this._tag_stack.pop();var a=b;this._tag_stack.push(b);c.style=""}else{return}}this.output+=this.helper.tag(a,c,true)};WYMeditor.WymClassMozilla.prototype.getTagForStyle=function(a){if(/bold/.test(a)){return"strong"}if(/italic/.test(a)){return"em"}if(/sub/.test(a)){return"sub"}if(/super/.test(a)){return"sup"}return false};WYMeditor.WymClassOpera=function(a){this._wym=a;this._class="class";this._newLine="\r\n"};WYMeditor.WymClassOpera.prototype.initIframe=function(iframe){this._iframe=iframe;this._doc=iframe.contentWindow.document;var styles=this._doc.styleSheets[0];var aCss=eval(this._options.editorStyles);this.addCssRules(this._doc,aCss);this._doc.title=this._wym._index;jQuery("html",this._doc).attr("dir",this._options.direction);this._doc.designMode="on";this.html(this._wym._html);if(jQuery.isFunction(this._options.preBind)){this._options.preBind(this)}this._wym.bindEvents();jQuery(this._doc).bind("keydown",this.keydown);jQuery(this._doc).bind("keyup",this.keyup);if(jQuery.isFunction(this._options.postInit)){this._options.postInit(this)}this.listen()};WYMeditor.WymClassOpera.prototype._exec=function(a,b){if(b){this._doc.execCommand(a,false,b)}else{this._doc.execCommand(a)}};WYMeditor.WymClassOpera.prototype.selected=function(){var b=this._iframe.contentWindow.getSelection();var a=b.focusNode;if(a){if(a.nodeName=="#text"){return(a.parentNode)}else{return(a)}}else{return(null)}};WYMeditor.WymClassOpera.prototype.addCssRule=function(a,b){a.insertRule(b.name+" {"+b.css+"}",a.cssRules.length)};WYMeditor.WymClassOpera.prototype.keydown=function(a){var c=WYMeditor.INSTANCES[this.title];var b=c._iframe.contentWindow.getSelection();startNode=b.getRangeAt(0).startContainer;if(!jQuery(startNode).parentsOrSelf(WYMeditor.MAIN_CONTAINERS.join(","))[0]&&!jQuery(startNode).parentsOrSelf("li")&&a.keyCode!=WYMeditor.KEY.ENTER&&a.keyCode!=WYMeditor.KEY.LEFT&&a.keyCode!=WYMeditor.KEY.UP&&a.keyCode!=WYMeditor.KEY.RIGHT&&a.keyCode!=WYMeditor.KEY.DOWN&&a.keyCode!=WYMeditor.KEY.BACKSPACE&&a.keyCode!=WYMeditor.KEY.DELETE){c._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}};WYMeditor.WymClassOpera.prototype.keyup=function(a){var b=WYMeditor.INSTANCES[this.title];b._selected_image=null};WYMeditor.WymClassSafari=function(a){this._wym=a;this._class="class";this._newLine="\n"};WYMeditor.WymClassSafari.prototype.initIframe=function(iframe){this._iframe=iframe;this._doc=iframe.contentDocument;var styles=this._doc.styleSheets[0];var aCss=eval(this._options.editorStyles);this.addCssRules(this._doc,aCss);this._doc.title=this._wym._index;jQuery("html",this._doc).attr("dir",this._options.direction);this._doc.designMode="on";this.html(this._wym._html);if(jQuery.isFunction(this._options.preBind)){this._options.preBind(this)}this._wym.bindEvents();jQuery(this._doc).bind("keydown",this.keydown);jQuery(this._doc).bind("keyup",this.keyup);if(jQuery.isFunction(this._options.postInit)){this._options.postInit(this)}this.listen()};WYMeditor.WymClassSafari.prototype._exec=function(e,g){if(!this.selected()){return(false)}switch(e){case WYMeditor.INDENT:case WYMeditor.OUTDENT:var f=this.selected();var d=this._iframe.contentWindow.getSelection();var b=d.anchorNode;if(b.nodeName=="#text"){b=b.parentNode}f=this.findUp(f,WYMeditor.BLOCKS);b=this.findUp(b,WYMeditor.BLOCKS);if(f&&f==b&&f.tagName.toLowerCase()==WYMeditor.LI){var c=f.parentNode.parentNode;if(f.parentNode.childNodes.length>1||c.tagName.toLowerCase()==WYMeditor.OL||c.tagName.toLowerCase()==WYMeditor.UL){this._doc.execCommand(e,"",null)}}break;case WYMeditor.INSERT_ORDEREDLIST:case WYMeditor.INSERT_UNORDEREDLIST:this._doc.execCommand(e,"",null);var f=this.selected();var a=this.findUp(f,WYMeditor.MAIN_CONTAINERS);if(a){jQuery(a).replaceWith(jQuery(a).html())}break;default:if(g){this._doc.execCommand(e,"",g)}else{this._doc.execCommand(e,"",null)}}var a=this.selected();if(a&&a.tagName.toLowerCase()==WYMeditor.BODY){this._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}};WYMeditor.WymClassSafari.prototype.selected=function(){var b=this._iframe.contentWindow.getSelection();var a=b.focusNode;if(a){if(a.nodeName=="#text"){return(a.parentNode)}else{return(a)}}else{return(null)}};WYMeditor.WymClassSafari.prototype.addCssRule=function(a,b){a.insertRule(b.name+" {"+b.css+"}",a.cssRules.length)};WYMeditor.WymClassSafari.prototype.keydown=function(a){var b=WYMeditor.INSTANCES[this.title];if(a.ctrlKey){if(a.keyCode==66){b._exec(WYMeditor.BOLD);return false}if(a.keyCode==73){b._exec(WYMeditor.ITALIC);return false}}};WYMeditor.WymClassSafari.prototype.keyup=function(b){var d=WYMeditor.INSTANCES[this.title];d._selected_image=null;var a=null;if(b.keyCode==13&&!b.shiftKey){jQuery(d._doc.body).children(WYMeditor.BR).remove();a=d.selected();if(a&&a.tagName.toLowerCase()==WYMeditor.PRE){d._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}}if(b.keyCode==13&&b.shiftKey){d._exec("InsertLineBreak")}if(b.keyCode!=8&&b.keyCode!=17&&b.keyCode!=46&&b.keyCode!=224&&!b.metaKey&&!b.ctrlKey){a=d.selected();var c=a.tagName.toLowerCase();if(c=="strong"||c=="b"||c=="em"||c=="i"||c=="sub"||c=="sup"||c=="a"||c=="span"){c=a.parentNode.tagName.toLowerCase()}if(c==WYMeditor.BODY||c==WYMeditor.DIV){d._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}}};WYMeditor.WymClassSafari.prototype.openBlockTag=function(a,c){var c=this.validator.getValidTagAttributes(a,c);if(a=="span"&&c.style){var b=this.getTagForStyle(c.style);if(b){this._tag_stack.pop();var a=b;this._tag_stack.push(b);c.style="";if(typeof c["class"]=="string"){c["class"]=c["class"].replace(/apple-style-span/gi,"")}}else{return}}this.output+=this.helper.tag(a,c,true)};WYMeditor.WymClassSafari.prototype.getTagForStyle=function(a){if(/bold/.test(a)){return"strong"}if(/italic/.test(a)){return"em"}if(/sub/.test(a)){return"sub"}if(/super/.test(a)){return"sup"}return false}; \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.pack.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.pack.js
new file mode 100644
index 0000000..17b3268
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/jquery.wymeditor.pack.js
@@ -0,0 +1 @@
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('if(!f)l f={};(j(){if(!2l.4O||!4O.rD){l aj=["rC","rB","rA","rz","9w","ry","3z","rx","rw","rv","ru","rt","58","rs","cK","rr"];f.4O={};1h(l i=0;i<aj.Y;++i)f.4O[aj[i]]=j(){}}V f.4O=2l.4O})();D.53(f,{rq:"0.5-rp",2w:[],7U:[],5h:[],7Z:"F",3N:"{ro}",a2:"rn",dE:"{rm}",9s:"{rl}",9r:"{rk}",eX:"dw/",7E:"3a.1b",dm:"3a.js",eW:"3H/",a1:"{rj}",eV:"1K/3R/",9q:"{ri}",9t:"{rh}",a0:"{rg}",9Z:"{rf}",9R:"{rd}",9T:"{rc}",81:"{rb}",9S:"{ra}",9X:"{r9}",9O:"{r8}",80:"{r7}",9P:"{r6}",9Y:"{r5}",9I:"{r4}",9L:"{r3}",9K:"{r2}",9J:"{r1}",82:"{r0}",9W:"{qZ}",9V:"{qY}",9p:"{qX}",9o:"{qW}",dO:"3Q",3t:"1j",an:"N",P:"p",9F:"h1",9E:"h2",9D:"h3",9C:"h4",9B:"h5",9A:"h6",5q:"41",6b:"2J",A:"a",88:"br",du:"6Q",de:"3j",6d:"4F",5l:"5I",6o:"2I",6p:"ol",6r:"li",dP:"I",9c:"1P",7C:"1U",61:"M",7B:"5b",64:"aa",7R:"a9",7Q:"a7",7P:"a5",8a:"eU",89:"eT",9d:"eM",9b:"eL",dU:"eK",7L:"qV",dT:"eJ",6t:"ai",6s:"ah",dS:"eI",4q:"qU",7O:"af",qT:"ag",ar:"eP",as:"eQ",6n:1f 6c("p","h1","h2","h3","h4","h5","h6","41","2J"),5t:1f 6c("6L","2J","N","dl","2U","1M","h1","h2","h3","h4","h5","h6","hr","8E","ol","p","41","3j","2I","dd","dt","li","8D","4F","8C","5I","8B","6P"),3T:{av:8,aA:13,qS:35,qR:36,az:37,ay:38,ax:39,aw:40,qQ:1f 6c(37,38,39,40),au:46},qP:{qO:1,qN:2,qM:3},1g:j(5C,1Q){c.3f=f.2w.1X(c)-1;c.7T=5C;c.B=1Q;c.4R=D(5C).1H();if(c.B.O)c.4R=c.B.O;c.B.4L=c.B.4L||c.dz();c.B.5i=c.B.5i||c.B.4L+f.eX+c.B.3a+\'/\';c.B.7N=c.B.7N||c.dy();c.B.9x=c.B.9x||c.B.4L+f.eW;c.B.83=c.B.83||c.B.4L+f.eV;c.B.7M=c.B.7M||c.dx();c.56()}});D.fn.5k=j(1Q){1Q=D.53({O:"",4L:J,5i:J,7N:J,83:J,7M:J,1D:J,3p:J,3a:"3R",dn:R,7F:R,3H:"en",4S:"92",1u:"<N I=\'eH\'>"+"<N I=\'qL\'>"+f.9Z+"</N>"+"<N I=\'qK\'></N>"+"<N I=\'qJ\'>"+f.9Y+f.9X+"</N>"+"<N I=\'qI\'>"+f.82+f.9W+f.9V+"</N>"+"<N I=\'qH\'>"+f.a0+"</N>"+"</N>",ec:"<a I=\'qG\' "+"1P=\'91://ex.5k.ew/\'>f</a>",4n:"<N I=\'ae 5o\'>"+"<1K "+"1U=\'"+f.a1+"qF.O\' "+"4K=\'c.1B.qE.f.2w["+f.3N+"].5w(c)\'"+"></1K>"+"</N>",3g:[],eb:"<N I=\'ad 5o\'>"+"<h2>{qD}</h2>"+"<2I>"+f.9R+"</2I>"+"</N>",e5:"<li I=\'"+f.9S+"\'><a 1P=\'#\' F=\'"+f.9T+"\' M=\'"+f.81+"\'>"+f.81+"</a></li>",e6:[{\'F\':\'eU\',\'M\':\'qC\',\'1b\':\'qB\'},{\'F\':\'eT\',\'M\':\'qA\',\'1b\':\'qz\'},{\'F\':\'eS\',\'M\':\'eS\',\'1b\':\'qy\'},{\'F\':\'eR\',\'M\':\'eR\',\'1b\':\'qx\'},{\'F\':\'eQ\',\'M\':\'qw\',\'1b\':\'qv\'},{\'F\':\'eP\',\'M\':\'qu\',\'1b\':\'qt\'},{\'F\':\'ai\',\'M\':\'ai\',\'1b\':\'qs\'},{\'F\':\'ah\',\'M\':\'ah\',\'1b\':\'qr\'},{\'F\':\'eO\',\'M\':\'eO\',\'1b\':\'qq\'},{\'F\':\'eN\',\'M\':\'eN\',\'1b\':\'qp\'},{\'F\':\'eM\',\'M\':\'aa\',\'1b\':\'qo\'},{\'F\':\'ag\',\'M\':\'ag\',\'1b\':\'qn\'},{\'F\':\'eL\',\'M\':\'a9\',\'1b\':\'qm\'},{\'F\':\'eK\',\'M\':\'a7\',\'1b\':\'ql\'},{\'F\':\'eJ\',\'M\':\'a5\',\'1b\':\'qk\'},{\'F\':\'eI\',\'M\':\'82\',\'1b\':\'qj\'},{\'F\':\'af\',\'M\':\'af\',\'1b\':\'qi\'}],ea:"<N I=\'ac 5o\'>"+"<h2>{qh}</h2>"+"<2I>"+f.9I+"</2I>"+"</N>",e2:"<li I=\'"+f.9J+"\'>"+"<a 1P=\'#\' F=\'"+f.9L+"\'>"+f.9K+"</a></li>",e3:[{\'F\':\'P\',\'M\':\'qg\',\'1b\':\'qf\'},{\'F\':\'9F\',\'M\':\'qe\',\'1b\':\'qd\'},{\'F\':\'9E\',\'M\':\'qc\',\'1b\':\'qb\'},{\'F\':\'9D\',\'M\':\'qa\',\'1b\':\'q9\'},{\'F\':\'9C\',\'M\':\'q8\',\'1b\':\'q7\'},{\'F\':\'9B\',\'M\':\'q6\',\'1b\':\'q5\'},{\'F\':\'9A\',\'M\':\'q4\',\'1b\':\'q3\'},{\'F\':\'5q\',\'M\':\'q2\',\'1b\':\'q1\'},{\'F\':\'6b\',\'M\':\'q0\',\'1b\':\'pZ\'},{\'F\':\'5l\',\'M\':\'pY\',\'1b\':\'pX\'}],e9:"<N I=\'ab 5o\'>"+"<h2>{pW}</h2><2I>"+f.9O+"</2I></N>",e4:"<li I=\'pV"+f.80+"\'><a 1P=\'#\' F=\'"+f.80+"\'>"+f.9P+"</a></li>",3W:[],e7:"<N I=\'eF 5o\'>"+"<h2>{pU}</h2>"+"</N>",e8:"<N I=\'eG 5o\'>"+"<h2>{pT}</h2>"+"<4G I=\'eE\'></4G>"+"</N>",pS:".eH",pR:".ad",pQ:" 2I",pP:".ac",pO:".ab",9l:".eG",pN:".ae 1K",6w:".ae",dN:".eF",e0:".ad a",dZ:".ac a",dY:".ab a",9v:".eE",9e:".es",7D:".ep",60:".a8",7A:".eo",d6:".ee",dg:".eh",df:".eg",dc:".ej",d9:".ei",5Z:".6h",d2:".6g",d3:"",dk:".6i",di:".et",63:".er",dh:".ek",d7:".ef",d4:".ed",dX:".pM",dW:"4e",7S:"eD=no,eC=no,eB=no,eA=no"+",4J=ez,7h=ey,3o=0,2k=0",dR:"eD=no,eC=no,eB=no,eA=no"+",pL=pK,4J=ez,7h=ey,3o=0,2k=0",1I:"<!pJ O pI \'-//pH//ev pG 1.0 pF//pE\'"+" \'91://ex.pD.ew/pC/eu/ev/eu-pB.pA\'>"+"<O 3z=\'"+f.9t+"\'><2T>"+"<2u 7w=\'3p\' 1e=\'X/1b\' 8Z=\'7f\'"+" 1P=\'"+f.9s+"\' />"+"<M>"+f.9p+"</M>"+"<2h 1e=\'X/90\'"+" 1U=\'"+f.9q+"\'></2h>"+"<2h 1e=\'X/90\'"+" 1U=\'"+f.9r+"\'></2h>"+"</2T>"+f.9o+"</O>",dK:"<1j I=\'6f et\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<2U>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.64+"\' />"+"<3k>{aa}</3k>"+"<N I=\'1O\'>"+"<1p>{eq}</1p>"+"<1y 1e=\'X\' I=\'es\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{el}</1p>"+"<1y 1e=\'X\' I=\'a8\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O 1O-a6\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dJ:"<1j I=\'6f er\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<2U>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.7R+"\' />"+"<3k>{a9}</3k>"+"<N I=\'1O\'>"+"<1p>{eq}</1p>"+"<1y 1e=\'X\' I=\'ep\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{pz}</1p>"+"<1y 1e=\'X\' I=\'eo\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{el}</1p>"+"<1y 1e=\'X\' I=\'a8\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O 1O-a6\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dI:"<1j I=\'6f ek\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<2U>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.7Q+"\' />"+"<3k>{a7}</3k>"+"<N I=\'1O\'>"+"<1p>{py}</1p>"+"<1y 1e=\'X\' I=\'ej\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{px}</1p>"+"<1y 1e=\'X\' I=\'ei\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{pw}</1p>"+"<1y 1e=\'X\' I=\'eh\' Q=\'3\' 2G=\'3\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{pv}</1p>"+"<1y 1e=\'X\' I=\'eg\' Q=\'2\' 2G=\'3\' />"+"</N>"+"<N I=\'1O 1O-a6\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dH:"<1j I=\'6f ef\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.7P+"\' />"+"<2U>"+"<3k>{a5}</3k>"+"<N I=\'1O\'>"+"<4G I=\'ee\' 7d=\'10\' 7e=\'50\'></4G>"+"</N>"+"<N I=\'1O\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dG:"<1j I=\'6f ed\'"+" 4K=\'f.5g("+f.3N+")\'"+"></1j>",4A:[],69:"{",68:"}",a4:1a,3y:1a,3w:1a,9f:1a,97:1a},1Q);o c.dq(j(){1f f.1g(D(c),1Q)})};D.53({pu:j(i){o(f.2w[i])}});f.1g.u.56=j(){if(D.84.pt){l 4o=1f f.2D(c)}V if(D.84.ps){l 4o=1f f.2C(c)}V if(D.84.pr){l 4o=1f f.3S(c)}V if(D.84.pq){l 4o=1f f.3d(c)}if(4o){if(D.2A(c.B.a4))c.B.a4(c);l a3=1f f.1l();D.53(a3,4o);c.3Z=1f f.1t(a3);if(c.B.1D||c.B.3p){c.dv()}c.4P=1f f.2W();1h(l 6U in 4o){c[6U]=4o[6U]}c.2p=D(c.7T).e1().5G(c.B.1u).5U().do(\'pp\'+c.3f);if(D.2A(D.fn.4z)){D.4z(c.2p.5W(0),f.a2,c.3f);D.4z(c.7T.5W(0),f.a2,c.3f)}l h=f.1L;l 4n=c.B.4n;4n=h.1k(4n,f.3N,c.3f);4n=h.1k(4n,f.a1,c.B.83);l 1u=D(c.2p).O();1u=h.1k(1u,f.a0,c.B.ec);1u=h.1k(1u,f.9Z,c.B.eb);1u=h.1k(1u,f.9Y,c.B.ea);1u=h.1k(1u,f.9X,c.B.e9);1u=h.1k(1u,f.82,c.B.e8);1u=h.1k(1u,f.9W,4n);1u=h.1k(1u,f.9V,c.B.e7);l 9U=2B(c.B.e6);l 9Q="";1h(l i=0;i<9U.Y;i++){l 5n=9U[i];if(5n.F&&5n.M)l 4m=c.B.e5;l 4m=h.1k(4m,f.9T,5n.F);4m=h.1k(4m,f.81,c.B.69+5n.M+c.B.68);4m=h.1k(4m,f.9S,5n.1b);9Q+=4m}1u=h.1k(1u,f.9R,9Q);l 6e=2B(c.B.3W);l 9N="";1h(l i=0;i<6e.Y;i++){l 4k=6e[i];if(4k.F&&4k.M)l 4j=c.B.e4;4j=h.1k(4j,f.80,4k.F);4j=h.1k(4j,f.9P,4k.M);9N+=4j}1u=h.1k(1u,f.9O,9N);l 9M=2B(c.B.e3);l 9H="";1h(l i=0;i<9M.Y;i++){l 5m=9M[i];if(5m.F&&5m.M)l 4l=c.B.e2;4l=h.1k(4l,f.9L,5m.F);4l=h.1k(4l,f.9K,c.B.69+5m.M+c.B.68);4l=h.1k(4l,f.9J,5m.1b);9H+=4l}1u=h.1k(1u,f.9I,9H);1u=c.9n(1u);D(c.2p).O(1u);D(c.2p).4g(c.B.9l).e1();c.7F()}};f.1g.u.5v=j(){l E=c;D(c.2p).4g(c.B.e0).4e(j(){E.1E.1B.4W();E.dV(D(c).1v(f.7Z));o(J)});D(c.2p).4g(c.B.dZ).4e(j(){E.L(D(c).1v(f.7Z));o(J)});D(c.2p).4g(c.B.9v).2x(j(){D(E.H.1j).O(D(c).1H())}).4W(j(){D(c).6a(\'9u\')}).po(j(){D(c).6a(\'9u\')});D(c.2p).4g(c.B.dY).4e(j(){l 6e=2B(E.B.3W);l 9G=D(c).1v(f.7Z);l 4k=f.1L.aL(6e,9G);if(4k){l 4y=4k.aT;E.6a(9G,4y)}E.1E.1B.4W();o(J)});D(c.B.dX).3x(c.B.dW,j(){E.67()})};f.1g.u.pn=j(){o(c.H!=1a)};f.1g.u.ct=j(){o(c.2p)};f.1g.u.O=j(O){if(1q O===\'3Q\')D(c.H.1j).O(O);V o(D(c.H.1j).O())};f.1g.u.1s=j(){o c.3Z.3X(c.O())};f.1g.u.dV=j(1F){3e(1F){1i f.9d:l L=c.L();if(L||c.2j)c.4M(f.64);1n;1i f.9b:c.4M(f.7R);1n;1i f.dU:c.4M(f.7Q);1n;1i f.dT:c.4M(f.7P);1n;1i f.dS:c.67();c.dC();1n;1i f.7O:c.4M(f.7O,c.B.dR);1n;3R:c.1C(1F);1n}};f.1g.u.L=j(3q){if(3q){l L=1a;if(3q.1o()==f.5l){L=c.L();3e(L.1r.1o()){1i f.6d:1i f.5l:1n;3R:l 7Y=1f 6c(f.6d,f.5l);L=c.2N(c.L(),7Y);1n}if(L!=1a){3q=(L.1r.1o()==f.6d)?f.5l:f.6d;c.9y(L,3q);c.67()}}V{l 7Y=1f 6c(f.P,f.9F,f.9E,f.9D,f.9C,f.9B,f.9A,f.5q,f.6b);L=c.2N(c.L(),7Y);if(L){l 3O=1a;if(3q.1o()==f.6b){l 2J=c.2N(c.L(),f.6b);if(2J==1a){3O=c.H.5Y(3q);L.1z.dQ(3O,L);3O.dr(L);c.5y(3O.pm)}V{l 7X=2J.6q;l 9z=7X.Y;l 7W=1a;if(9z>0)7W=7X.4v(0);1h(l x=0;x<9z;x++){2J.1z.dQ(7X.4v(0),2J)}2J.1z.pl(2J);if(7W)c.5y(7W)}}V c.9y(L,3q);c.67()}}}V o(c.1d())};f.1g.u.6a=j(4j,4y){l L=(c.2j?c.2j:D(c.1d()));L=D(L).4V(4y);D(L).6a(4j);if(!D(L).1v(f.dP))D(L).pk(c.5x)};f.1g.u.2N=j(1c,51){if(1c){l 4i=1c.1r.1o();if(1q(51)==f.dO){77(4i!=51&&4i!=f.3t){1c=1c.1z;4i=1c.1r.1o()}}V{l 7V=J;77(!7V&&4i!=f.3t){1h(l i=0;i<51.Y;i++){if(4i==51[i]){7V=R;1n}}if(!7V){1c=1c.1z;4i=1c.1r.1o()}}}if(4i!=f.3t)o(1c);V o(1a)}V o(1a)};f.1g.u.9y=j(1c,3q){l 3O=c.H.5Y(3q);l O=D(1c).O();1c.1z.pj(3O,1c);D(3O).O(O);c.5y(3O)};f.1g.u.9n=j(4N){if(!f.7U[c.B.3H]){4u{2B(D.9j({9i:c.B.9x+c.B.3H+\'.js\',9h:J}).9g)}4t(e){f.4O.9w("f: 9w 77 ph cX cI.");o 4N}}1h(l 1T in f.7U[c.B.3H]){4N=f.1L.1k(4N,c.B.69+1T+c.B.68,f.7U[c.B.3H][1T])};o(4N)};f.1g.u.dD=j(4N){o(c.B.69+4N+c.B.68)};f.1g.u.2n=j(dM){D(c.2p).4g(c.B.dN).O(dM)};f.1g.u.67=j(){l O=c.1s();D(c.7T).1H(O);D(c.2p).4g(c.B.9v).by(\'.9u\').1H(O);};f.1g.u.4M=j(65,7S,dF){l dL=7S||c.1V.B.7S;l 9m=2l.5X(\'\',\'4M\',dL);if(9m){l 4h="";3e(65){1i(f.64):4h=c.B.dK;1n;1i(f.7R):4h=c.B.dJ;1n;1i(f.7Q):4h=c.B.dI;1n;1i(f.7P):4h=c.B.dH;1n;1i(f.7O):4h=c.B.dG;1n;3R:4h=dF}l h=f.1L;l 1I=c.B.1I;1I=h.1k(1I,f.dE,c.B.4L);1I=h.1k(1I,f.9t,c.B.4S);1I=h.1k(1I,f.9s,c.B.5i+f.7E);1I=h.1k(1I,f.9r,c.B.7N);1I=h.1k(1I,f.9q,c.B.7M);1I=h.1k(1I,f.9p,c.dD(65));1I=h.1k(1I,f.9o,4h);1I=h.1k(1I,f.3N,c.3f);1I=c.9n(1I);l 4f=9m.3A;4f.pg(1I);4f.5e()}};f.1g.u.dC=j(){D(c.2p).4g(c.B.9l).pf()};f.1g.u.dj=j(){l dB=1f pe();o("E-"+dB.pd())};f.1g.u.5B=j(dA){l 3M;l L=c.1d();l aP=dA.8m(c.4s+c.4s);l 4x=1f 2O(c.4s,"g");if(L&&L.1r.1o()!=f.3t){1h(x=aP.Y-1;x>=0;x--){3M=aP[x];3M=3M.S(4x,"<br />");D(L).5G("<p>"+3M+"</p>")}}V{1h(x=0;x<aP.Y;x++){3M=aP[x];3M=3M.S(4x,"<br />");D(c.H.1j).d8("<p>"+3M+"</p>")}}};f.1g.u.8e=j(O){if(c.1E.1B.2z().1x!=1a){c.1C(f.7L,O)}V{c.5B(O)}};f.1g.u.aE=j(2k,2E){if(c.1E.1B.2z().1x!=1a){c.1C(f.7L,2k+c.1E.1B.2z().93()+2E)}};f.1g.u.aD=j(){if(c.1E.1B.2z().1x!=1a){c.1C(f.7L,c.1E.1B.2z().93())}};f.1g.u.5y=j(1c,3U){l 1S=c.H.4Y(),3V=c.1E.1B.2z();3U=3U?0:1;1S.pc(1c);3V.pb(1S);3V.aC(1c,3U);c.1E.1B.4W()};f.1g.u.4T=j(4f,2r){l 1D=4f.4U[0];if(1D){1h(l i=0;i<2r.Y;i++){l 1Y=2r[i];if(1Y.F&&1Y.1b)c.5r(1D,1Y)}}};f.1g.u.dz=j(){o D(D.7G(D(\'2h\'),j(s){o(s.1U&&s.1U.K(/7K\\.5k(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/))})).1v(\'1U\').S(/7K\\.5k(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/,\'\')};f.1g.u.dy=j(){o D(D.7G(D(\'2h\'),j(s){o(s.1U&&s.1U.K(/7K\\.5k(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/))})).1v(\'1U\')};f.1g.u.dx=j(){o D(D.7G(D(\'2h\'),j(s){o(s.1U&&s.1U.K(/7K(-(.*)){0,1}(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/))})).1v(\'1U\')};f.1g.u.pa=j(){o D(D.7G(D(\'2u\'),j(s){o(s.1P&&s.1P.K(/5k\\/dw\\/(.*)7f\\.1b(\\?.*)?$/))})).1v(\'1P\')};f.1g.u.dv=j(){l 5j=1f f.3D();if(c.B.3p){5j.3X(D.9j({9i:c.B.3p,9h:J}).9g)}V{5j.3X(c.B.1D,J)}if(c.B.3W.Y==0){c.B.3W=5j.4B.3W}if(c.B.3g.Y==0){c.B.3g=5j.4B.3g}if(c.B.4A.Y==0){c.B.4A=5j.4B.4A}};f.1g.u.5u=j(){D(c.H.1j).3x("7z",c.7z)};f.1g.u.7z=j(W){l E=f.2w[c.p9.M];E.2j=(W.ds.1r.1o()==f.du)?W.ds:1a};f.dp=j(1P){l 2u=3A.5Y(\'2u\');2u.7w=\'3p\';2u.1P=1P;l 2T=D(\'2T\').5W(0);2T.dr(2u)};f.1g.u.7F=j(){if(c.B.7F&&!f.5h[c.B.3a]){l 9k=J;l 4x=1f 2O(c.B.3a+\'\\/\'+f.7E+\'$\');D(\'2u\').dq(j(){if(c.1P.K(4x))9k=R});if(!9k)f.dp(c.B.5i+f.7E)}D(c.2p).do("p8"+c.B.3a);if(c.B.dn&&!f.5h[c.B.3a]){2B(D.9j({9i:c.B.5i+f.dm,9h:J}).9g)}if(f.5h[c.B.3a]&&f.5h[c.B.3a].56)f.5h[c.B.3a].56(c)};f.5g=j(5a){l E=2l.p7.f.2w[5a];l 4f=2l.3A;l 1d=E.1d();l 65=D(E.B.dk).1H();l 62=E.dj();3e(65){1i f.64:if(1d&&1d.1r&&1d.1r.1o!=f.A)1d=D(1d).4V(f.A);if(!1d&&E.2j)1d=D(E.2j).4V(f.A);1n}if(D.2A(E.B.9f))E.B.9f(E,2l);l 1D=4f.4U[0];l 2r=2B(E.B.4A);E.4T(4f,2r);if(1d){D(E.B.9e).1H(D(1d).1v(f.9c));D(E.B.7D).1H(D(1d).1v(f.7C));D(E.B.60).1H(D(1d).1v(f.61));D(E.B.7A).1H(D(1d).1v(f.7B))}if(E.2j){D(E.B.63+" "+E.B.7D).1H(D(E.2j).1v(f.7C));D(E.B.63+" "+E.B.60).1H(D(E.2j).1v(f.61));D(E.B.63+" "+E.B.7A).1H(D(E.2j).1v(f.7B))}D(E.B.di+" "+E.B.5Z).4e(j(){l 5f=D(E.B.9e).1H();if(5f.Y>0){l 2u;if(1d[0]&&1d[0].1r.1o()==f.A){2u=1d}V{E.1C(f.9d,62);2u=D("a[1P="+62+"]",E.H.1j)}2u.1v(f.9c,5f).1v(f.61,D(E.B.60).1H())}2l.5e()});D(E.B.63+" "+E.B.5Z).4e(j(){l 5f=D(E.B.7D).1H();if(5f.Y>0){E.1C(f.9b,62);D("6Q[1U$="+62+"]",E.H.1j).1v(f.7C,5f).1v(f.61,D(E.B.60).1H()).1v(f.7B,D(E.B.7A).1H())}2l.5e()});D(E.B.dh+" "+E.B.5Z).4e(j(){l 9a=D(E.B.dg).1H();l 99=D(E.B.df).1H();if(9a>0&&99>0){l 3j=E.H.5Y(f.de);l 98=1a;l p6=1a;l da=D(E.B.dc).1H();l db=3j.p5();db.94=da;1h(x=0;x<9a;x++){98=3j.p4(x);1h(y=0;y<99;y++){98.p3(y)}}D(3j).1v(\'cr\',D(E.B.d9).1H());l 1c=D(E.2N(E.L(),f.6n)).5W(0);if(!1c||!1c.1z)D(E.H.1j).d8(3j);V D(1c).5G(3j)}2l.5e()});D(E.B.d7+" "+E.B.5Z).4e(j(){l d5=D(E.B.d6).1H();E.5B(d5);2l.5e()});D(E.B.d4+" "+E.B.d3).O(E.1s());D(E.B.d2).7z(j(){2l.5e()});if(D.2A(E.B.97))E.B.97(E,2l)};f.2W=j(){c.7y=3A.5Y(\'N\');o c};f.2W.u.C=j(F,1Q,5X){1Q=1Q||J;5X=5X||J;o\'<\'+F+(1Q?c.96(1Q):\'\')+(5X?\'>\':\' />\')};f.2W.u.p2=j(F,2b,1Q){1Q=1Q||J;o\'<\'+F+(1Q?c.96(1Q):\'\')+\'>\'+2b+\'</\'+F+\'>\'};f.2W.u.p1=j(2b){o\'<![p0[\'+2b+\']]>\'};f.2W.u.cZ=j(3L){o c.d1(c.cY(3L))};f.2W.u.d1=j(d0){o d0.S(/&oZ;([a-z]+|(#\\d+));/ig,"&$1;")};f.2W.u.96=j(1Q){l 3L=c;3L.95=\'\';1h(l 1T in 1Q){l oY=\'\';l Q=1Q[1T];if(1q Q!=\'j\'&&Q.Y>0){if(ck(1T)==1T&&1q Q==\'4C\'){1T=Q.oX();Q=Q.4Q()}if(1T!=\'\'&&Q!=\'\'){3L.95+=\' \'+1T+\'="\'+3L.cZ(Q)+\'"\'}}}o 3L.95};f.2W.u.cY=j(3Q,7x){c.7y.94=3Q;c.7y.oW=3Q;l 1N=c.7y.94;if(1q 7x==\'2d\'){if(7x!=J)1N=1N.S(\'"\',\'&oV;\');if(7x==R)1N=1N.S(\'"\',\'&#oU;\')}o 1N};f.2W.u.oT=j(5c){l 1N=[];l 2g=5c.8m(/((=\\s*")(")("))|((=\\s*\\\')(\\\')(\\\'))|((=\\s*[^>\\s]*))/g);if(2g.93()!=5c){1h(l k in 2g){l v=2g[k];if(1q v!=\'j\'&&v.Y!=0){l re=1f 2O(\'(\\\\w+)\\\\s*\'+v);if(K=5c.K(re)){l Q=v.S(/^[\\s=]+/,"");l 5d=Q.oS(0);5d=5d==\'"\'?\'"\':(5d=="\'"?"\'":\'\');if(5d!=\'\'){Q=5d==\'"\'?Q.S(/^"|"+$/g,\'\'):Q.S(/^\'|\'+$/g,\'\')}5c=5c.S(K[0],\'\');1N.1X([K[1],Q])}}}}o 1N};f.bz={"8V":{"oR":{"59":["55","2T","O","7i","1R","2h","1m","M"],"G":["I","id","1m","M","cW","cV"]},"cX":{"59":["55","br","hr","1K","1R","2h"],"G":{"3z":["92","cL"],"0":"3H","1":"3L:3H"}},"cU":{"G":{"cW":/^(\\w){1}$/,"cV":/^(\\d)+$/}}},"8W":{"2l":{"7b":["1j"],"G":["4K","oQ"]},"1M":{"7b":["1M","1y","4G","4X","a","1p","2t"],"G":["oP","oO","oN","oM","oL","aK"]},"cU":{"59":["55","6S","br","cu","oK","2T","O","1K","7i","1R","2h","1m","M"],"G":["oJ","oI","aJ"]},"oH":{"59":["55","6S","br","2T","O","7i","1R","2h","1m","M"],"G":["aI","oG","oF","oE","oD","oC","oB"]}},"1J":{"a":{"G":{"0":"7g","1":"cS","2":"1P","3":"cE","4":"F","7w":/^(7v|cT|3p|2L|5U|7n|7r|5a|7p|7q|7s|7m|7l|7u|7o|7t||7k|7j)+$/,"cD":/^(7v|cT|3p|2L|5U|7n|7r|5a|7p|7q|7s|7m|7l|7u|7o|7t||7k|7j)+$/,"cR":/^(cQ|cP|8F|cO|cN|cM)$/,"5":"1e"}},"0":"6T","1":"8y","2":"6L","bv":{"G":{"0":"5b","1":"cS","2":"1P","oA":/^(R|J)$/,"cR":/^(cQ|cP|8F|cO|cN|cM)$/},"2c":["5b"]},"3":"b","55":{"G":["1P"],"2c":["1P"]},"6S":{"G":{"3z":/^(92|cL)$/},"2c":["3z"]},"4":"bu","2J":{"G":["54"]},"5":"1j","6":"br","2t":{"G":{"2Z":/^(2Z)$/,"1e":/^(2t|cH|cG)$/,"0":"Q"},"3K":"1M"},"7":"bt","8":"54","9":"bs","6R":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","3r":/^(\\d)+$/,"49":/^(3o|48|47|45)$/,"2":"4J"},"3K":"5K"},"5K":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","3r":/^(\\d)+$/,"49":/^(3o|48|47|45)$/,"2":"4J"}},"10":"dd","8x":{"G":{"0":"54","cF":/^([0-9]){8}/}},"11":"N","12":"bq","13":"dl","14":"dt","15":"em","2U":{"3K":"1M"},"1M":{"G":{"0":"5N","1":"5Q","2":"5Q-7g","3":"oz","oy":/^(5W|ox)$/},"2c":["5N"]},"2T":{"G":["cK"]},"16":"h1","17":"h2","18":"h3","19":"h4","20":"h5","21":"h6","22":"hr","O":{"G":["ow"]},"23":"i","6Q":{"G":["5b","1U","7h","ov","ou","cB","4J"],"2c":["5b","1U"]},"1y":{"G":{"0":"5Q","1":"5b","cJ":/^(cJ)$/,"2Z":/^(2Z)$/,"ot":/^(\\d)+$/,"2":"F","8X":/^(8X)$/,"2G":/^(\\d)+$/,"3":"1U","1e":/^(2t|os|cI|5V|bx|oq|op|cH|cG|X)$/,"4":"Q"},"3K":"1M"},"bp":{"G":{"0":"54","cF":/^([0-9]){8}/}},"24":"bo","1p":{"G":["1h"],"3K":"1M"},"25":"3k","26":"li","2u":{"G":{"0":"7g","1":"1P","2":"cE","8Z":/^(8Y|cv|cw|cx|7f|oo|,|;|)+$/i,"7w":/^(7v|7u|7t|7s|7r|7q|7p|7o|cC|5a|5U|7n|7m|2L|3p|7l||7k|7j)+$/i,"cD":/^(7v|7u|7t|7s|7r|7q|7p|7o|cC|5a|5U|7n|7m|2L|3p|7l||7k|7j)+$/i,"3":"1e"},"3K":"2T"},"bn":{"G":["id","F"],"2c":["id"]},"7i":{"G":{"0":"2b","91-bw":/^(2b\\-1e|om|ok|oj\\-oi)$/i,"1":"F","2":"oh"},"2c":["2b"]},"27":"8E","4C":{"G":["og","of","oe","od","4z","oc","7h","F","ob","1e","cB","4J"]},"28":"ol","bm":{"G":{"0":"1p","2Z":/^(2Z)$/},"2c":["1p"]},"6O":{"G":{"0":"1p","2Z":/^(2Z)$/,"1d":/^(1d)$/,"1":"Q"},"3K":"4X"},"29":"p","1R":{"G":{"0":"1e","cA":/^(4z|oa|4C)$/,"1":"cA","2":"Q"},"2c":["F"]},"30":"41","q":{"G":["54"]},"31":"bl","2h":{"G":{"1e":/^(X\\/o9|X\\/90|X\\/o8|X\\/o7|X\\/o6|X\\/3L)$/,"0":"7g","cz":/^(cz)$/,"1":"1U"},"2c":["1e"]},"4X":{"G":{"2Z":/^(2Z)$/,"cy":/^(cy)$/,"0":"F","1":"2G"},"3K":"1M"},"32":"bk","33":"3r","34":"3c","1m":{"G":{"0":"1e","8Z":/^(7f|o5|o4|cx|o3|cw|cv|o2|8Y)$/},"2c":["1e"]},"35":"3b","36":"3P","3j":{"G":{"0":"cs","1":"o1","2":"o0","cu":/^(nZ|nY|nX|nW|nV|nU|nT|ct|cs)$/,"nS":/^(nR|nQ|7d|7e|8Y)$/,"3":"cr","4":"4J"}},"8D":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","49":/^(3o|48|47|45)$/}},"4F":{"G":{"0":"6T","4d":/^(2k|2E|4c|4b|2Y)$/,"1":"cq","2":"2Y","3":"4a","cp":/^(\\d)+$/,"4":"co","cn":/^(\\d)+$/,"1G":/^(6R|5K|1O|cm)$/,"49":/^(3o|48|47|45)$/}},"4G":{"G":["7e","7d","2Z","F","8X"],"2c":["7e","7d"],"3K":"1M"},"8C":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","49":/^(3o|48|47)$/,"2":"45"}},"5I":{"G":{"0":"6T","4d":/^(2k|2E|4c|4b|2Y)$/,"1":"cq","2":"2Y","3":"4a","cp":/^(\\d)+$/,"4":"co","cn":/^(\\d)+$/,"1G":/^(6R|5K|1O|cm)$/,"49":/^(3o|48|47|45)$/}},"8B":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","49":/^(3o|48|47|45)$/}},"37":"M","6P":{"G":{"4d":/^(2E|2k|4c|4b|2Y)$/,"0":"2Y","1":"4a","49":/^(3o|48|47|45)$/}},"38":"bj","39":"2I","40":"l"},6G:[],6F:[],5p:j(C,G){l 7c={};l cl=c.cf(C);1h(l 2i in G){l Q=G[2i];l h=f.1L;if(!h.2F(c.6G,2i)&&!h.2F(c.6F,Q)){if(1q Q!=\'j\'&&h.2F(cl,2i)){if(c.ch(C,2i)){if(c.cg(C,2i,Q)){7c[2i]=Q}}V{7c[2i]=Q}}}}o 7c},ce:j(C){l 1N=[];if(c.1J[C]&&c.1J[C][\'G\']){1h(k in c.1J[C][\'G\']){1N.1X(ck(k)==k?c.1J[C][\'G\'][k]:k)}}o 1N},ci:j(){l 1N=[];1h(l 1T in c.8W){1N.1X(c.8W[1T])}1h(l 1T in c.8V){1N.1X(c.8V[1T])}o 1N},cj:j(C){if(c.1J[C]){o R}1h(l 1T in c.1J){if(c.1J[1T]==C){o R}}o J},cd:j(C){l 8T=[];if(c.cj(C)){l 8U=c.ci();1h(l 1T in 8U){l 3J=8U[1T];if(1q 3J==\'4C\'){l h=f.1L;if((3J[\'59\']&&h.2F(3J[\'59\'],C))||(3J[\'7b\']&&!h.2F(3J[\'7b\'],C))){nP}l 7a=3J[\'G\']?3J[\'G\']:3J[\'nO\'];1h(l k in 7a){8T.1X(1q 7a[k]!=\'3Q\'?k:7a[k])}}}}o 8T},ch:j(C,2i){o c.1J[C]&&((c.1J[C][\'G\']&&c.1J[C][\'G\'][2i])||(c.1J[C][\'2c\']&&f.1L.2F(c.1J[C][\'2c\'],2i)))},cg:j(C,2i,Q){if(c.1J[C]&&(c.1J[C][\'G\']&&c.1J[C][\'G\'][2i]&&Q.Y>0&&!Q.K(c.1J[C][\'G\'][2i]))||(c.1J[C]&&c.1J[C][\'2c\']&&f.1L.2F(c.1J[C][\'2c\'],2i)&&Q.Y==0)){o J}o 1q c.1J[C]!=\'2d\'},cf:j(C){if(!c.5T){c.5T={}}if(!c.5T[C]){c.5T[C]=c.ce(C).nN(c.cd(C))}o c.5T[C]}};f.2X=j(78){c.4I=78;c.44=[];c.8S=[];c.5S=1a;o c};f.2X.u.43=j(3n,1p){1p=1p||R;l 58=c.44.Y;c.44[58]=3n;c.8S[58]=1p;c.5S=1a};f.2X.u.K=j(cc){if(c.44.Y==0){o[J,\'\']}l 2g=cc.K(c.cb());if(!2g){o[J,\'\']}l K=2g[0];1h(l i=1;i<2g.Y;i++){if(2g[i]){o[c.8S[i-1],K]}}o[R,2g[0]]};f.2X.u.cb=j(){if(c.5S==1a){1h(l i=0,58=c.44.Y;i<58;i++){c.44[i]=\'(\'+c.c9(c.ca(c.44[i]).S(/([\\/\\(\\)])/g,\'\\\\$1\'))+\')\'}c.5S=1f 2O(c.44.6u("|"),c.c1())}o c.5S};f.2X.u.ca=j(79){o 79.S(/\\(\\?(i|m|s|x|U)\\)/,\'~~~~~~c8\\$1~~~~~~\').S(/\\(\\?(\\-[i|m|s|x|U])\\)/,\'~~~~~~c7\\$1~~~~~~\').S(/\\(\\?\\=(.*)\\)/,\'~~~~~~c6\\$1~~~~~~\').S(/\\(\\?\\!(.*)\\)/,\'~~~~~~c5\\$1~~~~~~\').S(/\\(\\?\\<\\=(.*)\\)/,\'~~~~~~c4\\$1~~~~~~\').S(/\\(\\?\\<\\!(.*)\\)/,\'~~~~~~c3\\$1~~~~~~\').S(/\\(\\?\\:(.*)\\)/,\'~~~~~~c2\\$1~~~~~~\')};f.2X.u.c9=j(79){o 79.S(/~~~~~~c8(.{1})~~~~~~/,"(?\\$1)").S(/~~~~~~c7(.{2})~~~~~~/,"(?\\$1)").S(/~~~~~~c6(.*)~~~~~~/,"(?=\\$1)").S(/~~~~~~c5(.*)~~~~~~/,"(?!\\$1)").S(/~~~~~~c4(.*)~~~~~~/,"(?<=\\$1)").S(/~~~~~~c3(.*)~~~~~~/,"(?<!\\$1)").S(/~~~~~~c2(.*)~~~~~~/,"(?:\\$1)")};f.2X.u.c1=j(){o(c.4I?"m":"mi")};f.5R=j(2L){c.57=[2L];o c};f.5R.u.8O=j(){o c.57[c.57.Y-1]};f.5R.u.8Q=j(2a){c.57.1X(2a)};f.5R.u.8R=j(){if(c.57.Y==1){o J}c.57.4Q();o R};f.71=1;f.bZ=2;f.3E=3;f.5E=4;f.6Y=5;f.2f=j(3Z,2L,78){2L=2L||\'5Q\';c.4I=78||J;c.2o={};c.8P=3Z;c.42=1f f.5R(2L);c.2K={};c.2K[2L]=2L;o c};f.2f.u.43=j(3n,T){l T=T||"5Q";if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n);if(1q c.2K[T]==\'2d\'){c.2K[T]=T}};f.2f.u.2Q=j(3n,T,5P){if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n,5P);if(1q c.2K[5P]==\'2d\'){c.2K[5P]=5P}};f.2f.u.2H=j(3n,T){if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n,"bX");if(1q c.2K[T]==\'2d\'){c.2K[T]=T}};f.2f.u.4E=j(3n,T,5O){if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n,\'bV\'+5O);if(1q c.2K[5O]==\'2d\'){c.2K[5O]=5O}};f.2f.u.8q=j(T,75){c.2K[T]=75};f.2f.u.3X=j(1w){if(1q c.8P==\'2d\'){o J}l Y=1w.Y;l 3I;77(1q(3I=c.bR(1w))==\'4C\'){l 1w=3I[0];l 76=3I[1];l 3m=3I[2];l T=3I[3];if(!c.c0(76,3m,T)){o J}if(1w==\'\'){o R}if(1w.Y==Y){o J}Y=1w.Y}if(!3I){o J}o c.4H(1w,f.3E)};f.2f.u.c0=j(76,3m,T){T=T||J;if(!c.4H(76,f.3E)){o J}if(1q T==\'nM\'){o c.4H(3m,f.bZ)}if(c.bY(T)){if(!c.4H(3m,f.5E)){o J}o c.42.8R()}if(c.bW(T)){c.42.8Q(c.bU(T));if(!c.4H(3m,f.6Y)){o J}o c.42.8R()}c.42.8Q(T);o c.4H(3m,f.71)};f.2f.u.bY=j(T){o(T==="bX")};f.2f.u.bW=j(T){o(T.6y(0,1)=="bV")};f.2f.u.bU=j(T){o T.6y(1)};f.2f.u.4H=j(2b,bS){if(2b===\'\'){o R}l bT=c.42.8O();l 75=c.2K[bT];l 1N;2B(\'1N = c.8P.\'+75+\'(2b, bS);\');o 1N};f.2f.u.bR=j(1w){l 3m=c.2o[c.42.8O()].K(1w);l K=3m[1];l 5N=3m[0];if(5N){l 8N=1w.8h(K);l bQ=1w.aN(0,8N);1w=1w.6y(8N+K.Y);o[1w,bQ,K,5N]}o R};f.3l=j(3Z){D.53(c,1f f.2f(3Z,\'3h\'));c.8q(\'3h\',\'3h\');c.bP();c.56();o c};f.3l.u.56=j(){};f.3l.u.bP=j(){c.bO(\'3h\');c.bN(\'3h\');c.bM(\'3h\');c.bL(\'3h\')};f.3l.u.bO=j(1G){c.2Q("<!--",1G,\'8M\');c.2H("-->",\'8M\')};f.3l.u.bN=j(1G){c.2Q("<2h",1G,\'8L\');c.2H("</2h>",\'8L\')};f.3l.u.bM=j(1G){c.2Q("<1m",1G,\'8K\');c.2H("</1m>",\'8K\')};f.3l.u.bL=j(1G){c.4E("<\\\\s*[a-5F-9:\\-]+\\\\s*>",1G,\'72\');c.2Q("<[a-5F-9:\\-]+"+\'[\\\\\\/ \\\\\\>]+\',1G,\'72\');c.bK(\'72\');c.4E("</\\\\s*[a-5F-9:\\-]+\\\\s*>",1G,\'bG\')};f.3l.u.bK=j(1G){c.4E(\'\\\\s+\',1G,\'52\');c.bJ(1G);c.2H(\'/>\',1G);c.2H(\'>\',1G)};f.3l.u.bJ=j(1G){c.4E("\\\\s*[a-z-8p-9]*:?[a-z-8p-9]+\\\\s*(?=\\=)\\\\s*",1G,\'bB\');c.2Q(\'=\\\\s*"\',1G,\'6X\');c.43("\\\\\\\\\\"",\'6X\');c.2H(\'"\',\'6X\');c.2Q("=\\\\s*\'",1G,\'6W\');c.43("\\\\\\\\\'",\'6W\');c.2H("\'",\'6W\');c.4E(\'=\\\\s*[^>\\\\s]*\',1G,\'bA\')};f.1t=j(bI,T){l T=T||\'3h\';c.6D=1f f.3l(c);c.Z=bI;c.42=T;c.nL=[];c.nK=\'\';c.nJ=\'\';o c};f.1t.u.3X=j(1w){c.6D.3X(c.6N(1w));o c.6M(c.Z.bb())};f.1t.u.6N=j(1w){if(1w.K(/I="b3"/)||1w.K(/ns = "nI:nH-nG-nF/)){c.Z.b4()}o c.Z.6N(1w)};f.1t.u.6M=j(3I){if(c.Z.8w){c.Z.b2()}o c.Z.6M(3I)};f.1t.u.52=j(K,2a){o R};f.1t.u.3h=j(X){c.Z.ba(X);o R};f.1t.u.8M=j(K,2n){o c.74(K,2n,\'6J\')};f.1t.u.8L=j(K,2n){o c.74(K,2n,\'6I\')};f.1t.u.8K=j(K,2n){o c.74(K,2n,\'6H\')};f.1t.u.74=j(K,2a,1e){3e(2a){1i f.71:c.5M=K;1n;1i f.3E:c.5M+=K;1n;1i f.5E:3e(1e){1i\'6J\':c.Z.6J(c.5M+K);1n;1i\'6I\':c.Z.6I(c.5M+K);1n;1i\'6H\':c.Z.6H(c.5M+K);1n}}o R};f.1t.u.72=j(K,2a){3e(2a){1i f.71:c.bH=c.6Z(K);c.5L={};1n;1i f.6Y:c.8J(c.6Z(K));1n;1i f.5E:c.8J(c.bH,c.5L)}o R};f.1t.u.bG=j(K,2a){c.8G(c.6Z(K));o R};f.1t.u.8J=j(C,G){l G=G||{};c.bE(C);if(c.Z.8v(C)){c.Z.4p.1X(C);c.Z.aY(C,G);c.Z.6k(C,G);c.8I(C)}V if(c.Z.b1(C)){c.Z.b9(C,G)}V{c.Z.b8(C,G);c.8I(C)}c.Z.6E=C;c.Z.8t=R;c.Z.nE=G};f.1t.u.8G=j(C){if(c.bF(C)){c.bD(C);if(c.Z.8v(C)){l 70=c.Z.4p.4Q();if(70==J){o}V if(70!=C){C=70}c.Z.b7(C)}V{c.Z.b6(C)}}V{c.Z.b5(C)}c.Z.6E=C;c.Z.8t=J};f.1t.u.8I=j(C){c.Z.2V[C]=c.Z.2V[C]||0;c.Z.2V[C]++};f.1t.u.bF=j(C){if(c.Z.2V[C]){c.Z.2V[C]--;if(c.Z.2V[C]==0){c.Z.2V[C]=2d}o R}o J};f.1t.u.bE=j(2v){c.8H(2v,J)};f.1t.u.bD=j(C){c.8H(C,R)};f.1t.u.8H=j(2v,2S){l 2S=2S||J;if(c.Z.2V){1h(l C in c.Z.2V){l bC=c.Z.2V[C];if(bC>0&&c.Z.bi(C,2v,2S)){c.8G(C,R)}}}};f.1t.u.6K=j(){o c.Z.6K()};f.1t.u.6Z=j(C){C=C.S(/^([\\s<\\/>]*)|([\\s<\\/>]*)$/gm,\'\').1o();l 3i=c.Z.6K();if(3i[C]){o 3i[C]}o C};f.1t.u.bB=j(K,2a){if(f.6Y==2a){c.6V=K}o R};f.1t.u.6X=j(K,2a){if(f.3E==2a){c.5L[c.6V]=K}o R};f.1t.u.6W=j(K,2a){if(f.3E==2a){c.5L[c.6V]=K}o R};f.1t.u.bA=j(K,2a){c.5L[c.6V]=K.S(/^=/,\'\');o R};f.1l=j(){c.1W=\'\';c.4P=1f f.2W();c.2V={};c.3s=f.bz;c.4p=[];c.5H=[];c.8A={\'&bd;\':\'&#be;\',\'&nD;\':\'&#nC;\',\'&nB;\':\'&#nA;\',\'&nz;\':\'&#ny;\',\'&nx;\':\'&#nw;\',\'&nv;\':\'&#nt;\',\'&nr;\':\'&#nq;\',\'&np;\':\'&#nn;\',\'&nm;\':\'&#nl;\',\'&nk;\':\'&#nj;\',\'&nh;\':\'&#ng;\',\'&nf;\':\'&#nd;\',\'&by;\':\'&#nc;\',\'&nb;\':\'&#na;\',\'&n9;\':\'&#n8;\',\'&n7;\':\'&#n6;\',\'&n5;\':\'&#n4;\',\'&n3;\':\'&#n2;\',\'&n1;\':\'&#n0;\',\'&mZ;\':\'&#mY;\',\'&mX;\':\'&#mW;\',\'&mV;\':\'&#mU;\',\'&mT;\':\'&#mS;\',\'&mR;\':\'&#mQ;\',\'&mP;\':\'&#mO;\',\'&mN;\':\'&#mM;\',\'&mL;\':\'&#mK;\',\'&mJ;\':\'&#mI;\',\'&mH;\':\'&#mG;\',\'&mF;\':\'&#mE;\',\'&mD;\':\'&#mC;\',\'&mB;\':\'&#mA;\',\'&mz;\':\'&#my;\',\'&mx;\':\'&#mw;\',\'&mv;\':\'&#mt;\',\'&ms;\':\'&#mr;\',\'&mq;\':\'&#mp;\',\'&mo;\':\'&#mn;\',\'&mm;\':\'&#ml;\',\'&mk;\':\'&#mj;\',\'&mh;\':\'&#mg;\',\'&mf;\':\'&#me;\',\'&md;\':\'&#mc;\',\'&mb;\':\'&#ma;\',\'&m9;\':\'&#m8;\',\'&m7;\':\'&#m6;\',\'&m5;\':\'&#m4;\',\'&m3;\':\'&#m2;\',\'&m1;\':\'&#m0;\',\'&lZ;\':\'&#lY;\',\'&lX;\':\'&#lW;\',\'&lV;\':\'&#lU;\',\'&lT;\':\'&#lS;\',\'&lR;\':\'&#lQ;\',\'&lP;\':\'&#lO;\',\'&lN;\':\'&#lM;\',\'&lL;\':\'&#lK;\',\'&lJ;\':\'&#lI;\',\'&lH;\':\'&#lG;\',\'&lF;\':\'&#lE;\',\'&lD;\':\'&#lC;\',\'&lB;\':\'&#lA;\',\'&lz;\':\'&#ly;\',\'&lx;\':\'&#lw;\',\'&lv;\':\'&#87;\',\'&lu;\':\'&#lt;\',\'&ls;\':\'&#lr;\',\'&lq;\':\'&#lp;\',\'&lo;\':\'&#ln;\',\'&lm;\':\'&#ll;\',\'&lk;\':\'&#lj;\',\'&lh;\':\'&#lg;\',\'&lf;\':\'&#ld;\',\'&lc;\':\'&#lb;\',\'&la;\':\'&#l9;\',\'&l8;\':\'&#l7;\',\'&l6;\':\'&#l5;\',\'&l4;\':\'&#l3;\',\'&l2;\':\'&#l1;\',\'&l0;\':\'&#kZ;\',\'&kY;\':\'&#kX;\',\'&kW;\':\'&#kV;\',\'&kU;\':\'&#kT;\',\'&kS;\':\'&#kR;\',\'&kQ;\':\'&#kP;\',\'&kO;\':\'&#kN;\',\'&kM;\':\'&#kL;\',\'&kK;\':\'&#kJ;\',\'&kI;\':\'&#kH;\',\'&kG;\':\'&#kF;\',\'&kE;\':\'&#kD;\',\'&kC;\':\'&#kB;\',\'&kA;\':\'&#kz;\',\'&ky;\':\'&#kx;\',\'&kw;\':\'&#kv;\',\'&ku;\':\'&#kt;\',\'&ks;\':\'&#kr;\',\'&kq;\':\'&#kp;\',\'&ko;\':\'&#kn;\',\'&km;\':\'&#kl;\',\'&kk;\':\'&#kj;\',\'&ki;\':\'&#kh;\',\'&8F;\':\'&#kg;\',\'&kf;\':\'&#ke;\',\'&kd;\':\'&#kc;\',\'&kb;\':\'&#ka;\',\'&k9;\':\'&#k8;\',\'&k7;\':\'&#k6;\',\'&k5;\':\'&#k4;\',\'&k3;\':\'&#k2;\',\'&k1;\':\'&#k0;\',\'&jZ;\':\'&#jY;\',\'&jX;\':\'&#jW;\',\'&jV;\':\'&#jU;\',\'&jT;\':\'&#jS;\',\'&jR;\':\'&#jQ;\',\'&jP;\':\'&#jO;\',\'&jN;\':\'&#jM;\',\'&jL;\':\'&#jK;\',\'&jJ;\':\'&#jI;\',\'&jH;\':\'&#jG;\',\'&jF;\':\'&#jE;\',\'&jD;\':\'&#jC;\',\'&jB;\':\'&#jA;\',\'&jz;\':\'&#jy;\',\'&jx;\':\'&#jw;\',\'&jv;\':\'&#ju;\',\'&jt;\':\'&#jr;\',\'&jq;\':\'&#jp;\',\'&jo;\':\'&#jn;\',\'&jm;\':\'&#jl;\',\'&jk;\':\'&#jj;\',\'&ji;\':\'&#jh;\',\'&jg;\':\'&#jf;\',\'&je;\':\'&#jd;\',\'&jc;\':\'&#jb;\',\'&ja;\':\'&#j9;\',\'&j8;\':\'&#j7;\',\'&j6;\':\'&#j5;\',\'&mu;\':\'&#j4;\',\'&nu;\':\'&#j3;\',\'&j2;\':\'&#j1;\',\'&j0;\':\'&#iZ;\',\'&pi;\':\'&#iY;\',\'&iX;\':\'&#iW;\',\'&iV;\':\'&#iU;\',\'&iT;\':\'&#iS;\',\'&iR;\':\'&#iQ;\',\'&iP;\':\'&#iO;\',\'&iN;\':\'&#iM;\',\'&iL;\':\'&#iK;\',\'&iJ;\':\'&#iI;\',\'&iH;\':\'&#iG;\',\'&iF;\':\'&#iE;\',\'&iD;\':\'&#iC;\',\'&iB;\':\'&#iA;\',\'&iz;\':\'&#iy;\',\'&ix;\':\'&#iw;\',\'&iv;\':\'&#iu;\',\'&it;\':\'&#ir;\',\'&iq;\':\'&#ip;\',\'&io;\':\'&#im;\',\'&il;\':\'&#ik;\',\'&ij;\':\'&#ii;\',\'&ih;\':\'&#ie;\',\'&ic;\':\'&#ib;\',\'&ia;\':\'&#i9;\',\'&i8;\':\'&#i7;\',\'&i6;\':\'&#i5;\',\'&i4;\':\'&#i3;\',\'&i2;\':\'&#i1;\',\'&i0;\':\'&#hZ;\',\'&hY;\':\'&#hX;\',\'&hW;\':\'&#hV;\',\'&hU;\':\'&#hT;\',\'&hS;\':\'&#hR;\',\'&hQ;\':\'&#hP;\',\'&hO;\':\'&#hN;\',\'&hM;\':\'&#hL;\',\'&hK;\':\'&#hJ;\',\'&hI;\':\'&#hH;\',\'&hG;\':\'&#hF;\',\'&hE;\':\'&#hD;\',\'&bx;\':\'&#hC;\',\'&hB;\':\'&#hA;\',\'&hz;\':\'&#hy;\',\'&hx;\':\'&#hw;\',\'&hv;\':\'&#hu;\',\'&ht;\':\'&#hs;\',\'&hq;\':\'&#hp;\',\'&ho;\':\'&#hn;\',\'&hm;\':\'&#hl;\',\'&hk;\':\'&#hj;\',\'&hi;\':\'&#hh;\',\'&hg;\':\'&#hf;\',\'&he;\':\'&#hd;\',\'&hc;\':\'&#hb;\',\'&ha;\':\'&#h9;\',\'&h8;\':\'&#h7;\',\'&h0;\':\'&#gZ;\',\'&gY;\':\'&#gX;\',\'&gW;\':\'&#gV;\',\'&gU;\':\'&#gT;\',\'&gS;\':\'&#gR;\',\'&gQ;\':\'&#gP;\',\'&gO;\':\'&#gN;\',\'&ni;\':\'&#gM;\',\'&gL;\':\'&#gK;\',\'&gJ;\':\'&#gI;\',\'&gH;\':\'&#gG;\',\'&gF;\':\'&#gE;\',\'&gD;\':\'&#gC;\',\'&6U;\':\'&#gB;\',\'&gA;\':\'&#gz;\',\'&gy;\':\'&#gx;\',\'&gw;\':\'&#gv;\',\'&or;\':\'&#gu;\',\'&gt;\':\'&#gs;\',\'&gr;\':\'&#gq;\',\'&gp;\':\'&#go;\',\'&gn;\':\'&#gl;\',\'&gk;\':\'&#gj;\',\'&gh;\':\'&#gg;\',\'&gf;\':\'&#gd;\',\'&ne;\':\'&#gc;\',\'&bw;\':\'&#gb;\',\'&le;\':\'&#ga;\',\'&ge;\':\'&#g9;\',\'&3b;\':\'&#g8;\',\'&3P;\':\'&#g7;\',\'&g6;\':\'&#g5;\',\'&g4;\':\'&#g3;\',\'&g2;\':\'&#g1;\',\'&g0;\':\'&#fZ;\',\'&fY;\':\'&#fX;\',\'&fW;\':\'&#fV;\',\'&fU;\':\'&#fT;\',\'&fS;\':\'&#fR;\',\'&fQ;\':\'&#fP;\',\'&fO;\':\'&#fN;\',\'&fM;\':\'&#fL;\',\'&3H;\':\'&#fK;\',\'&fJ;\':\'&#fI;\',\'&fH;\':\'&#fG;\',\'&fF;\':\'&#fE;\',\'&fD;\':\'&#fC;\',\'&fB;\':\'&#fA;\',\'&fz;\':\'&#fy;\'};c.8u=["a","6T","8y","6L","bv","b","55","6S","bu","2J","1j","2t","bt","54","bs","6R","5K","dd","8x","N","bq","dl","dt","em","2U","1M","2T","h1","h2","h3","h4","h5","h6","O","i","bp","bo","1p","3k","li","bn","8E","4C","ol","bm","6O","p","1R","41","q","bl","2h","4X","bk","3r","3c","1m","3b","3P","3j","8D","4F","4G","8C","5I","8B","M","6P","bj","2I","l","fx"];c.b0=["br","hr","6Q","1y"];o c};f.1l.u.bi=j(C,5J,2S){l 2S=2S||J;if(C==\'4F\'){if((2S&&5J==\'6P\')||(!2S&&5J==\'4F\')){o R}}if(C==\'6O\'){if((2S&&5J==\'4X\')||(!2S&&5J==\'6O\')){o R}}o J};f.1l.u.6N=j(1w){c.1W=\'\';o 1w};f.1l.u.6M=j(1s){1s=c.bh(1s);1s=c.bg(1s);1s=c.bf(1s);1s=c.bc(1s);o 1s};f.1l.u.bh=j(1s){1h(l 8z in c.8A){1s=1s.S(1f 2O(8z,\'g\'),c.8A[8z])}o 1s};f.1l.u.bg=j(1s){l 3i=\'em|3c|3b|3P|8y|41|8x|6L\';o 1s.S(1f 2O(\'<\\/(\'+3i+\')><\\\\1>\',\'\'),\'\').S(1f 2O(\'(\\s*<(\'+3i+\')>\\s*){2}(.*)(\\s*<\\/\\\\2>\\s*){2}\',\'\'),\'<\\$2>\\$3<\\$2>\')};f.1l.u.bf=j(1s){o 1s.S(1f 2O(\'<(\'+c.8u.6u("|").S(/\\|4F/,\'\').S(/\\|5I/,\'\')+\')>(<br \\/>|&#be;|&bd;|\\\\s)*<\\/\\\\1>\',\'g\'),\'\')};f.1l.u.bc=j(1s){l 2g=1s.K(1f 2O(\'<41[^>]*>(.*?)<\\/41>\',\'fw\'));if(2g){1h(l i=0;i<2g.Y;i++){1s=1s.S(2g[i],2g[i].S(1f 2O(\'<br \\/>\',\'g\'),fv.fu(13,10)))}}o 1s};f.1l.u.bb=j(){o c.1W};f.1l.u.6K=j(){o{\'b\':\'3c\',\'i\':\'em\'}};f.1l.u.ba=j(X){c.1W+=X};f.1l.u.6J=j(X){if(c.ft){c.1W+=X}};f.1l.u.6I=j(X){if(!c.fs){c.1W+=X}};f.1l.u.6H=j(X){if(!c.fr){c.1W+=X}};f.1l.u.6k=j(C,G){c.1W+=c.4P.C(C,c.3s.5p(C,G),R)};f.1l.u.b9=j(C,G){c.1W+=c.4P.C(C,c.3s.5p(C,G))};f.1l.u.b8=j(C,G){};f.1l.u.b7=j(C){c.1W=c.1W.S(/<br \\/>$/,\'\')+c.8r(\'aZ\',C)+"</"+C+">"+c.8r(\'5G\',C)};f.1l.u.b6=j(C){};f.1l.u.b5=j(C){c.1W+="</"+C+">"};f.1l.u.b4=j(){c.5H=[\'N\',\'3r\'];c.3s.6G=[\'1m\'];c.3s.6F=[\'b3\',\'fq\'];c.8w=R};f.1l.u.b2=j(){c.5H=[];c.3s.6G=[];c.3s.6F=[];c.8w=J};f.1l.u.8v=j(C){o!f.1L.2F(c.5H,C)&&f.1L.2F(c.8u,C)};f.1l.u.b1=j(C){o!f.1L.2F(c.5H,C)&&f.1L.2F(c.b0,C)};f.1l.u.aX=j(C,2b){c.8s(\'5G\',C,2b)};f.1l.u.fp=j(C,2b){c.8s(\'aZ\',C,2b)};f.1l.u.aY=j(C,G){if(C!=\'li\'&&(C==\'2I\'||C==\'ol\')&&c.6E&&!c.8t&&c.6E==\'li\'){c.1W=c.1W.S(/<\\/li>$/,\'\');c.aX(C,\'</li>\')}};f.1l.u.8s=j(2R,C,2b){if(!c[\'3G\'+2R+\'3F\']){c[\'3G\'+2R+\'3F\']=[]}if(!c[\'3G\'+2R+\'3F\'][C]){c[\'3G\'+2R+\'3F\'][C]=[]}c[\'3G\'+2R+\'3F\'][C].1X(2b)};f.1l.u.8r=j(2R,C){if(c[\'3G\'+2R+\'3F\']&&c[\'3G\'+2R+\'3F\'][C]&&c[\'3G\'+2R+\'3F\'][C].Y>0){o c[\'3G\'+2R+\'3F\'][C].4Q()}o\'\'};f.aW=j(3Z,2s){l 2s=(1q 2s==\'2d\'?R:2s);D.53(c,1f f.2f(3Z,(2s?\'52\':\'4D\')));c.8q(\'4D\',\'52\');if(2s==R){c.2Q("/\\\\\\3Y[<\\\\s]*f[>\\\\s]*\\\\\\3Y/",\'52\',\'4D\');c.2H("/\\\\\\3Y[<\\/\\\\s]*f[>\\\\s]*\\\\\\3Y/",\'4D\')}c.4E("[\\\\fo-fm-6]*\\\\\\fl[a-z-8p-9]+",\'4D\',\'aV\');c.2Q("/\\\\\\3Y",\'4D\',\'8o\');c.2H("\\\\\\3Y/",\'8o\');c.2Q("\\fk",\'4D\',\'6C\');c.2H("\\fj",\'6C\');c.2Q("/\\\\\\3Y",\'6C\',\'8n\');c.2H("\\\\\\3Y/",\'8n\');o c};f.3D=j(){c.6B=J;c.5D=J;c.2s=R;c.4B={\'3W\':[],\'3g\':[],\'4A\':[]};o c};f.3D.u.3X=j(1w,2s){l 2s=(1q 2s==\'2d\'?c.2s:2s);c.6D=1f f.aW(c,2s);c.6D.3X(1w)};f.3D.u.52=j(K,2a){o R};f.3D.u.8o=j(X,2n){if(X.K(/fi[a-5F-9\\s]*E[a-5F-9\\s]*/mi)){o J}if(2n==f.3E){if(!c.6B){c.5D=R;c.2m={\'M\':f.1L.4w(X)}}V{if(c.2m[c.2e]){if(!c.2m[c.2e].6z){c.2m[c.2e].6z=[X]}V{c.2m[c.2e].6z.1X(X)}}}c.6B=R}o R};f.3D.u.6C=j(K,2n){if(2n==f.3E){K=f.1L.4w(K);if(K!=\'\'){c.2m[c.2e].1m=K}}V if(2n==f.5E){c.6B=J;c.5D=J;c.aU(c.2m)}o R};f.3D.u.8n=j(K,2n){if(2n==f.3E){c.2m[c.2e].8k=K.S(/^([\\s\\/\\*]*)|([\\s\\/\\*]*)$/gm,\'\')}o R};f.3D.u.aV=j(K){K=K.S(/^([\\s\\.]*)|([\\s\\.*]*)$/gm,\'\');l C=\'\';if(K.8h(\'.\')>0){l 8l=K.8m(\'.\');c.2e=8l[1];l C=8l[0]}V{c.2e=K}if(!c.5D){c.2m={\'M\':(!C?\'\':C.fh()+\': \')+c.2e};c.5D=R}if(!c.2m[c.2e]){c.2m[c.2e]={\'F\':c.2e}}if(C){if(!c.2m[c.2e].3i){c.2m[c.2e].3i=[C]}V{c.2m[c.2e].3i.1X(C)}}o R};f.3D.u.aU=j(6A){1h(l F in 6A){l 2P=6A[F];if(1q 2P==\'4C\'&&F!=\'M\'){c.4B.3W.1X({\'F\':f.1L.4w(2P.F),\'M\':6A.M,\'aT\':f.1L.4w((2P.6z||2P.3i).6u(\', \'))});if(2P.8k){c.4B.3g.1X({\'F\':\'.\'+f.1L.4w(2P.F),\'1b\':2P.8k})}if(2P.1m){c.4B.4A.1X({\'F\':\'.\'+f.1L.4w(2P.F),\'1b\':2P.1m})}}}};D.fn.aS=j(){if(c[0].8j==3)o!(/[^\\t\\n\\r ]/.2M(c[0].4z));o J};f.aS=j(n){if(n.8j==3)o!(/[^\\t\\n\\r ]/.2M(n.4z));o J};f.fg=j(3C){o!(/[^\\t\\n\\r ]/.2M(3C))};D.fn.4V=j(4y){l n=c;if(n[0].8j==3)n=n.5z().aR(0,1);if(n.51(4y).2G()==1)o n;V o n.5z(4y).aR(0,1)};f.1L={1k:j(3C,aQ,aO){l 4x=1f 2O(aQ,"g");o(3C.S(4x,aO))},ff:j(3C,aM,8i){o(3C.aN(0,8i)+aM+3C.6y(8i))},4w:j(3C){o 3C.S(/^(\\s*)|(\\s*)$/gm,\'\')},2F:j(3B,5C){1h(l i=0;i<3B.Y;i++){if(3B[i]===5C)o R}o J},8h:j(3B,4v){l 8g=-1;1h(l i=0;i<3B.Y;i++){if(3B[i]==4v){8g=i;1n}}o(8g)},aL:j(3B,F){1h(l i=0;i<3B.Y;i++){l 4v=3B[i];if(4v.F==F)o(4v)}o(1a)}};f.2D=j(E){c.1V=E;c.5x="fe";c.4s="\\r\\n"};f.2D.u.5w=j(1K){c.1E=1K;c.H=1K.1B.3A;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);D(c.H.1j).O(c.1V.4R);l E=c;c.H.1j.aK=j(){E.H.4r="on";E.H=1K.1B.3A};c.H.fd=j(){E.6x()};c.H.aJ=j(){E.6x();E.2x()};c.H.aI=j(){E.6x()};c.H.1j.fc=j(){E.1E.1B.aH.aG=J};c.H.1j.fb=j(){E.1E.1B.aH.aG=J;E.5B(2l.fa.f9("3h"))};if(c.aF){if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();if(D.2A(c.B.3w))c.B.3w(c);c.5u()}c.aF=R;c.H.4r="on";4u{c.H=1K.1B.3A}4t(e){}};f.2D.u.1C=j(1F,1R){3e(1F){1i f.6t:1i f.6s:l L=c.2N(c.L(),f.6r);if(L){l 3v=L.1z.1z;if(L.1z.6q.Y>1||3v.1r.1o()==f.6p||3v.1r.1o()==f.6o)c.H.2q(1F)}1n;3R:if(1R)c.H.2q(1F,J,1R);V c.H.2q(1F);1n}};f.2D.u.1d=j(){l 4Z=c.1E.1B.3A.4Z;if(4Z!=1a){if(4Z.5A!=2d)o(4Z.5A())}};f.2D.u.6x=j(){c.H.4Z=c.H.3V.4Y()};f.2D.u.5r=j(1D,1Y){1D.f8(1Y.F,1Y.1b)};f.2D.u.8e=j(O){l 1S=c.H.3V.4Y();if(D(1S.5A()).5z(c.B.6w).is(\'*\')){4u{1S.8f(O)}4t(e){}}V{c.5B(O)}};f.2D.u.aE=j(2k,2E){l 1S=c.H.3V.4Y();if(D(1S.5A()).5z(c.B.6w).is(\'*\')){4u{1S.8f(2k+1S.X+2E)}4t(e){}}};f.2D.u.aD=j(){l 1S=c.H.3V.4Y();if(D(1S.5A()).5z(c.B.6w).is(\'*\')){4u{l X=1S.X;c.1C(\'f7\');1S.8f(X)}4t(e){}}};f.2D.u.2x=j(){c.2j=1a};f.2D.u.5y=j(1c,3U){l 1S=c.H.3V.4Y();3U=3U?R:J;1S.f6(1c);1S.aC(3U);1S.4X();1c.4W()};f.2C=j(E){c.1V=E;c.5x="I";c.4s="\\n"};f.2C.u.5w=j(1K){l E=c;c.1E=1K;c.H=1K.at;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);c.O(c.1V.4R);c.6v();if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();D(c.H).3x("3u",c.3u);D(c.H).3x("2x",c.2x);D(c.H).3x("4W",j(){E.6v.f5(E)});if(D.2A(c.B.3w))c.B.3w(c);c.5u()};f.2C.u.O=j(O){if(1q O===\'3Q\'){4u{c.H.4r="aB"}4t(e){};O=O.S(/<em(\\b[^>]*)>/gi,"<i$1>").S(/<\\/em>/gi,"</i>").S(/<3c(\\b[^>]*)>/gi,"<b$1>").S(/<\\/3c>/gi,"</b>");D(c.H.1j).O(O);c.6v()}V o(D(c.H.1j).O())};f.2C.u.1C=j(1F,1R){if(!c.1d())o(J);3e(1F){1i f.6t:1i f.6s:l 1x=c.1d();l 2y=c.1E.1B.2z();l 1Z=2y.1Z;if(1Z.5s=="#X")1Z=1Z.1z;1x=c.2N(1x,f.5t);1Z=c.2N(1Z,f.5t);if(1x&&1x==1Z&&1x.1r.1o()==f.6r){l 3v=1x.1z.1z;if(1x.1z.6q.Y>1||3v.1r.1o()==f.6p||3v.1r.1o()==f.6o)c.H.2q(1F,\'\',1a)}1n;3R:if(1R)c.H.2q(1F,\'\',1R);V c.H.2q(1F,\'\',1a)}l L=c.1d();if(L.1r.1o()==f.3t)c.1C(f.4q,f.P)};f.2C.u.1d=j(){l 2y=c.1E.1B.2z();l 1c=2y.1x;if(1c){if(1c.5s=="#X")o(1c.1z);V o(1c)}V o(1a)};f.2C.u.5r=j(1D,1Y){1D.8c(1Y.F+" {"+1Y.1b+"}",1D.8b.Y)};f.2C.u.3u=j(W){l E=f.2w[c.M];l L=1a;if(W.6l){if(W.1A==66){E.1C(f.8a);o J}if(W.1A==73){E.1C(f.89);o J}}V if(W.1A==13){if(!W.6m){L=E.1d();if(L&&L.1r.1o()==f.5q){W.f4();E.8e(\'<p></p>\')}}}};f.2C.u.2x=j(W){l E=f.2w[c.M];E.2j=1a;l L=1a;if(W.1A==13&&!W.6m){D(E.H.1j).aq(f.88).ap()}if(W.1A!=8&&W.1A!=17&&W.1A!=46&&W.1A!=87&&!W.ao&&!W.6l){L=E.1d();l F=L.1r.1o();if(F=="3c"||F=="b"||F=="em"||F=="i"||F=="3b"||F=="3P"||F=="a")F=L.1z.1r.1o();if(F==f.3t)E.1C(f.4q,f.P)}};f.2C.u.6v=j(){if(c.H.4r=="aB"){4u{c.H.4r="on";c.H.2q("f3",\'\',J)}4t(e){}}};f.2C.u.6k=j(C,G){l G=c.3s.5p(C,G);if(C==\'3r\'&&G.1m){l 2v=c.6j(G.1m);if(2v){c.4p.4Q();l C=2v;c.4p.1X(2v);G.1m=\'\'}V{o}}c.1W+=c.4P.C(C,G,R)};f.2C.u.6j=j(1m){if(/am/.2M(1m))o\'3c\';if(/al/.2M(1m))o\'em\';if(/3b/.2M(1m))o\'3b\';if(/ak/.2M(1m))o\'3P\';o J};f.3S=j(E){c.1V=E;c.5x="I";c.4s="\\r\\n"};f.3S.u.5w=j(1K){c.1E=1K;c.H=1K.1B.3A;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);c.H.4r="on";c.O(c.1V.4R);if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();D(c.H).3x("3u",c.3u);D(c.H).3x("2x",c.2x);if(D.2A(c.B.3w))c.B.3w(c);c.5u()};f.3S.u.1C=j(1F,1R){if(1R)c.H.2q(1F,J,1R);V c.H.2q(1F)};f.3S.u.1d=j(){l 2y=c.1E.1B.2z();l 1c=2y.1x;if(1c){if(1c.5s=="#X")o(1c.1z);V o(1c)}V o(1a)};f.3S.u.5r=j(1D,1Y){1D.8c(1Y.F+" {"+1Y.1b+"}",1D.8b.Y)};f.3S.u.3u=j(W){l E=f.2w[c.M];l 2y=E.1E.1B.2z();8d=2y.f2(0).f1;if(!D(8d).4V(f.6n.6u(","))[0]&&!D(8d).4V(\'li\')&&W.1A!=f.3T.aA&&W.1A!=f.3T.az&&W.1A!=f.3T.ay&&W.1A!=f.3T.ax&&W.1A!=f.3T.aw&&W.1A!=f.3T.av&&W.1A!=f.3T.au)E.1C(f.4q,f.P)};f.3S.u.2x=j(W){l E=f.2w[c.M];E.2j=1a};f.3d=j(E){c.1V=E;c.5x="I";c.4s="\\n"};f.3d.u.5w=j(1K){c.1E=1K;c.H=1K.at;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);c.H.4r="on";c.O(c.1V.4R);if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();D(c.H).3x("3u",c.3u);D(c.H).3x("2x",c.2x);if(D.2A(c.B.3w))c.B.3w(c);c.5u()};f.3d.u.1C=j(1F,1R){if(!c.1d())o(J);3e(1F){1i f.6t:1i f.6s:l 1x=c.1d();l 2y=c.1E.1B.2z();l 1Z=2y.1Z;if(1Z.5s=="#X")1Z=1Z.1z;1x=c.2N(1x,f.5t);1Z=c.2N(1Z,f.5t);if(1x&&1x==1Z&&1x.1r.1o()==f.6r){l 3v=1x.1z.1z;if(1x.1z.6q.Y>1||3v.1r.1o()==f.6p||3v.1r.1o()==f.6o)c.H.2q(1F,\'\',1a)}1n;1i f.as:1i f.ar:c.H.2q(1F,\'\',1a);l 1x=c.1d();l L=c.2N(1x,f.6n);if(L)D(L).f0(D(L).O());1n;3R:if(1R)c.H.2q(1F,\'\',1R);V c.H.2q(1F,\'\',1a)}l L=c.1d();if(L&&L.1r.1o()==f.3t)c.1C(f.4q,f.P)};f.3d.u.1d=j(){l 2y=c.1E.1B.2z();l 1c=2y.1x;if(1c){if(1c.5s=="#X")o(1c.1z);V o(1c)}V o(1a)};f.3d.u.5r=j(1D,1Y){1D.8c(1Y.F+" {"+1Y.1b+"}",1D.8b.Y)};f.3d.u.3u=j(W){l E=f.2w[c.M];if(W.6l){if(W.1A==66){E.1C(f.8a);o J}if(W.1A==73){E.1C(f.89);o J}}};f.3d.u.2x=j(W){l E=f.2w[c.M];E.2j=1a;l L=1a;if(W.1A==13&&!W.6m){D(E.H.1j).aq(f.88).ap();L=E.1d();if(L&&L.1r.1o()==f.5q)E.1C(f.4q,f.P);}if(W.1A==13&&W.6m){E.1C(\'eZ\')}if(W.1A!=8&&W.1A!=17&&W.1A!=46&&W.1A!=87&&!W.ao&&!W.6l){L=E.1d();l F=L.1r.1o();if(F=="3c"||F=="b"||F=="em"||F=="i"||F=="3b"||F=="3P"||F=="a"||F=="3r")F=L.1z.1r.1o();if(F==f.3t||F==f.an)E.1C(f.4q,f.P);}};f.3d.u.6k=j(C,G){l G=c.3s.5p(C,G);if(C==\'3r\'&&G.1m){l 2v=c.6j(G.1m);if(2v){c.4p.4Q();l C=2v;c.4p.1X(2v);G.1m=\'\';if(1q G[\'I\']==\'3Q\')G[\'I\']=G[\'I\'].S(/eY-1m-3r/gi,\'\')}V{o}}c.1W+=c.4P.C(C,G,R)};f.3d.u.6j=j(1m){if(/am/.2M(1m))o\'3c\';if(/al/.2M(1m))o\'em\';if(/3b/.2M(1m))o\'3b\';if(/ak/.2M(1m))o\'3P\';o J};',62,1714,'||||||||||||this|||WYMeditor||||function||var|||return||||||prototype|||||||_options|tag|jQuery|wym|name|attributes|_doc|class|false|match|container|title|div|html||value|true|replace|mode||else|evt|text|length|_Listener|||||||||||null|css|node|selected|type|new|editor|for|case|body|replaceAll|XhtmlSaxListener|style|break|toLowerCase|label|typeof|tagName|xhtml|XhtmlParser|boxHtml|attr|raw|focusNode|input|parentNode|keyCode|contentWindow|_exec|styles|_iframe|cmd|scope|val|dialogHtml|_tags|iframe|Helper|form|result|row|href|options|param|range|key|src|_wym|output|push|oCss|anchorNode|||||||||||state|content|required|undefined|_current_element|Lexer|matches|script|attribute|_selected_image|left|window|_current_item|status|_regexes|_box|execCommand|aCss|only_wym_blocks|button|link|new_tag|INSTANCES|keyup|sel|getSelection|isFunction|eval|WymClassMozilla|WymClassExplorer|right|contains|size|addExitPattern|ul|blockquote|_mode_handlers|start|test|findUp|RegExp|details|addEntryPattern|position|closing|head|fieldset|_open_tags|XmlHelper|ParallelRegex|char|disabled|||||||||||skin|sub|strong|WymClassSafari|switch|_index|editorStyles|Text|tags|table|legend|XhtmlLexer|matched|pattern|top|stylesheet|sType|span|validator|BODY|keydown|ancestor|postInit|bind|preBind|dir|document|arr|str|WymCssParser|LEXER_UNMATCHED|_closing|_insert_|lang|parsed|defaults|inside|xml|sTmp|INDEX|newNode|sup|string|default|WymClassOpera|KEY|toStart|selection|classesItems|parse|x2a|parser||pre|_mode|addPattern|_patterns|baseline||bottom|middle|valign|charoff|justify|center|align|click|doc|find|sBodyHtml|tagname|sClass|oClass|sContainer|sTool|iframeHtml|WymClass|_tag_stack|FORMAT_BLOCK|designMode|_newLine|catch|try|item|trim|rExp|jqexpr|data|dialogStyles|css_settings|object|WymCss|addSpecialPattern|td|textarea|_invokeParser|_case|width|onload|basePath|dialog|sVal|console|helper|pop|_html|direction|addCssRules|styleSheets|parentsOrSelf|focus|select|createRange|caretPos||filter|Ignore|extend|cite|base|init|_stack|count|except|index|alt|tag_attributes|delimiter|close|sUrl|INIT_DIALOG|SKINS|skinPath|CssParser|wymeditor|TH|oContainer|oTool|wym_section|getValidTagAttributes|PRE|addCssRule|nodeName|BLOCKS|listen|bindEvents|initIframe|_class|setFocusToNode|parents|parentElement|paste|elem|_has_title|LEXER_EXIT|z0|after|avoided_tags|th|now_on_tag|colgroup|_tag_attributes|_non_tag|action|special|new_mode|accept|StateStack|_regex|_possible_tag_attributes|next|hidden|get|open|createElement|submitSelector|titleSelector|TITLE|sStamp|dialogImageSelector|DIALOG_LINK|dialogType||update|stringDelimiterRight|stringDelimiterLeft|toggleClass|BLOCKQUOTE|Array|TD|aClasses|wym_dialog|wym_cancel|wym_submit|wym_dialog_type|getTagForStyle|openBlockTag|ctrlKey|shiftKey|MAIN_CONTAINERS|UL|OL|childNodes|LI|OUTDENT|INDENT|join|enableDesignMode|iframeBodySelector|saveCaret|substring|expressions|style_details|_in_style|WymCssStyle|_Lexer|last_tag|skiped_attribute_values|skiped_attributes|addCss|addScript|addComment|getTagReplacements|address|afterParsing|beforeParsing|option|tr|img|col|bdo|abbr|prop|_current_attribute|SingleQuotedAttribute|DoubleQuotedAttribute|LEXER_SPECIAL|normalizeTag|expected_tag|LEXER_ENTER|OpeningTag||_addNonTagBlock|handler|unmatched|while|case_sensitive|regex|tag_defaults|only|valid_attributes|rows|cols|screen|charset|height|meta|icon|shortcut|subsection|section|prev|help|glossary|copyright|contents|chapter|bookmark|appendix|alternate|rel|escape_quotes|_entitiesDiv|mousedown|altSelector|ALT|SRC|srcSelector|SKINS_DEFAULT_CSS|loadSkin|grep|packed|min|pack|jquery|INSERT_HTML|jQueryPath|wymPath|PREVIEW|DIALOG_PASTE|DIALOG_TABLE|DIALOG_IMAGE|dialogFeatures|_element|STRINGS|bFound|firstNode|nodes|aTypes|NAME|CLASS_NAME|TOOL_TITLE|HTML|iframeBasePath|browser|Cancel|Submit|224|BR|ITALIC|BOLD|cssRules|insertRule|startNode|insert|pasteHTML|ret|indexOf|pos|nodeType|feedback_style|parts|split|WymCssFeedbackStyle|WymCssComment|_0|mapHandler|_getClosingTagContent|_insertContentWhenClosingTag|last_tag_opened|block_tags|isBlockTag|_avoiding_tags_implicitly|del|acronym|entity|entities|thead|tfoot|tbody|noscript|circ|_callCloseTagListener|_autoCloseUnclosed|_increaseOpenTagCounter|_callOpenTagListener|Css|Script|Comment|unparsed_character_count|getCurrent|_parser|enter|leave|_labels|default_attributes|default_attributes_and_events|_attributes|_events|readonly|all|media|javascript|http|ltr|toString|innerHTML|_formated_options|tagOptions|postInitDialog|newRow|iCols|iRows|INSERT_IMAGE|HREF|CREATE_LINK|hrefSelector|preInitDialog|responseText|async|url|ajax|found|htmlSelector|wDialog|replaceStrings|DIALOG_BODY|DIALOG_TITLE|JQUERY_PATH|WYM_PATH|CSS_PATH|DIRECTION|hasfocus|htmlValSelector|error|langPath|switchTo|lgt|H6|H5|H4|H3|H2|H1|sName|sContainers|CONTAINERS_ITEMS|CONTAINER_CLASS|CONTAINER_TITLE|CONTAINER_NAME|aContainers|sClasses|CLASSES_ITEMS|CLASS_TITLE|sTools|TOOLS_ITEMS|TOOL_CLASS|TOOL_NAME|aTools|STATUS|IFRAME|CLASSES|CONTAINERS|TOOLS|LOGO|IFRAME_BASE_PATH|WYM_INDEX|SaxListener|preInit|Paste_From_Word|indent|Table|wym_title|Image|Link|wym_classes|wym_containers|wym_tools|wym_iframe|Preview|Unlink|Outdent|Indent|names|super|italic|bold|DIV|metaKey|remove|children|INSERT_UNORDEREDLIST|INSERT_ORDEREDLIST|contentDocument|DELETE|BACKSPACE|DOWN|RIGHT|UP|LEFT|ENTER|off|collapse|unwrap|wrap|_initialized|returnValue|event|onclick|onkeyup|onfocus|findByName|inserted|substr|rep||old|slice|isPhantomNode|expr|addStyleSetting|WymCssStyleDeclaration|WymCssLexer|insertContentAfterClosingTag|fixNestingBeforeOpeningBlockTag|before|inline_tags|isInlineTag|allowStylingTagsAndAttributes|MsoNormal|avoidStylingTagsAndAttributes|closeUnopenedTag|closeUnknownTag|closeBlockTag|openUnknownTag|inlineTag|addContent|getResult|removeBrInPre|nbsp|160|removeEmptyTags|joinRepeatedEntities|replaceNamedEntities|shouldCloseTagAutomatically|tt|small|samp|optgroup|map|kbd|ins|dfn||code|caption|big|area|equiv|image|not|XhtmlValidator|UnquotedAttribute|TagAttributes|counter|autoCloseUnclosedBeforeTagClosing|autoCloseUnclosedBeforeNewOpening|_decreaseOpenTagCounter|ClosingTag|_tag|Listener|addAttributeTokens|addInTagDeclarationTokens|addTagTokens|addCssTokens|addScriptTokens|addCommentTokens|addTokens|unparsed|_reduce|is_match|current|_decodeSpecial|_|_isSpecialMode|__exit|_isModeEnd|LEXER_MATCHED|_dispatchTokens|_getPerlMatchingFlags|Tk7|Tk6|Tk5|Tk4|Tk3|Tk2|Tk1|_untokenizeRegex|_tokenizeRegex|_getCompoundedRegex|subject|getDefaultAttributesAndEventsForTag|getUniqueAttributesAndEventsForTag|getPossibleTagAttributes|validateAttribute|doesAttributeNeedsValidation|getDefaultAttributesAndEventsForTags|isValidTag|parseInt|possible_attributes|rowgroup|rowspan|headers|colspan|axis|summary|border|box|frame|braille|print|projection|multiple|defer|valuetype|usemap|home|rev|hreflang|datetime|submit|reset|file|checked|profile|rtl|polygon|poly|circle|rectangle|rect|shape|coords|designates|keyboard|tabindex|accesskey|language|escapeEntities|escapeOnce|escaped|_fixDoubleEscape|cancelSelector|previewSelector|dialogPreviewSelector|sText|textSelector|dialogPasteSelector|append|summarySelector|sCaption|newCaption|captionSelector||TABLE|colsSelector|rowsSelector|dialogTableSelector|dialogLinkSelector|uniqueStamp|dialogTypeSelector||SKINS_DEFAULT_JS|initSkin|addClass|loadCss|each|appendChild|target||IMG|configureEditorUsingRawCss|skins|computeJqueryPath|computeWymPath|computeBasePath|sData|now|toggleHtml|encloseString|BASE_PATH|bodyHtml|dialogPreviewHtml|dialogPasteHtml|dialogTableHtml|dialogImageHtml|dialogLinkHtml|features|sMessage|statusSelector|STRING|CLASS|insertBefore|dialogFeaturesPreview|TOGGLE_HTML|PASTE|INSERT_TABLE|exec|updateEvent|updateSelector|classSelector|containerSelector|toolSelector|hide|containersItemHtml|containersItems|classesItemHtml|toolsItemHtml|toolsItems|statusHtml|htmlHtml|classesHtml|containersHtml|toolsHtml|logoHtml|wym_dialog_preview|wym_text|wym_dialog_paste|wym_cols|wym_rows|wym_summary|wym_caption|wym_dialog_table|Title|||wym_alt|wym_src|URL|wym_dialog_image|wym_href|wym_dialog_link|xhtml1|DTD|org|www|300|560|resizable|toolbar|titlebar|menubar|wym_html_val|wym_status|wym_html|wym_box|ToggleHtml|Paste|InsertTable|InsertImage|CreateLink|Redo|Undo|InsertUnorderedList|InsertOrderedList|Subscript|Superscript|Italic|Bold|IFRAME_DEFAULT|LANG_DEFAULT_PATH|SKINS_DEFAULT_PATH|apple|InsertLineBreak|replaceWith|startContainer|getRangeAt|styleWithCSS|preventDefault|call|moveToElementText|Cut|addRule|getData|clipboardData|onpaste|onbeforepaste|onbeforedeactivate|className|insertAt|isPhantomString|toUpperCase|end|x7d|x7b|x2e|z1||sa|insertContentBeforeClosingTag|main1|remove_embeded_styles|remove_scripts|remove_comments|fromCharCode|String|gmi|extends|9830|diams|9829|hearts|9827|clubs|9824|spades|9674|loz|9002|rang|9001|8971|rfloor|8970|lfloor|8969|rceil|8968|lceil|8901|sdot|8869|perp|8855|otimes|8853|oplus|8839|supe|8838|sube|8836|nsub|8835|8834|8805|8804|8801|8800|8776||asymp|8773|cong||8764|sim|8756||there4|8747|int|8746|cup|8745|cap|8744|8743|and|8736|ang|8734|infin|8733|8730|radic|8727|lowast|8722|minus|8721|sum|8719|prod|8715|8713|notin|8712|isin|8711|nabla|8709|empty|8707|exist|8706|part|8704|forall|||||||8660|hArr|8659|dArr|8658|rArr|8657|uArr|8656|lArr|8629|crarr|8596|harr|8595|darr|8594|rarr|8593|uarr||8592|larr|8501|alefsym|8482|trade|8476|real|8472|weierp|8465|8364|euro|8260|frasl|8254|oline|8250|rsaquo|8249|lsaquo|8243|Prime|8242|prime|8240|permil|8230|hellip|8226|bull|8225|Dagger|8224|dagger|8222|bdquo|8221|rdquo|8220|ldquo|8218|sbquo|8217|rsquo|8216|lsquo||8212|||mdash|8211|ndash|8207|rlm|8206||lrm|8205|zwj|8204||zwnj|8201|thinsp|8195|emsp|8194|ensp|982|piv|978|upsih|977|thetasym|969|omega|968|psi|967|chi|966|phi|965|upsilon|964|tau|963|sigma|962|sigmaf|961|rho|960|959|omicron|958|xi|957|956|955|lambda|954|kappa|953|iota|952|theta|951|eta|950|zeta|949|epsilon|948|delta|947|gamma|946|beta|945|alpha|937||Omega|936|Psi|935|Chi|934|Phi|933|Upsilon|932|Tau|931|Sigma|929|Rho|928|Pi|927|Omicron|926|Xi|925|Nu|924|Mu|923|Lambda|922|Kappa|921|Iota|920|Theta|919|Eta|918|Zeta|917|Epsilon|916|Delta|915|Gamma|914|Beta|913|Alpha|732|tilde|710|402|fnof|376|Yuml|353|scaron|352|Scaron|339|oelig|338|OElig|255|yuml|254|thorn|253|yacute|252|uuml|251|ucirc|250|uacute|249|ugrave|248|oslash|247|divide|246|ouml|245|otilde|244|ocirc|243|oacute|242|ograve|241|ntilde|240|eth|239|iuml|238|icirc|237|iacute|236|igrave|235|euml|234|ecirc|233|eacute|232||egrave|231|ccedil||230|aelig|229|aring|228|auml|227|atilde|226|acirc|225|aacute|agrave|223|szlig|222|THORN|221|Yacute|220|Uuml|219|Ucirc|218|Uacute|217|Ugrave|216|Oslash|215|times|214|Ouml|213|Otilde|212|Ocirc|211|Oacute|210|Ograve|209|Ntilde|208|ETH|207|Iuml|206|Icirc|205|Iacute|204|Igrave|203|Euml|202|Ecirc|201|Eacute|200|Egrave||199|Ccedil|198|AElig|197|Aring|196|Auml|195|Atilde|194||Acirc|193|Aacute|192|Agrave|191|iquest|190|frac34|189|frac12|188|frac14|187|raquo|186|ordm|185|sup1|184|cedil|183|middot|182|para|181|micro|180|acute|179|sup3|178|sup2|177|plusmn|176|deg|175|macr|174|reg|173|shy|172|171||laquo|170|ordf||169|copy|168|uml|167||sect|166|brvbar||165||yen|164|curren|163|pound|162|cent|161|iexcl|last_tag_attributes|com|microsoft|schemas|urn|_current_match|_last_match|_matches|boolean|concat|events|continue|groups|none|rules|vsides|rhs|lhs|hsides|below|above|void|cellspacing|cellpadding|aural|handheld|tv|tty|vbs|vbscript|jscript|ecmascript|ref|standby|declare|codetype|codebase|classid|archive|scheme|cookie|set|refresh||expires||speech|radio|password||checkbox|maxlength|longdesc|ismap|xmlns|post|method|enctype|nohref|onmouseup|onmouseout|onmouseover|onmousemove|onmousedown|ondblclick|mouse|onkeypress|onkeydown|frameset|onblur|onselect|onreset|onsubmit|onchange|onunload|core|charAt|parseAttributes|039|quot|textContent|shift|formated_options|amp|CDATA|cdataSection|contentTag|insertCell|insertRow|createCaption|newCol|opener|wym_skin_|ownerDocument|computeCssPath|addRange|selectNodeContents|getTime|Date|toggle|write|parsing||replaceChild|removeAttr|removeChild|firstChild|ready|blur|wym_box_|safari|opera|mozilla|msie|wymeditors|Number_Of_Cols|Number_Of_Rows|Summary|Caption|Alternative_Text|dtd|strict|TR|w3|EN|Strict|XHTML|W3C|PUBLIC|DOCTYPE|yes|scrollbars|wymupdate|iframeSelector|classesSelector|containersSelector|toolsListSelector|toolsSelector|boxSelector|Source_Code|Status|wym_classes_|Classes|wym_containers_th|Table_Header|wym_containers_blockquote|Blockquote|wym_containers_pre|Preformatted|wym_containers_h6|Heading_6|wym_containers_h5|Heading_5|wym_containers_h4|Heading_4|wym_containers_h3|Heading_3|wym_containers_h2|Heading_2|wym_containers_h1|Heading_1|wym_containers_p|Paragraph|Containers|wym_tools_preview|wym_tools_html|wym_tools_paste|wym_tools_table|wym_tools_image|wym_tools_unlink|wym_tools_link|wym_tools_redo|wym_tools_undo|wym_tools_outdent|wym_tools_indent|wym_tools_unordered_list|Unordered_List|wym_tools_ordered_list|Ordered_List|wym_tools_subscript|wym_tools_superscript|wym_tools_emphasis|Emphasis|wym_tools_strong|Strong|Tools|parent|wymiframe|wym_wymeditor_link|wym_area_bottom|wym_area_main|wym_area_right|wym_area_left|wym_area_top|TEXT|ATTRIBUTE|ELEMENT|NODE|CURSOR|HOME|END|UNLINK|FormatBlock|InsertHTML|Wym_Dialog_Body|Wym_Dialog_Title|Wym_Status|Wym_Iframe|Wym_Html|Wym_Container_Class|Wym_Containers_Title|Wym_Container_Name|Wym_Containers_Items|Wym_Containers|Wym_Class_Title|Wym_Class_Name|Wym_Classes_Items|Wym_Classes|Wym_Tool_Class|Wym_Tool_Title|Wym_Tool_Name|Wym_Tools_Items||Wym_Tools|Wym_Logo|Wym_Direction|Wym_Jquery_Path|Wym_Iframe_Base_Path|Wym_Wym_Path|Wym_Css_Path|Wym_Base_Path|wym_index|Wym_Index|rc1|VERSION|profileEnd|trace|timeEnd|time|groupEnd|group|dirxml|assert|warn|info|debug|log|firebug'.split('|'),0,{}))
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/bg.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/bg.js
new file mode 100644
index 0000000..576bca5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/bg.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['bg'] = {
+ Strong: 'Получер',
+ Emphasis: 'Курсив',
+ Superscript: 'Горен индекс',
+ Subscript: 'Долен индекс',
+ Ordered_List: 'Подреден списък',
+ Unordered_List: 'Неподреден списък',
+ Indent: 'Блок навътре',
+ Outdent: 'Блок навън',
+ Undo: 'Стъпка назад',
+ Redo: 'Стъпка напред',
+ Link: 'Създай хипервръзка',
+ Unlink: 'Премахни хипервръзката',
+ Image: 'Изображение',
+ Table: 'Таблица',
+ HTML: 'HTML',
+ Paragraph: 'Абзац',
+ Heading_1: 'Заглавие 1',
+ Heading_2: 'Заглавие 2',
+ Heading_3: 'Заглавие 3',
+ Heading_4: 'Заглавие 4',
+ Heading_5: 'Заглавие 5',
+ Heading_6: 'Заглавие 6',
+ Preformatted: 'Преформатиран',
+ Blockquote: 'Цитат',
+ Table_Header: 'Заглавие на таблицата',
+ URL: 'URL',
+ Title: 'Заглавие',
+ Alternative_Text: 'Алтернативен текст',
+ Caption: 'Етикет',
+ Summary: 'Общо',
+ Number_Of_Rows: 'Брой редове',
+ Number_Of_Cols: 'Брой колони',
+ Submit: 'Изпрати',
+ Cancel: 'Отмени',
+ Choose: 'Затвори',
+ Preview: 'Предварителен преглед',
+ Paste_From_Word: 'Вмъкни от MS WORD',
+ Tools: 'Инструменти',
+ Containers: 'Контейнери',
+ Classes: 'Класове',
+ Status: 'Статус',
+ Source_Code: 'Източник, код'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/ca.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/ca.js
new file mode 100644
index 0000000..c342406
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/ca.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['ca'] = {
+ Strong: 'Ressaltar',
+ Emphasis: 'Emfatitzar',
+ Superscript: 'Superindex',
+ Subscript: 'Subindex',
+ Ordered_List: 'Llistat ordenat',
+ Unordered_List: 'Llistat sense ordenar',
+ Indent: 'Indentat',
+ Outdent: 'Sense indentar',
+ Undo: 'Desfer',
+ Redo: 'Refer',
+ Link: 'Enllaçar',
+ Unlink: 'Eliminar enllaç',
+ Image: 'Imatge',
+ Table: 'Taula',
+ HTML: 'HTML',
+ Paragraph: 'Paràgraf',
+ Heading_1: 'Capçalera 1',
+ Heading_2: 'Capçalera 2',
+ Heading_3: 'Capçalera 3',
+ Heading_4: 'Capçalera 4',
+ Heading_5: 'Capçalera 5',
+ Heading_6: 'Capçalera 6',
+ Preformatted: 'Pre-formatejat',
+ Blockquote: 'Cita',
+ Table_Header: 'Capçalera de la taula',
+ URL: 'URL',
+ Title: 'Títol',
+ Alternative_Text: 'Text alternatiu',
+ Caption: 'Llegenda',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Nombre de files',
+ Number_Of_Cols: 'Nombre de columnes',
+ Submit: 'Enviar',
+ Cancel: 'Cancel·lar',
+ Choose: 'Triar',
+ Preview: 'Vista prèvia',
+ Paste_From_Word: 'Pegar des de Word',
+ Tools: 'Eines',
+ Containers: 'Contenidors',
+ Classes: 'Classes',
+ Status: 'Estat',
+ Source_Code: 'Codi font'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/cs.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/cs.js
new file mode 100644
index 0000000..3939d71
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/cs.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['cs'] = {
+ Strong: 'Tučné',
+ Emphasis: 'Kurzíva',
+ Superscript: 'Horní index',
+ Subscript: 'Dolní index',
+ Ordered_List: 'Číslovaný seznam',
+ Unordered_List: 'Nečíslovaný seznam',
+ Indent: 'Zvětšit odsazení',
+ Outdent: 'Zmenšit odsazení',
+ Undo: 'Zpět',
+ Redo: 'Znovu',
+ Link: 'Vytvořit odkaz',
+ Unlink: 'Zrušit odkaz',
+ Image: 'Obrázek',
+ Table: 'Tabulka',
+ HTML: 'HTML',
+ Paragraph: 'Odstavec',
+ Heading_1: 'Nadpis 1. úrovně',
+ Heading_2: 'Nadpis 2. úrovně',
+ Heading_3: 'Nadpis 3. úrovně',
+ Heading_4: 'Nadpis 4. úrovně',
+ Heading_5: 'Nadpis 5. úrovně',
+ Heading_6: 'Nadpis 6. úrovně',
+ Preformatted: 'Předformátovaný text',
+ Blockquote: 'Citace',
+ Table_Header: 'Hlavičková buňka tabulky',
+ URL: 'Adresa',
+ Title: 'Text po najetí myší',
+ Alternative_Text: 'Text pro případ nezobrazení obrázku',
+ Caption: 'Titulek tabulky',
+ Summary: 'Shrnutí obsahu',
+ Number_Of_Rows: 'Počet řádek',
+ Number_Of_Cols: 'Počet sloupců',
+ Submit: 'Vytvořit',
+ Cancel: 'Zrušit',
+ Choose: 'Vybrat',
+ Preview: 'Náhled',
+ Paste_From_Word: 'Vložit z Wordu',
+ Tools: 'Nástroje',
+ Containers: 'Typy obsahu',
+ Classes: 'Třídy',
+ Status: 'Stav',
+ Source_Code: 'Zdrojový kód'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/cy.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/cy.js
new file mode 100644
index 0000000..7d15b79
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/cy.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['cy'] = {
+ Strong: 'Bras',
+ Emphasis: 'Italig',
+ Superscript: 'Uwchsgript',
+ Subscript: 'Is-sgript',
+ Ordered_List: 'Rhestr mewn Trefn',
+ Unordered_List: 'Pwyntiau Bwled',
+ Indent: 'Mewnoli',
+ Outdent: 'Alloli',
+ Undo: 'Dadwneud',
+ Redo: 'Ailwneud',
+ Link: 'Cysylltu',
+ Unlink: 'Datgysylltu',
+ Image: 'Delwedd',
+ Table: 'Tabl',
+ HTML: 'HTML',
+ Paragraph: 'Paragraff',
+ Heading_1: 'Pennawd 1',
+ Heading_2: 'Pennawd 2',
+ Heading_3: 'Pennawd 3',
+ Heading_4: 'Pennawd 4',
+ Heading_5: 'Pennawd 5',
+ Heading_6: 'Pennawd 6',
+ Preformatted: 'Rhagfformat',
+ Blockquote: 'Bloc Dyfyniad',
+ Table_Header: 'Pennyn Tabl',
+ URL: 'URL',
+ Title: 'Teitl',
+ Alternative_Text: 'Testun Amgen',
+ Caption: 'Pennawd',
+ Summary: 'Crynodeb',
+ Number_Of_Rows: 'Nifer y rhesi',
+ Number_Of_Cols: 'Nifer y colofnau',
+ Submit: 'Anfon',
+ Cancel: 'Diddymu',
+ Choose: 'Dewis',
+ Preview: 'Rhagolwg',
+ Paste_From_Word: 'Gludo o Word',
+ Tools: 'Offer',
+ Containers: 'Cynhwysyddion',
+ Classes: 'Dosbarthiadau',
+ Status: 'Statws',
+ Source_Code: 'Cod ffynhonnell'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/de.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/de.js
new file mode 100644
index 0000000..a1e01e1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/de.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['de'] = {
+ Strong: 'Fett',
+ Emphasis: 'Kursiv',
+ Superscript: 'Text hochstellen',
+ Subscript: 'Text tiefstellen',
+ Ordered_List: 'Geordnete Liste einfügen',
+ Unordered_List: 'Ungeordnete Liste einfügen',
+ Indent: 'Einzug erhöhen',
+ Outdent: 'Einzug vermindern',
+ Undo: 'Befehle rückgängig machen',
+ Redo: 'Befehle wiederherstellen',
+ Link: 'Hyperlink einfügen',
+ Unlink: 'Hyperlink entfernen',
+ Image: 'Bild einfügen',
+ Table: 'Tabelle einfügen',
+ HTML: 'HTML anzeigen/verstecken',
+ Paragraph: 'Absatz',
+ Heading_1: 'Überschrift 1',
+ Heading_2: 'Überschrift 2',
+ Heading_3: 'Überschrift 3',
+ Heading_4: 'Überschrift 4',
+ Heading_5: 'Überschrift 5',
+ Heading_6: 'Überschrift 6',
+ Preformatted: 'Vorformatiert',
+ Blockquote: 'Zitat',
+ Table_Header: 'Tabellenüberschrift',
+ URL: 'URL',
+ Title: 'Titel',
+ Alternative_Text: 'Alternativer Text',
+ Caption: 'Tabellenüberschrift',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Anzahl Zeilen',
+ Number_Of_Cols: 'Anzahl Spalten',
+ Submit: 'Absenden',
+ Cancel: 'Abbrechen',
+ Choose: 'Auswählen',
+ Preview: 'Vorschau',
+ Paste_From_Word: 'Aus Word einfügen',
+ Tools: 'Werkzeuge',
+ Containers: 'Inhaltstyp',
+ Classes: 'Klassen',
+ Status: 'Status',
+ Source_Code: 'Quellcode'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/en.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/en.js
new file mode 100644
index 0000000..1e351e5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/en.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['en'] = {
+ Strong: 'Strong',
+ Emphasis: 'Emphasis',
+ Superscript: 'Superscript',
+ Subscript: 'Subscript',
+ Ordered_List: 'Ordered List',
+ Unordered_List: 'Unordered List',
+ Indent: 'Indent',
+ Outdent: 'Outdent',
+ Undo: 'Undo',
+ Redo: 'Redo',
+ Link: 'Link',
+ Unlink: 'Unlink',
+ Image: 'Image',
+ Table: 'Table',
+ HTML: 'HTML',
+ Paragraph: 'Paragraph',
+ Heading_1: 'Heading 1',
+ Heading_2: 'Heading 2',
+ Heading_3: 'Heading 3',
+ Heading_4: 'Heading 4',
+ Heading_5: 'Heading 5',
+ Heading_6: 'Heading 6',
+ Preformatted: 'Preformatted',
+ Blockquote: 'Blockquote',
+ Table_Header: 'Table Header',
+ URL: 'URL',
+ Title: 'Title',
+ Alternative_Text: 'Alternative text',
+ Caption: 'Caption',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Number of rows',
+ Number_Of_Cols: 'Number of cols',
+ Submit: 'Submit',
+ Cancel: 'Cancel',
+ Choose: 'Choose',
+ Preview: 'Preview',
+ Paste_From_Word: 'Paste from Word',
+ Tools: 'Tools',
+ Containers: 'Containers',
+ Classes: 'Classes',
+ Status: 'Status',
+ Source_Code: 'Source code'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/es.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/es.js
new file mode 100644
index 0000000..cdb03c1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/es.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['es'] = {
+ Strong: 'Resaltar',
+ Emphasis: 'Enfatizar',
+ Superscript: 'Superindice',
+ Subscript: 'Subindice',
+ Ordered_List: 'Lista ordenada',
+ Unordered_List: 'Lista sin ordenar',
+ Indent: 'Indentado',
+ Outdent: 'Sin indentar',
+ Undo: 'Deshacer',
+ Redo: 'Rehacer',
+ Link: 'Enlazar',
+ Unlink: 'Eliminar enlace',
+ Image: 'Imagen',
+ Table: 'Tabla',
+ HTML: 'HTML',
+ Paragraph: 'Párrafo',
+ Heading_1: 'Cabecera 1',
+ Heading_2: 'Cabecera 2',
+ Heading_3: 'Cabecera 3',
+ Heading_4: 'Cabecera 4',
+ Heading_5: 'Cabecera 5',
+ Heading_6: 'Cabecera 6',
+ Preformatted: 'Preformateado',
+ Blockquote: 'Cita',
+ Table_Header: 'Cabecera de la tabla',
+ URL: 'URL',
+ Title: 'Título',
+ Alternative_Text: 'Texto alternativo',
+ Caption: 'Leyenda',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Número de filas',
+ Number_Of_Cols: 'Número de columnas',
+ Submit: 'Enviar',
+ Cancel: 'Cancelar',
+ Choose: 'Seleccionar',
+ Preview: 'Vista previa',
+ Paste_From_Word: 'Pegar desde Word',
+ Tools: 'Herramientas',
+ Containers: 'Contenedores',
+ Classes: 'Clases',
+ Status: 'Estado',
+ Source_Code: 'Código fuente'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fa.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fa.js
new file mode 100644
index 0000000..9d70fcb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fa.js
@@ -0,0 +1,46 @@
+//Translation To Persian: Ghassem Tofighi (http://ght.ir)
+WYMeditor.STRINGS['fa'] = {
+ Strong: 'پررنگ',//Strong
+ Emphasis: 'ایتالیک',//Emphasis
+ Superscript: 'بالانويس‌ ',//Superscript
+ Subscript: 'زيرنويس‌',//Subscript
+ Ordered_List: 'لیست مرتب',//Ordered List
+ Unordered_List: 'لیست نامرتب',//Unordered List
+ Indent: 'افزودن دندانه',//Indent
+ Outdent: 'کاهش دندانه',//Outdent
+ Undo: 'واگردانی',//Undo
+ Redo: 'تکرار',//Redo
+ Link: 'ساختن پیوند',//Link
+ Unlink: 'برداشتن پیوند',//Unlink
+ Image: 'تصویر',//Image
+ Table: 'جدول',//Table
+ HTML: 'HTML',//HTML
+ Paragraph: 'پاراگراف',//Paragraph
+ Heading_1: 'سرتیتر ۱',//Heading 1
+ Heading_2: 'سرتیتر ۲',//Heading 2
+ Heading_3: 'سرتیتر ۳',//Heading 3
+ Heading_4: 'سرتیتر ۴',//Heading 4
+ Heading_5: 'سرتیتر ۵',//Heading 5
+ Heading_6: 'سرتیتر ۶',//Heading 6
+ Preformatted: 'قالب آماده',//Preformatted
+ Blockquote: 'نقل قول',//Blockquote
+ Table_Header: 'سرجدول',//Table Header
+ URL: 'آدرس اینترنتی',//URL
+ Title: 'عنوان',//Title
+ Alternative_Text: 'متن جایگزین',//Alternative text
+ Caption: 'عنوان',//Caption
+ Summary: 'Summary',
+ Number_Of_Rows: 'تعداد سطرها',//Number of rows
+ Number_Of_Cols: 'تعداد ستون‌ها',//Number of cols
+ Submit: 'فرستادن',//Submit
+ Cancel: 'لغو',//Cancel
+ Choose: 'انتخاب',//Choose
+ Preview: 'پیش‌نمایش',//Preview
+ Paste_From_Word: 'انتقال از ورد',//Paste from Word
+ Tools: 'ابزار',//Tools
+ Containers: '‌قالب‌ها',//Containers
+ Classes: 'کلاس‌ها',//Classes
+ Status: 'وضعیت',//Status
+ Source_Code: 'کد مبدأ'//Source code
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fi.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fi.js
new file mode 100644
index 0000000..fe1eab4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fi.js
@@ -0,0 +1,44 @@
+WYMeditor.STRINGS['fi'] = {
+ Strong: 'Lihavoitu',
+ Emphasis: 'Korostus',
+ Superscript: 'Yläindeksi',
+ Subscript: 'Alaindeksi',
+ Ordered_List: 'Numeroitu lista',
+ Unordered_List: 'Luettelomerkit',
+ Indent: 'Suurenna sisennystä',
+ Outdent: 'Pienennä sisennystä',
+ Undo: 'Kumoa',
+ Redo: 'Toista',
+ Link: 'Linkitä',
+ Unlink: 'Poista linkitys',
+ Image: 'Kuva',
+ Table: 'Taulukko',
+ HTML: 'HTML',
+ Paragraph: 'Kappale',
+ Heading_1: 'Otsikko 1',
+ Heading_2: 'Otsikko 2',
+ Heading_3: 'Otsikko 3',
+ Heading_4: 'Otsikko 4',
+ Heading_5: 'Otsikko 5',
+ Heading_6: 'Otsikko 6',
+ Preformatted: 'Esimuotoilu',
+ Blockquote: 'Sitaatti',
+ Table_Header: 'Taulukon otsikko',
+ URL: 'URL',
+ Title: 'Otsikko',
+ Alternative_Text: 'Vaihtoehtoinen teksti',
+ Caption: 'Kuvateksti',
+ Summary: 'Yhteenveto',
+ Number_Of_Rows: 'Rivien määrä',
+ Number_Of_Cols: 'Palstojen määrä',
+ Submit: 'Lähetä',
+ Cancel: 'Peruuta',
+ Choose: 'Valitse',
+ Preview: 'Esikatsele',
+ Paste_From_Word: 'Tuo Wordista',
+ Tools: 'Työkalut',
+ Containers: 'Muotoilut',
+ Classes: 'Luokat',
+ Status: 'Tila',
+ Source_Code: 'Lähdekoodi'
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fr.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fr.js
new file mode 100644
index 0000000..9b6deb9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/fr.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['fr'] = {
+ Strong: 'Mise en évidence',
+ Emphasis: 'Emphase',
+ Superscript: 'Exposant',
+ Subscript: 'Indice',
+ Ordered_List: 'Liste Ordonnée',
+ Unordered_List: 'Liste Non-Ordonnée',
+ Indent: 'Imbriqué',
+ Outdent: 'Non-imbriqué',
+ Undo: 'Annuler',
+ Redo: 'Rétablir',
+ Link: 'Lien',
+ Unlink: 'Supprimer le Lien',
+ Image: 'Image',
+ Table: 'Tableau',
+ HTML: 'HTML',
+ Paragraph: 'Paragraphe',
+ Heading_1: 'Titre 1',
+ Heading_2: 'Titre 2',
+ Heading_3: 'Titre 3',
+ Heading_4: 'Titre 4',
+ Heading_5: 'Titre 5',
+ Heading_6: 'Titre 6',
+ Preformatted: 'Pré-formatté',
+ Blockquote: 'Citation',
+ Table_Header: 'Cellule de titre',
+ URL: 'URL',
+ Title: 'Titre',
+ Alternative_Text: 'Texte alternatif',
+ Caption: 'Légende',
+ Summary: 'Résumé',
+ Number_Of_Rows: 'Nombre de lignes',
+ Number_Of_Cols: 'Nombre de colonnes',
+ Submit: 'Envoyer',
+ Cancel: 'Annuler',
+ Choose: 'Choisir',
+ Preview: 'Prévisualisation',
+ Paste_From_Word: 'Copier depuis Word',
+ Tools: 'Outils',
+ Containers: 'Type de texte',
+ Classes: 'Type de contenu',
+ Status: 'Infos',
+ Source_Code: 'Code source'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/gl.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/gl.js
new file mode 100644
index 0000000..d4786b8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/gl.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['gl'] = {
+ Strong: 'Moita énfase',
+ Emphasis: 'Énfase',
+ Superscript: 'Superíndice',
+ Subscript: 'Subíndice',
+ Ordered_List: 'Lista ordenada',
+ Unordered_List: 'Lista sen ordenar',
+ Indent: 'Aniñar',
+ Outdent: 'Desaniñar',
+ Undo: 'Desfacer',
+ Redo: 'Refacer',
+ Link: 'Ligazón',
+ Unlink: 'Desligar',
+ Image: 'Imaxe',
+ Table: 'Táboa',
+ HTML: 'HTML',
+ Paragraph: 'Parágrafo',
+ Heading_1: 'Título 1',
+ Heading_2: 'Título 2',
+ Heading_3: 'Título 3',
+ Heading_4: 'Título 4',
+ Heading_5: 'Título 5',
+ Heading_6: 'Título 6',
+ Preformatted: 'Preformatado',
+ Blockquote: 'Cita en parágrafo',
+ Table_Header: 'Cabeceira da táboa',
+ URL: 'URL',
+ Title: 'Título',
+ Alternative_Text: 'Texto alternativo',
+ Caption: 'Título',
+ Summary: 'Resumo',
+ Number_Of_Rows: 'Número de filas',
+ Number_Of_Cols: 'Número de columnas',
+ Submit: 'Enviar',
+ Cancel: 'Cancelar',
+ Choose: 'Escoller',
+ Preview: 'Previsualizar',
+ Paste_From_Word: 'Colar dende Word',
+ Tools: 'Ferramentas',
+ Containers: 'Contenedores',
+ Classes: 'Clases',
+ Status: 'Estado',
+ Source_Code: 'Código fonte'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/he.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/he.js
new file mode 100644
index 0000000..97c9675
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/he.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['he'] = {
+ Strong: 'חזק',
+ Emphasis: 'מובלט',
+ Superscript: 'כתב עילי',
+ Subscript: 'כתב תחתי',
+ Ordered_List: 'רשימה ממוספרת',
+ Unordered_List: 'רשימה לא ממוספרת',
+ Indent: 'הזחה פנימה',
+ Outdent: 'הזחה החוצה',
+ Undo: 'בטל פעולה',
+ Redo: 'בצע מחדש פעולה',
+ Link: 'קישור',
+ Unlink: 'בטל קישור',
+ Image: 'תמונה',
+ Table: 'טבלה',
+ HTML: 'קוד HTML',
+ Paragraph: 'פסקה',
+ Heading_1: 'כותרת 1 ; תג &lt;h1&gt;',
+ Heading_2: 'כותרת 2 ; תג &lt;h2&gt;',
+ Heading_3: 'כותרת 3 ; תג &lt;h3&gt;',
+ Heading_4: 'כותרת 4 ; תג &lt;h4&gt;',
+ Heading_5: 'כותרת 5 ; תג &lt;h5&gt;',
+ Heading_6: 'כותרת 6 ; תג &lt;h6&gt;',
+ Preformatted: 'משמר רווחים',
+ Blockquote: 'ציטוט',
+ Table_Header: 'כותרת טבלה',
+ URL: 'קישור (URL)',
+ Title: 'כותרת',
+ Alternative_Text: 'טקסט חלופי',
+ Caption: 'כותרת',
+ Summary: 'סיכום',
+ Number_Of_Rows: 'מספר שורות',
+ Number_Of_Cols: 'מספר טורים',
+ Submit: 'שלח',
+ Cancel: 'בטל',
+ Choose: 'בחר',
+ Preview: 'תצוגה מקדימה',
+ Paste_From_Word: 'העתק מ-Word',
+ Tools: 'כלים',
+ Containers: 'מיכלים',
+ Classes: 'מחלקות',
+ Status: 'מצב',
+ Source_Code: 'קוד מקור'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/hr.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/hr.js
new file mode 100644
index 0000000..193e31a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/hr.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['hr'] = {
+ Strong: 'Podebljano',
+ Emphasis: 'Naglašeno',
+ Superscript: 'Iznad',
+ Subscript: 'Ispod',
+ Ordered_List: 'Pobrojana lista',
+ Unordered_List: 'Nepobrojana lista',
+ Indent: 'Uvuci',
+ Outdent: 'Izvuci',
+ Undo: 'Poništi promjenu',
+ Redo: 'Ponovno promjeni',
+ Link: 'Hiperveza',
+ Unlink: 'Ukloni hipervezu',
+ Image: 'Slika',
+ Table: 'Tablica',
+ HTML: 'HTML',
+ Paragraph: 'Paragraf',
+ Heading_1: 'Naslov 1',
+ Heading_2: 'Naslov 2',
+ Heading_3: 'Naslov 3',
+ Heading_4: 'Naslov 4',
+ Heading_5: 'Naslov 5',
+ Heading_6: 'Naslov 6',
+ Preformatted: 'Unaprijed formatirano',
+ Blockquote: 'Citat',
+ Table_Header: 'Zaglavlje tablice',
+ URL: 'URL',
+ Title: 'Naslov',
+ Alternative_Text: 'Alternativni tekst',
+ Caption: 'Zaglavlje',
+ Summary: 'Sažetak',
+ Number_Of_Rows: 'Broj redova',
+ Number_Of_Cols: 'Broj kolona',
+ Submit: 'Snimi',
+ Cancel: 'Odustani',
+ Choose: 'Izaberi',
+ Preview: 'Pregled',
+ Paste_From_Word: 'Zalijepi iz Word-a',
+ Tools: 'Alati',
+ Containers: 'Kontejneri',
+ Classes: 'Klase',
+ Status: 'Status',
+ Source_Code: 'Izvorni kod'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/hu.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/hu.js
new file mode 100644
index 0000000..a8cdbc6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/hu.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['hu'] = {
+ Strong: 'Félkövér',
+ Emphasis: 'Kiemelt',
+ Superscript: 'Felső index',
+ Subscript: 'Alsó index',
+ Ordered_List: 'Rendezett lista',
+ Unordered_List: 'Rendezetlen lista',
+ Indent: 'Bekezdés',
+ Outdent: 'Bekezdés törlése',
+ Undo: 'Visszavon',
+ Redo: 'Visszaállít',
+ Link: 'Link',
+ Unlink: 'Link törlése',
+ Image: 'Kép',
+ Table: 'Tábla',
+ HTML: 'HTML',
+ Paragraph: 'Bekezdés',
+ Heading_1: 'Címsor 1',
+ Heading_2: 'Címsor 2',
+ Heading_3: 'Címsor 3',
+ Heading_4: 'Címsor 4',
+ Heading_5: 'Címsor 5',
+ Heading_6: 'Címsor 6',
+ Preformatted: 'Előformázott',
+ Blockquote: 'Idézet',
+ Table_Header: 'Tábla Fejléc',
+ URL: 'Webcím',
+ Title: 'Megnevezés',
+ Alternative_Text: 'Alternatív szöveg',
+ Caption: 'Fejléc',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Sorok száma',
+ Number_Of_Cols: 'Oszlopok száma',
+ Submit: 'Elküld',
+ Cancel: 'Mégsem',
+ Choose: 'Választ',
+ Preview: 'Előnézet',
+ Paste_From_Word: 'Másolás Word-ból',
+ Tools: 'Eszközök',
+ Containers: 'Tartalmak',
+ Classes: 'Osztályok',
+ Status: 'Állapot',
+ Source_Code: 'Forráskód'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/it.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/it.js
new file mode 100644
index 0000000..ca632a9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/it.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['it'] = {
+ Strong: 'Grassetto',
+ Emphasis: 'Corsetto',
+ Superscript: 'Apice',
+ Subscript: 'Pedice',
+ Ordered_List: 'Lista Ordinata',
+ Unordered_List: 'Lista Puntata',
+ Indent: 'Indenta',
+ Outdent: 'Caccia',
+ Undo: 'Indietro',
+ Redo: 'Avanti',
+ Link: 'Inserisci Link',
+ Unlink: 'Togli Link',
+ Image: 'Inserisci Immagine',
+ Table: 'Inserisci Tabella',
+ HTML: 'HTML',
+ Paragraph: 'Paragrafo',
+ Heading_1: 'Heading 1',
+ Heading_2: 'Heading 2',
+ Heading_3: 'Heading 3',
+ Heading_4: 'Heading 4',
+ Heading_5: 'Heading 5',
+ Heading_6: 'Heading 6',
+ Preformatted: 'Preformattato',
+ Blockquote: 'Blockquote',
+ Table_Header: 'Header Tabella',
+ URL: 'Indirizzo',
+ Title: 'Titolo',
+ Alternative_Text: 'Testo Alternativo',
+ Caption: 'Caption',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Numero di Righe',
+ Number_Of_Cols: 'Numero di Colonne',
+ Submit: 'Invia',
+ Cancel: 'Cancella',
+ Choose: 'Scegli',
+ Preview: 'Anteprima',
+ Paste_From_Word: 'Incolla',
+ Tools: 'Tools',
+ Containers: 'Contenitori',
+ Classes: 'Classi',
+ Status: 'Stato',
+ Source_Code: 'Codice Sorgente'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nb.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nb.js
new file mode 100644
index 0000000..7573b78
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nb.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['nb'] = {
+ Strong: 'Fet',
+ Emphasis: 'Uthevet',
+ Superscript: 'Opphøyet',
+ Subscript: 'Nedsenket',
+ Ordered_List: 'Nummerert liste',
+ Unordered_List: 'Punktliste',
+ Indent: 'Rykk inn',
+ Outdent: 'Rykk ut',
+ Undo: 'Angre',
+ Redo: 'Gjenta',
+ Link: 'Lenke',
+ Unlink: 'Ta bort lenken',
+ Image: 'Bilde',
+ Table: 'Tabell',
+ HTML: 'HTML',
+ Paragraph: 'Avsnitt',
+ Heading_1: 'Overskrift 1',
+ Heading_2: 'Overskrift 2',
+ Heading_3: 'Overskrift 3',
+ Heading_4: 'Overskrift 4',
+ Heading_5: 'Overskrift 5',
+ Heading_6: 'Overskrift 6',
+ Preformatted: 'Preformatert',
+ Blockquote: 'Sitat',
+ Table_Header: 'Tabelloverskrift',
+ URL: 'URL',
+ Title: 'Tittel',
+ Alternative_Text: 'Alternativ tekst',
+ Caption: 'Overskrift',
+ Summary: 'Sammendrag',
+ Number_Of_Rows: 'Antall rader',
+ Number_Of_Cols: 'Antall kolonner',
+ Submit: 'Ok',
+ Cancel: 'Avbryt',
+ Choose: 'Velg',
+ Preview: 'Forhåndsvis',
+ Paste_From_Word: 'Lim inn fra Word',
+ Tools: 'Verktøy',
+ Containers: 'Formatering',
+ Classes: 'Klasser',
+ Status: 'Status',
+ Source_Code: 'Kildekode'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nl.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nl.js
new file mode 100644
index 0000000..cdfa21c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nl.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['nl'] = {
+ Strong: 'Sterk benadrukken',
+ Emphasis: 'Benadrukken',
+ Superscript: 'Bovenschrift',
+ Subscript: 'Onderschrift',
+ Ordered_List: 'Geordende lijst',
+ Unordered_List: 'Ongeordende lijst',
+ Indent: 'Inspringen',
+ Outdent: 'Terugspringen',
+ Undo: 'Ongedaan maken',
+ Redo: 'Opnieuw uitvoeren',
+ Link: 'Linken',
+ Unlink: 'Ontlinken',
+ Image: 'Afbeelding',
+ Table: 'Tabel',
+ HTML: 'HTML',
+ Paragraph: 'Paragraaf',
+ Heading_1: 'Kop 1',
+ Heading_2: 'Kop 2',
+ Heading_3: 'Kop 3',
+ Heading_4: 'Kop 4',
+ Heading_5: 'Kop 5',
+ Heading_6: 'Kop 6',
+ Preformatted: 'Voorgeformatteerd',
+ Blockquote: 'Citaat',
+ Table_Header: 'Tabel-kop',
+ URL: 'URL',
+ Title: 'Titel',
+ Alternative_Text: 'Alternatieve tekst',
+ Caption: 'Bijschrift',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Aantal rijen',
+ Number_Of_Cols: 'Aantal kolommen',
+ Submit: 'Versturen',
+ Cancel: 'Annuleren',
+ Choose: 'Kiezen',
+ Preview: 'Voorbeeld bekijken',
+ Paste_From_Word: 'Plakken uit Word',
+ Tools: 'Hulpmiddelen',
+ Containers: 'Teksttypes',
+ Classes: 'Klassen',
+ Status: 'Status',
+ Source_Code: 'Broncode'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nn.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nn.js
new file mode 100644
index 0000000..51cec2b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/nn.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['nn'] = {
+ Strong: 'Feit',
+ Emphasis: 'Utheva',
+ Superscript: 'Opphøgd',
+ Subscript: 'Nedsenka',
+ Ordered_List: 'Nummerert liste',
+ Unordered_List: 'Punktliste',
+ Indent: 'Rykk inn',
+ Outdent: 'Rykk ut',
+ Undo: 'Angre',
+ Redo: 'Gjentaka',
+ Link: 'Lenkje',
+ Unlink: 'Ta bort lenkja',
+ Image: 'Bilete',
+ Table: 'Tabell',
+ HTML: 'HTML',
+ Paragraph: 'Avsnitt',
+ Heading_1: 'Overskrift 1',
+ Heading_2: 'Overskrift 2',
+ Heading_3: 'Overskrift 3',
+ Heading_4: 'Overskrift 4',
+ Heading_5: 'Overskrift 5',
+ Heading_6: 'Overskrift 6',
+ Preformatted: 'Preformatert',
+ Blockquote: 'Sitat',
+ Table_Header: 'Tabelloverskrift',
+ URL: 'URL',
+ Title: 'Tittel',
+ Alternative_Text: 'Alternativ tekst',
+ Caption: 'Overskrift',
+ Summary: 'Samandrag',
+ Number_Of_Rows: 'Tal på rader',
+ Number_Of_Cols: 'Tal på kolonnar',
+ Submit: 'Ok',
+ Cancel: 'Avbryt',
+ Choose: 'Vel',
+ Preview: 'Førehandsvis',
+ Paste_From_Word: 'Lim inn frå Word',
+ Tools: 'Verkty',
+ Containers: 'Formatering',
+ Classes: 'Klassar',
+ Status: 'Status',
+ Source_Code: 'Kjeldekode'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pl.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pl.js
new file mode 100644
index 0000000..d6c0471
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pl.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['pl'] = {
+ Strong: 'Nacisk',
+ Emphasis: 'Emfaza',
+ Superscript: 'Indeks górny',
+ Subscript: 'Indeks dolny',
+ Ordered_List: 'Lista numerowana',
+ Unordered_List: 'Lista wypunktowana',
+ Indent: 'Zwiększ wcięcie',
+ Outdent: 'Zmniejsz wcięcie',
+ Undo: 'Cofnij',
+ Redo: 'Ponów',
+ Link: 'Wstaw link',
+ Unlink: 'Usuń link',
+ Image: 'Obraz',
+ Table: 'Tabela',
+ HTML: 'Źródło HTML',
+ Paragraph: 'Akapit',
+ Heading_1: 'Nagłówek 1',
+ Heading_2: 'Nagłówek 2',
+ Heading_3: 'Nagłówek 3',
+ Heading_4: 'Nagłówek 4',
+ Heading_5: 'Nagłówek 5',
+ Heading_6: 'Nagłówek 6',
+ Preformatted: 'Preformatowany',
+ Blockquote: 'Cytat blokowy',
+ Table_Header: 'Nagłówek tabeli',
+ URL: 'URL',
+ Title: 'Tytuł',
+ Alternative_Text: 'Tekst alternatywny',
+ Caption: 'Tytuł tabeli',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Liczba wierszy',
+ Number_Of_Cols: 'Liczba kolumn',
+ Submit: 'Wyślij',
+ Cancel: 'Anuluj',
+ Choose: 'Wybierz',
+ Preview: 'Podgląd',
+ Paste_From_Word: 'Wklej z Worda',
+ Tools: 'Narzędzia',
+ Containers: 'Format',
+ Classes: 'Styl',
+ Status: 'Status',
+ Source_Code: 'Kod źródłowy'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pt-br.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pt-br.js
new file mode 100644
index 0000000..2ec18fe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pt-br.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['pt-br'] = {
+ Strong: 'Resaltar',
+ Emphasis: 'Enfatizar',
+ Superscript: 'Sobre escrito',
+ Subscript: 'Sub escrito ',
+ Ordered_List: 'Lista ordenada',
+ Unordered_List: 'Lista desordenada',
+ Indent: 'Indentado',
+ Outdent: 'Desidentar',
+ Undo: 'Desfazer',
+ Redo: 'Refazer',
+ Link: 'Link',
+ Unlink: 'Remover Link',
+ Image: 'Imagem',
+ Table: 'Tabela',
+ HTML: 'HTML',
+ Paragraph: 'Parágrafo',
+ Heading_1: 'Título 1',
+ Heading_2: 'Título 2',
+ Heading_3: 'Título 3',
+ Heading_4: 'Título 4',
+ Heading_5: 'Título 5',
+ Heading_6: 'Título 6',
+ Preformatted: 'Preformatado',
+ Blockquote: 'Citação',
+ Table_Header: 'Título de tabela',
+ URL: 'URL',
+ Title: 'Título',
+ Alternative_Text: 'Texto alternativo',
+ Caption: 'Legenda',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Número de linhas',
+ Number_Of_Cols: 'Número de colunas',
+ Submit: 'Enviar',
+ Cancel: 'Cancelar',
+ Choose: 'Selecionar',
+ Preview: 'Previsualizar',
+ Paste_From_Word: 'Copiar do Word',
+ Tools: 'Ferramentas',
+ Containers: 'Conteneiners',
+ Classes: 'Classes',
+ Status: 'Estado',
+ Source_Code: 'Código fonte'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pt.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pt.js
new file mode 100644
index 0000000..a3d1a17
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/pt.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['pt'] = {
+ Strong: 'Negrito',
+ Emphasis: 'Itálico',
+ Superscript: 'Sobrescrito',
+ Subscript: 'Subsescrito',
+ Ordered_List: 'Lista Numerada',
+ Unordered_List: 'Lista Marcada',
+ Indent: 'Aumentar Indentaçã',
+ Outdent: 'Diminuir Indentaçã',
+ Undo: 'Desfazer',
+ Redo: 'Restaurar',
+ Link: 'Link',
+ Unlink: 'Tirar link',
+ Image: 'Imagem',
+ Table: 'Tabela',
+ HTML: 'HTML',
+ Paragraph: 'Parágrafo',
+ Heading_1: 'Título 1',
+ Heading_2: 'Título 2',
+ Heading_3: 'Título 3',
+ Heading_4: 'Título 4',
+ Heading_5: 'Título 5',
+ Heading_6: 'Título 6',
+ Preformatted: 'Pré-formatado',
+ Blockquote: 'Citação',
+ Table_Header: 'Cabeçalho Tabela',
+ URL: 'URL',
+ Title: 'Título',
+ Alternative_Text: 'Texto Alterativo',
+ Caption: 'Título Tabela',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Número de Linhas',
+ Number_Of_Cols: 'Número de Colunas',
+ Submit: 'Enviar',
+ Cancel: 'Cancelar',
+ Choose: 'Escolha',
+ Preview: 'Prever',
+ Paste_From_Word: 'Colar do Word',
+ Tools: 'Ferramentas',
+ Containers: 'Containers',
+ Classes: 'Classes',
+ Status: 'Status',
+ Source_Code: 'Código Fonte'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/ru.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/ru.js
new file mode 100644
index 0000000..7895f8d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/ru.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['ru'] = {
+ Strong: 'Жирный',
+ Emphasis: 'Наклонный',
+ Superscript: 'Надстрочный',
+ Subscript: 'Подстрочный',
+ Ordered_List: 'Нумерованый список',
+ Unordered_List: 'Ненумерованый список',
+ Indent: 'Увеличить отступ',
+ Outdent: 'Уменьшить отступ',
+ Undo: 'Отменить',
+ Redo: 'Повторить',
+ Link: 'Ссылка',
+ Unlink: 'Удалить ссылку',
+ Image: 'Изображение',
+ Table: 'Таблица',
+ HTML: 'Править HTML',
+ Paragraph: 'Параграф',
+ Heading_1: 'Заголовок 1',
+ Heading_2: 'Заголовок 2',
+ Heading_3: 'Заголовок 3',
+ Heading_4: 'Заголовок 4',
+ Heading_5: 'Заголовок 5',
+ Heading_6: 'Заголовок 6',
+ Preformatted: 'Preformatted',
+ Blockquote: 'Цитата',
+ Table_Header: 'Заголовок таблицы',
+ URL: 'URL',
+ Title: 'Заголовок',
+ Alternative_Text: 'Альтернативный текст',
+ Caption: 'Надпись',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Кол-во строк',
+ Number_Of_Cols: 'Кол-во столбцов',
+ Submit: 'Отправить',
+ Cancel: 'Отмена',
+ Choose: 'Выбор',
+ Preview: 'Просмотр',
+ Paste_From_Word: 'Вставить из Word',
+ Tools: 'Инструменты',
+ Containers: 'Контейнеры',
+ Classes: 'Классы',
+ Status: 'Статус',
+ Source_Code: 'Исходный код'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/sv.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/sv.js
new file mode 100644
index 0000000..bc5485c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/sv.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['sv'] = {
+ Strong: 'Viktigt',
+ Emphasis: 'Betoning',
+ Superscript: 'Upphöjt',
+ Subscript: 'Nedsänkt',
+ Ordered_List: 'Nummerlista',
+ Unordered_List: 'Punktlista',
+ Indent: 'Indrag',
+ Outdent: 'Utdrag',
+ Undo: 'Ångra',
+ Redo: 'Gör om',
+ Link: 'Länk',
+ Unlink: 'Ta bort länk',
+ Image: 'Bild',
+ Table: 'Tabell',
+ HTML: 'HTML',
+ Paragraph: 'Paragraf',
+ Heading_1: 'Rubrik 1',
+ Heading_2: 'Rubrik 2',
+ Heading_3: 'Rubrik 3',
+ Heading_4: 'Rubrik 4',
+ Heading_5: 'Rubrik 5',
+ Heading_6: 'Rubrik 6',
+ Preformatted: 'Förformaterad',
+ Blockquote: 'Blockcitat',
+ Table_Header: 'Tabellrubrik',
+ URL: 'URL',
+ Title: 'Titel',
+ Alternative_Text: 'Alternativ text',
+ Caption: 'Överskrift',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Antal rader',
+ Number_Of_Cols: 'Antal kolumner',
+ Submit: 'Skicka',
+ Cancel: 'Avbryt',
+ Choose: 'Välj',
+ Preview: 'Förhandsgranska',
+ Paste_From_Word: 'Klistra in från Word',
+ Tools: 'Verktyg',
+ Containers: 'Formatering',
+ Classes: 'Klasser',
+ Status: 'Status',
+ Source_Code: 'Källkod'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/tr.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/tr.js
new file mode 100644
index 0000000..d26f0ff
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/tr.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['tr'] = {
+ Strong: 'Kalın',
+ Emphasis: 'Vurgu',
+ Superscript: 'Superscript',
+ Subscript: 'Subscript',
+ Ordered_List: 'Sıralı List',
+ Unordered_List: 'Sırasız List',
+ Indent: 'İçerlek',
+ Outdent: 'Çıkıntılı',
+ Undo: 'Geri Al',
+ Redo: 'Yinele',
+ Link: 'Bağlantı',
+ Unlink: 'Bağlantıyı Kaldır',
+ Image: 'İmaj',
+ Table: 'Tablo',
+ HTML: 'HTML',
+ Paragraph: 'Parağraf',
+ Heading_1: 'Başlık 1',
+ Heading_2: 'Başlık 2',
+ Heading_3: 'Başlık 3',
+ Heading_4: 'Başlık 4',
+ Heading_5: 'Başlık 5',
+ Heading_6: 'Başlık 6',
+ Preformatted: 'Önceden Formatlı',
+ Blockquote: 'Alıntı',
+ Table_Header: 'Tablo Başlığı',
+ URL: 'URL',
+ Title: 'Başlık',
+ Alternative_Text: 'Alternatif Metin',
+ Caption: 'Etiket',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Satır sayısı',
+ Number_Of_Cols: 'Sütun sayısı',
+ Submit: 'Gönder',
+ Cancel: 'İptal',
+ Choose: 'Seç',
+ Preview: 'Önizleme',
+ Paste_From_Word: 'Wordden yapıştır',
+ Tools: 'Araçlar',
+ Containers: 'Kapsayıcılar',
+ Classes: 'Sınıflar',
+ Status: 'Durum',
+ Source_Code: 'Kaynak Kodu'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/zh_cn.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/zh_cn.js
new file mode 100644
index 0000000..72f5aaf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/lang/zh_cn.js
@@ -0,0 +1,47 @@
+WYMeditor.STRINGS['zh_cn'] = {
+ Strong: '加粗',
+ Emphasis: '斜体',
+ Superscript: '上标',
+ Subscript: '下标',
+ Ordered_List: '有序列表',
+ Unordered_List: '无序列表',
+ Indent: '增加缩进',
+ Outdent: '减少缩进',
+ Undo: '撤消',
+ Redo: '重做',
+ Link: '链接',
+ Unlink: '取消链接',
+ Image: '图片',
+ Table: '表格',
+ HTML: 'HTML源代码',
+ Paragraph: '段落',
+ Heading_1: '标题 1',
+ Heading_2: '标题 2',
+ Heading_3: '标题 3',
+ Heading_4: '标题 4',
+ Heading_5: '标题 5',
+ Heading_6: '标题 6',
+ Preformatted: '原始文本',
+ Blockquote: '引语',
+ Table_Header: '表头',
+ URL: '地址',
+ Title: '提示文字',
+ Alternative_Text: '失效文字',
+ Caption: '标题',
+ Summary: 'Summary',
+ Number_Of_Rows: '行数',
+ Number_Of_Cols: '列数',
+ Submit: '提交',
+ Cancel: '放弃',
+ Choose: '选择',
+ Preview: '预览',
+ Paste_From_Word: '从Word粘贴纯文本',
+ Tools: '工具',
+ Containers: '容器',
+ Classes: '预定义样式',
+ Status: '状态',
+ Source_Code: '源代码',
+ Attachment: '附件',
+ NewParagraph: '新段落'
+};
+
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/embed/jquery.wymeditor.embed.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/embed/jquery.wymeditor.embed.js
new file mode 100644
index 0000000..e553c3e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/embed/jquery.wymeditor.embed.js
@@ -0,0 +1,52 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.embed.js
+ * Experimental embed plugin
+ *
+ * File Authors:
+ * Jonatan Lundin (jonatan.lundin a-t gmail dotcom)
+ */
+
+/*
+ * ISSUES:
+ * - The closing object tag seems to be stripped out...
+ */
+(function() {
+ if (WYMeditor && WYMeditor.XhtmlValidator['_tags']['param']['attributes']) {
+
+ WYMeditor.XhtmlValidator['_tags']["embed"] = {
+ "attributes":[
+ "allowscriptaccess",
+ "allowfullscreen",
+ "height",
+ "src",
+ "type",
+ "width"
+ ]
+ };
+
+ WYMeditor.XhtmlValidator['_tags']['param']['attributes'] = {
+ '0':'name',
+ '1':'type',
+ 'valuetype':/^(data|ref|object)$/,
+ '2':'valuetype',
+ '3':'value'
+ };
+
+ var XhtmlSaxListener = WYMeditor.XhtmlSaxListener;
+ WYMeditor.XhtmlSaxListener = function () {
+ var listener = XhtmlSaxListener.call(this);
+ listener.block_tags.push('embed');
+ return listener;
+ };
+ WYMeditor.XhtmlSaxListener.prototype = XhtmlSaxListener.prototype;
+ }
+})();
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/fullscreen/icon_fullscreen.gif b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/fullscreen/icon_fullscreen.gif
new file mode 100644
index 0000000..d2a8b0a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/fullscreen/icon_fullscreen.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js
new file mode 100644
index 0000000..275c816
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js
@@ -0,0 +1,127 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.fullscreen.js
+ * Fullscreen plugin for WYMeditor
+ *
+ * File Authors:
+ * Luis Santos (luis.santos a-t openquest dotpt)
+ * Jonatan Lundin (jonatan.lundin a-t gmail dotcom)
+ * Gerd Riesselmann (gerd a-t gyro-php dot org) : Fixed issue with new skin layout
+ */
+
+//Extend WYMeditor
+WYMeditor.editor.prototype.fullscreen = function() {
+ var wym = this,
+ $box = jQuery(this._box),
+ $iframe = jQuery(this._iframe),
+ $overlay = null,
+ $window = jQuery(window),
+
+ editorMargin = 15; // Margin from window (without padding)
+
+
+ //construct the button's html
+ var html = "<li class='wym_tools_fullscreen'>"
+ + "<a name='Fullscreen' href='#'"
+ + " style='background-image:"
+ + " url(" + wym._options.basePath +"plugins/fullscreen/icon_fullscreen.gif)'>"
+ + "Fullscreen"
+ + "</a></li>";
+
+ //add the button to the tools box
+ $box.find(wym._options.toolsSelector + wym._options.toolsListSelector)
+ .append(html);
+
+ function resize () {
+ // Calculate margins
+ var uiHeight = $box.outerHeight(true)
+ - $iframe.outerHeight(true),
+ editorPadding = $box.outerWidth() - $box.width(),
+
+ // Calculate heights
+ screenHeight = $window.height(),
+ iframeHeight = (screenHeight
+ - uiHeight
+ - (editorMargin * 2)) + 'px',
+
+ // Calculate witdths
+ screenWidth = $window.width(),
+ boxWidth = (screenWidth
+ - editorPadding
+ - (editorMargin * 2)) + 'px';
+
+ $box.css('width', boxWidth);
+ $iframe.css('height', iframeHeight);
+ $overlay.css({
+ 'height': screenHeight + 'px',
+ 'width': screenWidth + 'px'
+ });
+ };
+
+ //handle click event
+ $box.find('li.wym_tools_fullscreen a').click(function() {
+ if ($box.css('position') != 'fixed') {
+ // Store previous inline styles
+ $box.data('wym-inline-css', $box.attr('style'));
+ $iframe.data('wym-inline-css', $iframe.attr('style'));
+
+ // Create overlay
+ $overlay = jQuery('<div id="wym-fullscreen-overlay"></div>')
+ .appendTo('body').css({
+ 'position': 'fixed',
+ 'background-color': 'rgb(0, 0, 0)',
+ 'opacity': '0.75',
+ 'z-index': '98',
+ 'top': '0px',
+ 'left': '0px'
+ });
+
+ // Possition the editor
+ $box.css({
+ 'position': 'fixed',
+ 'z-index': '99',
+ 'top': editorMargin + 'px',
+ 'left': editorMargin + 'px'
+ });
+
+ // Bind event listeners
+ $window.bind('resize', resize);
+ $box.find('li.wym_tools_html a').bind('click', resize);
+
+ // Force resize
+ resize();
+ } else {
+ // Unbind event listeners
+ $window.unbind('resize', resize);
+ $box.find('li.wym_tools_html a').unbind('click', resize);
+
+ // Remove inline styles
+ $box.css({
+ 'position': 'static',
+ 'z-index': '',
+ 'width': '',
+ 'top': '',
+ 'left': ''
+ });
+ $iframe.css('height', '');
+
+ // Remove overlay
+ $overlay.remove();
+ $overlay = null;
+
+ // Retore previous inline styles
+ $box.attr('style', $box.data('wym-inline-css'));
+ $iframe.attr('style', $iframe.data('wym-inline-css'));
+ }
+
+ return false;
+ });
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js
new file mode 100644
index 0000000..2c71ba5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js
@@ -0,0 +1,57 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.hovertools.js
+ * hovertools plugin for WYMeditor
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ */
+
+//Extend WYMeditor
+WYMeditor.editor.prototype.hovertools = function() {
+
+ var wym = this;
+
+ //bind events on buttons
+ jQuery(this._box).find(this._options.toolSelector).hover(
+ function() {
+ wym.status(jQuery(this).html());
+ },
+ function() {
+ wym.status('&nbsp;');
+ }
+ );
+
+ //classes: add/remove a style attr to matching elems
+ //while mouseover/mouseout
+ jQuery(this._box).find(this._options.classSelector).hover(
+ function() {
+ var aClasses = eval(wym._options.classesItems);
+ var sName = jQuery(this).attr(WYMeditor.NAME);
+ var oClass = WYMeditor.Helper.findByName(aClasses, sName);
+
+ if(oClass){
+ jqexpr = oClass.expr;
+ //don't use jQuery.find() on the iframe body
+ //because of MSIE + jQuery + expando issue (#JQ1143)
+ if(!jQuery.browser.msie)
+ jQuery(wym._doc).find(jqexpr).css('background-color','#cfc');
+ }
+ },
+ function() {
+ //don't use jQuery.find() on the iframe body
+ //because of MSIE + jQuery + expando issue (#JQ1143)
+ if(!jQuery.browser.msie)
+ jQuery(wym._doc).find('*').removeAttr('style');
+ }
+ );
+
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js
new file mode 100644
index 0000000..1ba2d2e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js
@@ -0,0 +1,91 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.resizable.js
+ * resize plugin for WYMeditor
+ *
+ * File Authors:
+ * Peter Eschler (peschler _at_ gmail.com)
+ * Jean-Francois Hovinne - http://www.hovinne.com/
+ *
+ * Version:
+ * 0.4
+ *
+ * Changelog:
+ *
+ * 0.4
+ * - Removed UI and UI.resizable scripts loading - see #167 (jfh).
+ *
+ * 0.3
+ * - Added 'iframeOriginalSize' and removed 'ui.instance' calls (jfh).
+ *
+ * 0.2
+ * - Added full support for all jQueryUI resizable plugin options.
+ * - Refactored and documented code.
+ * 0.1
+ * - Initial release.
+ */
+
+/**
+ * The resizable plugin makes the wymeditor box vertically resizable.
+ * It it based on the ui.resizable.js plugin of the jQuery UI library.
+ *
+ * The WYMeditor resizable plugin supports all parameters of the jQueryUI
+ * resizable plugin. The parameters are passed like this:
+ *
+ * wym.resizable({ handles: "s,e",
+ * maxHeight: 600 });
+ *
+ * DEPENDENCIES: jQuery UI, jQuery UI resizable
+ *
+ * @param options options for the plugin
+ */
+WYMeditor.editor.prototype.resizable = function(options) {
+
+ var wym = this;
+ var iframe = jQuery(wym._box).find('iframe');
+ var iframeOriginalSize = {};
+
+ // Define some default options
+ var default_options = {
+ start: function(e, ui) {
+ iframeOriginalSize = {
+ width: jQuery(iframe).width(),
+ height: jQuery(iframe).height()
+ }
+ },
+
+ // resize is called by the jQuery resizable plugin whenever the
+ // client area was resized.
+ resize: function(e, ui) {
+ var diff = ui.size.height - ui.originalSize.height;
+ jQuery(iframe).height( iframeOriginalSize.height + diff );
+
+ // If the plugin has horizontal resizing disabled we need to
+ // adjust the "width" attribute of the area css, because the
+ // resizing will set a fixed width (which breaks liquid layout
+ // of the wymeditor area).
+ if( !ui.options.handles['w'] && !ui.options.handles['e'] ) {
+ ui.size.width = "inherit";
+ }
+ },
+ handles: "s,e,se",
+ minHeight: 250,
+ maxHeight: 600
+ };
+
+ // Merge given options with default options. Given options override
+ // default ones.
+ var final_options = jQuery.extend(default_options, options);
+
+ if(jQuery.isFunction( jQuery.fn.resizable )) jQuery(wym._box).resizable(final_options);
+ else WYMeditor.console.error('Oops, jQuery UI.resizable unavailable.');
+
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/resizable/readme.txt b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/resizable/readme.txt
new file mode 100644
index 0000000..2a0444e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/resizable/readme.txt
@@ -0,0 +1,124 @@
+
+
+resizable plugin for WYMeditor
+##############################
+
+The ``resizable`` plugin for WYMeditor_ enables vertical resizing of the
+editor area. The plugin is based on the jQuery UI library.
+
+Requirements
+============
+The following packages are required for using the WYMeditor ``resizable``
+plugin:
+
+* jQuery (tested with jQuery ``jquery-1.2.4a.js`` from ``jquery.ui`` package)
+* WYMeditor SVN trunk (Revision: 482)
+* jQuery-UI (tested with ``jquery.ui-1.5b2``)
+
+It should be possible to use this plugin with ``WYMeditor-0.4`` but I have not
+tried.
+
+Download
+========
+You can download the WYMeditor ``resizable`` plugin here:
+
+* wymeditor-resizable-plugin-0.2.tgz_
+* wymeditor-resizable-plugin-0.1.tgz_
+
+See the Changelog_ for more infos about the releases.
+
+.. _wymeditor-resizable-plugin-0.2.tgz: http://pyjax.net/download/wymeditor-resizable-plugin-0.2.tgz
+.. _wymeditor-resizable-plugin-0.1.tgz: http://pyjax.net/download/wymeditor-resizable-plugin-0.1.tgz
+
+Installation
+============
+Just extract the downloaded archive into your WYMeditor's ``plugin``
+directory.
+
+Usage
+=====
+For general instructions on WYMeditor plugins please refer to the `WYMeditor
+plugin page`_.
+
+To use the ``resizable`` plugin simply include the plugin's JavaScript file in
+your code. You **do not** need to include the jQuery UI files - this is done
+automatically by the plugin (see `Internals`_)::
+
+ <script type="text/javascript"
+ src="/js/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js">
+ </script>
+
+Make sure to adjust the ``src`` attribute to your needs, then initialize the
+plugin in WYMeditor's ``postInit`` function::
+
+ wymeditor({postInit: function(wym) {
+ wym.hovertools(); // other plugins...
+ wym.resizable({handles: "s,e",
+ maxHeight: 600});
+ }
+ })
+
+The ``resizable`` plugin takes exactly one parameter, which is an object literal
+containing the options of the plugin. The WYMeditor ``resizable`` plugin
+supports all options of the jQuery UI ``resizable`` plugin. These are the
+default values used by the plugin::
+
+ handles: "s,e,se",
+ minHeight: 250,
+ maxHeight: 600
+
+See the `jQuery UI resizable plugin docs`_ for a list of all options.
+
+That's it! You are now able to resize the WYMeditor vertically, horizontally or
+both, depending on your options.
+
+.. _jQuery UI resizable plugin docs: http://docs.jquery.com/UI/Resizables
+
+Internals
+=========
+The plugin takes care of loading the necessary jQuery UI files (``base`` and
+``resizable``) from the same path the jQuery library was loaded. Here's how
+it's done::
+
+ // Get the jQuery path from the editor, stripping away the jQuery file.
+ // see http://www.oreilly.com/catalog/regex/chapter/ch04.html
+ // The match result array contains the path and the filename.
+ var jQueryPath = wym.computeJqueryPath().match(/^(.*)\/(.*)$/)[1];
+
+ // Make an array of the external JavaScript files required by the plugin.
+ var jQueryPlugins = [jQueryPath + '/ui.base.js',
+ jQueryPath + '/ui.resizable.js'];
+
+ // First get the jQuery UI base file
+ $.getScript(jQueryPlugins[0]);
+
+ // Get the jQuery UI resizeable plugin and then init the wymeditor resizable
+ // plugin. It is import to do the initialisation after loading the
+ // necessary jQuery UI files has finished, otherwise the "resizable" method
+ // would not be available.
+ $.getScript(jQueryPlugins[1], function() {
+ jQuery(wym._box).resizable(final_options);
+ });
+
+An alternative approach would be to use an AJAX queue when getting the script
+files to ensure that all jQuery files are loaded before the initialisation code
+of the plugin is executed. There is an `jQuery AJAX queue plugin`_ which does
+that.
+
+.. _jQuery AJAX queue plugin: http://plugins.jquery.com/project/ajaxqueue
+
+Changelog
+=========
+
+0.2
+---
+- Added full support for all jQuery UI resizable plugin options.
+- Refactored and documented code.
+- Now contains a packed version (775 bytes).
+
+0.1
+---
+- Initial release.
+
+.. _WYMeditor: http://www.wymeditor.org/
+.. _WYMeditor plugin page: http://trac.wymeditor.org/trac/wiki/0.4/Plugins
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/README b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/README
new file mode 100644
index 0000000..acc7ffd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/README
@@ -0,0 +1,19 @@
+WYMeditor : what you see is What You Mean web-based editor
+Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+Dual licensed under the MIT (MIT-license.txt)
+and GPL (GPL-license.txt) licenses.
+
+For further information visit:
+ http://www.wymeditor.org/
+
+File Name:
+ README - HTML Tidy plugin for WYMeditor
+
+File Authors:
+ Jean-François Hovinne (jf.hovinne a-t wymeditor dotorg)
+
+Credits:
+ 'HTML Tidy' by Dave Ragget - http://tidy.sourceforge.net/
+ Icon 'wand' by Mark James - http://famfamfam.com/
+
+WYMeditor documentation is available online at http://www.wymeditor.org/
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js
new file mode 100644
index 0000000..bf30c4c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js
@@ -0,0 +1,82 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.tidy.js
+ * HTML Tidy plugin for WYMeditor
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ */
+
+//Extend WYMeditor
+WYMeditor.editor.prototype.tidy = function(options) {
+ var tidy = new WymTidy(options, this);
+ return(tidy);
+};
+
+//WymTidy constructor
+function WymTidy(options, wym) {
+
+ options = jQuery.extend({
+
+ sUrl: wym._options.basePath + "plugins/tidy/tidy.php",
+ sButtonHtml: "<li class='wym_tools_tidy'>"
+ + "<a name='CleanUp' href='#'"
+ + " style='background-image:"
+ + " url(" + wym._options.basePath + "plugins/tidy/wand.png)'>"
+ + "Clean up HTML"
+ + "</a></li>",
+
+ sButtonSelector: "li.wym_tools_tidy a"
+
+ }, options);
+
+ this._options = options;
+ this._wym = wym;
+
+};
+
+//WymTidy initialization
+WymTidy.prototype.init = function() {
+
+ var tidy = this;
+
+ jQuery(this._wym._box).find(
+ this._wym._options.toolsSelector + this._wym._options.toolsListSelector)
+ .append(this._options.sButtonHtml);
+
+ //handle click event
+ jQuery(this._wym._box).find(this._options.sButtonSelector).click(function() {
+ tidy.cleanup();
+ return(false);
+ });
+
+};
+
+//WymTidy cleanup
+WymTidy.prototype.cleanup = function() {
+
+ var wym = this._wym;
+ var html = "<html><body>" + wym.xhtml() + "</body></html>";
+
+ jQuery.post(this._options.sUrl, { html: html}, function(data) {
+
+ if(data.length > 0 && data != '0') {
+ if(data.indexOf("<?php") == 0) {
+ wym.status("Ooops... Is PHP installed?");
+ } else {
+ wym.html(data);
+ wym.status("HTML has been cleaned up.");
+ }
+ } else {
+ wym.status("An error occurred.");
+ }
+ });
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/tidy.php b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/tidy.php
new file mode 100644
index 0000000..23b9bec
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/tidy.php
@@ -0,0 +1,36 @@
+<?php
+
+if (get_magic_quotes_gpc()) $html = stripslashes($_REQUEST['html']);
+else $html = $_REQUEST['html'];
+
+if(strlen($html) > 0) {
+
+ // Specify configuration
+ $config = array(
+ 'bare' => true,
+ 'clean' => true,
+ 'doctype' => 'strict',
+ 'drop-empty-paras' => true,
+ 'drop-font-tags' => true,
+ 'drop-proprietary-attributes' => true,
+ 'enclose-block-text' => true,
+ 'indent' => false,
+ 'join-classes' => true,
+ 'join-styles' => true,
+ 'logical-emphasis' => true,
+ 'output-xhtml' => true,
+ 'show-body-only' => true,
+ 'wrap' => 0);
+
+ // Tidy
+ $tidy = new tidy;
+ $tidy->parseString($html, $config, 'utf8');
+ $tidy->cleanRepair();
+
+ // Output
+ echo $tidy;
+} else {
+
+echo ('0');
+}
+?>
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/wand.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/wand.png
new file mode 100644
index 0000000..bb55eea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/plugins/tidy/wand.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/icons.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/icons.png
new file mode 100644
index 0000000..c6eb463
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/icons.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/skin.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/skin.css
new file mode 100644
index 0000000..4a6a0c6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/skin.css
@@ -0,0 +1,134 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * screen.css
+ * main stylesheet for the WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+*/
+
+/*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/
+ .wym_skin_compact p, .wym_skin_compact h2, .wym_skin_compact h3,
+ .wym_skin_compact ul, .wym_skin_compact li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; }
+
+
+/*HIDDEN BY DEFAULT*/
+ .wym_skin_compact .wym_area_left { display: none; }
+ .wym_skin_compact .wym_area_right { display: none; }
+
+
+/*TYPO*/
+ .wym_skin_compact { font-size: 10px; font-family: Verdana, Arial, sans-serif; }
+ .wym_skin_compact h2 { font-size: 110%; /* = 11px */}
+ .wym_skin_compact h3 { font-size: 100%; /* = 10px */}
+ .wym_skin_compact li { font-size: 100%; /* = 10px */}
+
+
+/*WYM_BOX*/
+ .wym_skin_compact { border: 1px solid gray; padding: 5px}
+
+ /*auto-clear the wym_box*/
+ .wym_skin_compact:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_compact { height: 1%;}
+
+
+/*WYM_HTML*/
+ .wym_skin_compact .wym_html { width: 98%;}
+ .wym_skin_compact .wym_html textarea { font-size: 120%; width: 100%; height: 200px; border: 1px solid gray; background: white; }
+
+
+/*WYM_IFRAME*/
+ .wym_skin_compact .wym_iframe { width: 98%;}
+ .wym_skin_compact .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white }
+
+
+/*AREAS*/
+ .wym_skin_compact .wym_area_left { width: 100px; float: left;}
+ .wym_skin_compact .wym_area_right { width: 150px; float: right;}
+ .wym_skin_compact .wym_area_bottom { height: 1%; clear: both;}
+ * html .wym_skin_compact .wym_area_main { height: 1%;}
+ * html .wym_skin_compact .wym_area_top { height: 1%;}
+ *+html .wym_skin_compact .wym_area_top { height: 1%;}
+
+/*SECTIONS SYSTEM*/
+
+ /*common defaults for all sections*/
+ .wym_skin_compact .wym_section { margin-bottom: 5px; }
+ .wym_skin_compact .wym_section h2,
+ .wym_skin_compact .wym_section h3 { padding: 1px 3px; margin: 0; }
+ .wym_skin_compact .wym_section a { padding: 0 3px; display: block; text-decoration: none; color: black; }
+ .wym_skin_compact .wym_section a:hover { background-color: yellow; }
+ /*hide section titles by default*/
+ .wym_skin_compact .wym_section h2 { display: none; }
+ /*disable any margin-collapse*/
+ .wym_skin_compact .wym_section { padding-top: 1px; padding-bottom: 1px; }
+ /*auto-clear sections*/
+ .wym_skin_compact .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_compact .wym_section ul { height: 1%;}
+
+ /*option: add this class to a section to make it render as a panel*/
+ .wym_skin_compact .wym_panel { }
+ .wym_skin_compact .wym_panel h2 { display: block; }
+
+ /*option: add this class to a section to make it render as a dropdown menu*/
+ .wym_skin_compact .wym_dropdown h2 { display: block; }
+ .wym_skin_compact .wym_dropdown ul { display: none; position: absolute; background: white; }
+ .wym_skin_compact .wym_dropdown:hover ul,
+ .wym_skin_compact .wym_dropdown.hover ul { display: block; }
+
+ /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/
+ .wym_skin_compact .wym_buttons li { float:left;}
+ .wym_skin_compact .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px }
+ /*image replacements*/
+ .wym_skin_compact .wym_buttons li a { background: url(icons.png) no-repeat; text-indent: -9999px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_strong a { background-position: 0 -382px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_emphasis a { background-position: 0 -22px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_superscript a { background-position: 0 -430px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_subscript a { background-position: 0 -454px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_indent a { background-position: 0 -574px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_outdent a { background-position: 0 -598px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_undo a { background-position: 0 -502px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_redo a { background-position: 0 -526px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_link a { background-position: 0 -96px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_image a { background-position: 0 -121px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_table a { background-position: 0 -144px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_html a { background-position: 0 -193px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;}
+
+/*DECORATION*/
+ .wym_skin_compact .wym_section h2 { background: #f0f0f0; border: solid gray; border-width: 0 0 1px;}
+ .wym_skin_compact .wym_section h2 span { color: gray;}
+ .wym_skin_compact .wym_panel { padding: 0; border: solid gray; border-width: 1px; background: white;}
+ .wym_skin_compact .wym_panel ul { margin: 2px 0 5px; }
+ .wym_skin_compact .wym_dropdown { padding: 0; border: solid gray; border-width: 1px 1px 0 1px; }
+ .wym_skin_compact .wym_dropdown ul { border: solid gray; border-width: 0 1px 1px 1px; margin-left: -1px; padding: 5px 10px 5px 3px;}
+
+/*DIALOGS*/
+ .wym_dialog div.row { margin-bottom: 5px;}
+ .wym_dialog div.row input { margin-right: 5px;}
+ .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; }
+ .wym_dialog div.row-indent { padding-left: 160px; }
+ /*autoclearing*/
+ .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ .wym_dialog div.row { display: inline-block; }
+ /* Hides from IE-mac \*/
+ * html .wym_dialog div.row { height: 1%; }
+ .wym_dialog div.row { display: block; }
+ /* End hide from IE-mac */
+
+/*WYMEDITOR_LINK*/
+ a.wym_wymeditor_link { text-indent: -9999px; float: right; display: block; width: 50px; height: 15px; background: url(../wymeditor_icon.png); overflow: hidden; text-decoration: none; }
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/skin.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/skin.js
new file mode 100644
index 0000000..cfb7cc1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/compact/skin.js
@@ -0,0 +1,35 @@
+WYMeditor.SKINS['compact'] = {
+
+ init: function(wym) {
+
+ //move the containers panel to the top area
+ jQuery(wym._options.containersSelector + ', '
+ + wym._options.classesSelector, wym._box)
+ .appendTo( jQuery("div.wym_area_top", wym._box) )
+ .addClass("wym_dropdown")
+ .css({"margin-right": "10px", "width": "120px", "float": "left"});
+
+ //render following sections as buttons
+ jQuery(wym._options.toolsSelector, wym._box)
+ .addClass("wym_buttons")
+ .css({"margin-right": "10px", "float": "left"});
+
+ //make hover work under IE < 7
+ jQuery(".wym_section", wym._box).hover(function(){
+ jQuery(this).addClass("hover");
+ },function(){
+ jQuery(this).removeClass("hover");
+ });
+
+ var postInit = wym._options.postInit;
+ wym._options.postInit = function(wym) {
+
+ if(postInit) postInit.call(wym, wym);
+ var rule = {
+ name: 'body',
+ css: 'background-color: #f0f0f0;'
+ };
+ wym.addCssRule( wym._doc.styleSheets[0], rule);
+ };
+ }
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/icons.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/icons.png
new file mode 100644
index 0000000..c6eb463
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/icons.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/skin.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/skin.css
new file mode 100644
index 0000000..eb4680f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/skin.css
@@ -0,0 +1,133 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * skin.css
+ * main stylesheet for the default WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+*/
+
+/*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/
+ .wym_skin_default p, .wym_skin_default h2, .wym_skin_default h3,
+ .wym_skin_default ul, .wym_skin_default li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; }
+
+
+/*HIDDEN BY DEFAULT*/
+ .wym_skin_default .wym_area_left { display: none; }
+ .wym_skin_default .wym_area_right { display: block; }
+
+
+/*TYPO*/
+ .wym_skin_default { font-size: 62.5%; font-family: Verdana, Arial, sans-serif; }
+ .wym_skin_default h2 { font-size: 110%; /* = 11px */}
+ .wym_skin_default h3 { font-size: 100%; /* = 10px */}
+ .wym_skin_default li { font-size: 100%; /* = 10px */}
+
+
+/*WYM_BOX*/
+ .wym_skin_default { border: 1px solid gray; background: #f2f2f2; padding: 5px}
+
+ /*auto-clear the wym_box*/
+ .wym_skin_default:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_default { height: 1%;}
+
+
+/*WYM_HTML*/
+ .wym_skin_default .wym_html { width: 98%;}
+ .wym_skin_default .wym_html textarea { width: 100%; height: 200px; border: 1px solid gray; background: white; }
+
+
+/*WYM_IFRAME*/
+ .wym_skin_default .wym_iframe { width: 98%;}
+ .wym_skin_default .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white }
+
+
+/*AREAS*/
+ .wym_skin_default .wym_area_left { width: 150px; float: left;}
+ .wym_skin_default .wym_area_right { width: 150px; float: right;}
+ .wym_skin_default .wym_area_bottom { height: 1%; clear: both;}
+ * html .wym_skin_default .wym_area_main { height: 1%;}
+ * html .wym_skin_default .wym_area_top { height: 1%;}
+ *+html .wym_skin_default .wym_area_top { height: 1%;}
+
+/*SECTIONS SYSTEM*/
+
+ /*common defaults for all sections*/
+ .wym_skin_default .wym_section { margin-bottom: 5px; }
+ .wym_skin_default .wym_section h2,
+ .wym_skin_default .wym_section h3 { padding: 1px 3px; margin: 0; }
+ .wym_skin_default .wym_section a { padding: 0 3px; display: block; text-decoration: none; color: black; }
+ .wym_skin_default .wym_section a:hover { background-color: yellow; }
+ /*hide section titles by default*/
+ .wym_skin_default .wym_section h2 { display: none; }
+ /*disable any margin-collapse*/
+ .wym_skin_default .wym_section { padding-top: 1px; padding-bottom: 1px; }
+ /*auto-clear sections*/
+ .wym_skin_default .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_default .wym_section ul { height: 1%;}
+
+ /*option: add this class to a section to make it render as a panel*/
+ .wym_skin_default .wym_panel { }
+ .wym_skin_default .wym_panel h2 { display: block; }
+
+ /*option: add this class to a section to make it render as a dropdown menu*/
+ .wym_skin_default .wym_dropdown h2 { display: block; }
+ .wym_skin_default .wym_dropdown ul { display: none; position: absolute; background: white; }
+ .wym_skin_default .wym_dropdown:hover ul,
+ .wym_skin_default .wym_dropdown.hover ul { display: block; }
+
+ /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/
+ .wym_skin_default .wym_buttons li { float:left;}
+ .wym_skin_default .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px }
+ /*image replacements*/
+ .wym_skin_default .wym_buttons li a { background: url(icons.png) no-repeat; text-indent: -9999px;}
+ .wym_skin_default .wym_buttons li.wym_tools_strong a { background-position: 0 -382px;}
+ .wym_skin_default .wym_buttons li.wym_tools_emphasis a { background-position: 0 -22px;}
+ .wym_skin_default .wym_buttons li.wym_tools_superscript a { background-position: 0 -430px;}
+ .wym_skin_default .wym_buttons li.wym_tools_subscript a { background-position: 0 -454px;}
+ .wym_skin_default .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;}
+ .wym_skin_default .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;}
+ .wym_skin_default .wym_buttons li.wym_tools_indent a { background-position: 0 -574px;}
+ .wym_skin_default .wym_buttons li.wym_tools_outdent a { background-position: 0 -598px;}
+ .wym_skin_default .wym_buttons li.wym_tools_undo a { background-position: 0 -502px;}
+ .wym_skin_default .wym_buttons li.wym_tools_redo a { background-position: 0 -526px;}
+ .wym_skin_default .wym_buttons li.wym_tools_link a { background-position: 0 -96px;}
+ .wym_skin_default .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;}
+ .wym_skin_default .wym_buttons li.wym_tools_image a { background-position: 0 -121px;}
+ .wym_skin_default .wym_buttons li.wym_tools_table a { background-position: 0 -144px;}
+ .wym_skin_default .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;}
+ .wym_skin_default .wym_buttons li.wym_tools_html a { background-position: 0 -193px;}
+ .wym_skin_default .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;}
+
+/*DECORATION*/
+ .wym_skin_default .wym_section h2 { background: #ddd; border: solid gray; border-width: 0 0 1px;}
+ .wym_skin_default .wym_section h2 span { color: gray;}
+ .wym_skin_default .wym_panel { padding: 0; border: solid gray; border-width: 1px; background: white;}
+ .wym_skin_default .wym_panel ul { margin: 2px 0 5px; }
+ .wym_skin_default .wym_dropdown { padding: 0; border: solid gray; border-width: 1px 1px 0 1px; }
+ .wym_skin_default .wym_dropdown ul { border: solid gray; border-width: 0 1px 1px 1px; margin-left: -1px; padding: 5px 10px 5px 3px;}
+
+/*DIALOGS*/
+ .wym_dialog div.row { margin-bottom: 5px;}
+ .wym_dialog div.row input { margin-right: 5px;}
+ .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; }
+ .wym_dialog div.row-indent { padding-left: 160px; }
+ /*autoclearing*/
+ .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ .wym_dialog div.row { display: inline-block; }
+ /* Hides from IE-mac \*/
+ * html .wym_dialog div.row { height: 1%; }
+ .wym_dialog div.row { display: block; }
+ /* End hide from IE-mac */
+
+/*WYMEDITOR_LINK*/
+ a.wym_wymeditor_link { text-indent: -9999px; float: right; display: block; width: 50px; height: 15px; background: url(../wymeditor_icon.png); overflow: hidden; text-decoration: none; }
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/skin.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/skin.js
new file mode 100644
index 0000000..3d204e0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/default/skin.js
@@ -0,0 +1,40 @@
+WYMeditor.SKINS['default'] = {
+
+ init: function(wym) {
+
+ //render following sections as panels
+ jQuery(wym._box).find(wym._options.classesSelector)
+ .addClass("wym_panel");
+
+ //render following sections as buttons
+ jQuery(wym._box).find(wym._options.toolsSelector)
+ .addClass("wym_buttons");
+
+ //render following sections as dropdown menus
+ jQuery(wym._box).find(wym._options.containersSelector)
+ .addClass("wym_dropdown")
+ .find(WYMeditor.H2)
+ .append("<span>&#160;&gt;</span>");
+
+ // auto add some margin to the main area sides if left area
+ // or right area are not empty (if they contain sections)
+ jQuery(wym._box).find("div.wym_area_right ul")
+ .parents("div.wym_area_right").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-right": "155px"});
+
+ jQuery(wym._box).find("div.wym_area_left ul")
+ .parents("div.wym_area_left").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-left": "155px"});
+
+ //make hover work under IE < 7
+ jQuery(wym._box).find(".wym_section").hover(function(){
+ jQuery(this).addClass("hover");
+ },function(){
+ jQuery(this).removeClass("hover");
+ });
+ }
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/icons.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/icons.png
new file mode 100644
index 0000000..0e04964
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/icons.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/skin.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/skin.css
new file mode 100644
index 0000000..6ae3772
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/skin.css
@@ -0,0 +1,136 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2008 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * skin.css
+ * main stylesheet for the django WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+ * Jannis Leidel (jannis@leidel.info)
+*/
+
+/*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/
+ .wym_skin_django p, .wym_skin_django h2, .wym_skin_django h3,
+ .wym_skin_django ul, .wym_skin_django li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; }
+
+
+/*HIDDEN BY DEFAULT*/
+ .wym_skin_django .wym_area_left { display: none; }
+ .wym_skin_django .wym_area_right { display: block; }
+
+
+/*TYPO*/
+ .wym_skin_django { font-size: 62,5%; font-family: "Lucida Grande", "DejaVu Sans", "Bitstream Vera Sans", Verdana, Arial, sans-serif }
+ .wym_skin_django h2 { font-size: 110%; /* = 11px */}
+ .wym_skin_django h3 { font-size: 100%; /* = 10px */}
+ .wym_skin_django li { font-size: 100%; /* = 10px */}
+
+
+/*WYM_BOX*/
+ .wym_skin_django { border: 0px; background: none; padding: 10px}
+
+ /*auto-clear the wym_box*/
+ .wym_skin_django:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_django { height: 1%;}
+
+
+/*WYM_HTML*/
+ .wym_skin_django .wym_html { width: 98%;}
+ .wym_skin_django .wym_html textarea { width: 100%; height: 235px; border: 1px solid #ccc; background: white; }
+
+
+/*WYM_IFRAME*/
+ .wym_skin_django .wym_iframe { width: 98%;}
+ .wym_skin_django .wym_iframe iframe { width: 100%; height: 235px; border: 1px solid #ccc; background: white }
+
+
+/*AREAS*/
+ .wym_skin_django .wym_area_left { width: 150px; float: left;}
+ .wym_skin_django .wym_area_right { width: 150px; float: right;}
+ .wym_skin_django .wym_area_bottom { clear: both; display: none;}
+ * html .wym_skin_django .wym_area_main { height: 1%;}
+ * html .wym_skin_django .wym_area_top { height: 1%;}
+ *+html .wym_skin_django .wym_area_top { height: 1%;}
+
+/*SECTIONS SYSTEM*/
+
+ /*common defaults for all sections*/
+ .wym_skin_django .wym_section { margin-bottom: 5px; }
+ .wym_skin_django .wym_section h2,
+ .wym_skin_django .wym_section h3 { padding: 1px 3px; margin: 0; color:#333; }
+ .wym_skin_django .wym_section a { padding: 0 3px; display: block; text-decoration: none; color: black; }
+ .wym_skin_django .wym_section a:hover { background-color: #eaeaea; }
+ /*hide section titles by default*/
+ .wym_skin_django .wym_section h2 { display: none; }
+ /*disable any margin-collapse*/
+ .wym_skin_django .wym_section { padding-top: 1px; padding-bottom: 1px; }
+ /*auto-clear sections*/
+ .wym_skin_django .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_django .wym_section ul { height: 1%;}
+
+ /*option: add this class to a section to make it render as a panel*/
+ .wym_skin_django .wym_panel { }
+ .wym_skin_django .wym_panel h2 { display: block; }
+
+ /*option: add this class to a section to make it render as a dropdown menu*/
+ .wym_skin_django .wym_dropdown h2 { display: block; }
+ .wym_skin_django .wym_dropdown ul { display: none; position: absolute; background: white; }
+ .wym_skin_django .wym_dropdown:hover ul,
+ .wym_skin_django .wym_dropdown.hover ul { display: block; }
+
+ .wym_skin_django .wym_tools ul { padding-left: 0px !important; margin-left: 0px; }
+
+ /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/
+ .wym_skin_django .wym_buttons li { float:left;}
+ .wym_skin_django .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px }
+ /*image replacements*/
+ .wym_skin_django .wym_buttons li a { background: url(icons.png) no-repeat; text-indent: -9999px;}
+ .wym_skin_django .wym_buttons li.wym_tools_strong a { background-position: 0 -382px;}
+ .wym_skin_django .wym_buttons li.wym_tools_emphasis a { background-position: 0 -22px;}
+ .wym_skin_django .wym_buttons li.wym_tools_superscript a { background-position: 0 -430px;}
+ .wym_skin_django .wym_buttons li.wym_tools_subscript a { background-position: 0 -454px;}
+ .wym_skin_django .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;}
+ .wym_skin_django .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;}
+ .wym_skin_django .wym_buttons li.wym_tools_indent a { background-position: 0 -574px;}
+ .wym_skin_django .wym_buttons li.wym_tools_outdent a { background-position: 0 -598px;}
+ .wym_skin_django .wym_buttons li.wym_tools_undo a { background-position: 0 -502px;}
+ .wym_skin_django .wym_buttons li.wym_tools_redo a { background-position: 0 -526px;}
+ .wym_skin_django .wym_buttons li.wym_tools_link a { background-position: 0 -96px;}
+ .wym_skin_django .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;}
+ .wym_skin_django .wym_buttons li.wym_tools_image a { background-position: 0 -121px;}
+ .wym_skin_django .wym_buttons li.wym_tools_table a { background-position: 0 -144px;}
+ .wym_skin_django .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;}
+ .wym_skin_django .wym_buttons li.wym_tools_html a { background-position: 0 -193px;}
+ .wym_skin_django .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;}
+
+/*DECORATION*/
+ .wym_skin_django .wym_section h2 { background: #fff;}
+ .wym_skin_django .wym_section h2 span { color: gray;}
+ .wym_skin_django .wym_panel { padding: 0; background: white;}
+ .wym_skin_django .wym_panel ul { margin: 2px 0 5px; }
+ .wym_skin_django .wym_dropdown { padding: 0; border: solid gray; border-width: 1px 1px 0 1px; }
+ .wym_skin_django .wym_dropdown ul { border: solid gray; border-width: 0 1px 1px 1px; margin-left: -1px; padding: 5px 10px 5px 3px;}
+
+/*DIALOGS*/
+ .wym_dialog div.row { margin-bottom: 5px;}
+ .wym_dialog div.row input { margin-right: 5px;}
+ .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; }
+ .wym_dialog div.row-indent { padding-left: 160px; }
+ /*autoclearing*/
+ .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ .wym_dialog div.row { display: inline-block; }
+ /* Hides from IE-mac \*/
+ * html .wym_dialog div.row { height: 1%; }
+ .wym_dialog div.row { display: block; }
+ /* End hide from IE-mac */
+
+/*WYMEDITOR_LINK*/
+ a.wym_wymeditor_link { text-indent: -9999px; float: right; display: block; width: 50px; height: 15px; background: url(../wymeditor_icon.png); overflow: hidden; text-decoration: none; }
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/skin.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/skin.js
new file mode 100644
index 0000000..47597e6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/django/skin.js
@@ -0,0 +1,42 @@
+WYMeditor.SKINS['django'] = {
+
+ init: function(wym) {
+
+ //render following sections as panels
+ jQuery(wym._box).find(wym._options.classesSelector)
+ .addClass("wym_panel");
+
+ //render following sections as buttons
+ jQuery(wym._box).find(wym._options.toolsSelector)
+ .addClass("wym_buttons");
+
+ //render following sections as dropdown menus
+ jQuery(wym._box).find(wym._options.containersSelector)
+ .addClass("wym_panel")
+ .find(WYMeditor.H2);
+
+ //replace the status markup in h2
+ wym.status('&nbsp;');
+
+ // auto add some margin to the main area sides if left area
+ // or right area are not empty (if they contain sections)
+ jQuery(wym._box).find("div.wym_area_right ul")
+ .parents("div.wym_area_right").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-right": "155px"});
+
+ jQuery(wym._box).find("div.wym_area_left ul")
+ .parents("div.wym_area_left").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-left": "155px"});
+
+ //make hover work under IE < 7
+ jQuery(wym._box).find(".wym_section").hover(function(){
+ jQuery(this).addClass("hover");
+ },function(){
+ jQuery(this).removeClass("hover");
+ });
+ }
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.header.gif b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.header.gif
new file mode 100644
index 0000000..b2d2907
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.header.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.selector.silver.gif b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.selector.silver.gif
new file mode 100644
index 0000000..e65976b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.selector.silver.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.wymeditor.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.wymeditor.png
new file mode 100644
index 0000000..1e84813
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/bg.wymeditor.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/icons.silver.gif b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/icons.silver.gif
new file mode 100644
index 0000000..8c6a4fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/images/icons.silver.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/skin.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/skin.css
new file mode 100644
index 0000000..cea8d84
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/skin.css
@@ -0,0 +1,131 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * skin.css
+ * main stylesheet for the minimal WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne
+ * Scott Lewis (see Silver skin)
+*/
+
+/* Set iframe */
+.wym_skin_minimal div.wym_iframe iframe {
+ width: 90%;
+ height: 200px;
+}
+
+/* Hide h2 by default */
+.wym_skin_minimal h2 {
+ display: none;
+}
+
+/* Show specific h2 */
+.wym_skin_minimal div.wym_tools h2,
+.wym_skin_minimal div.wym_containers h2,
+.wym_skin_minimal div.wym_classes h2 {
+ display: block;
+}
+
+.wym_skin_minimal div.wym_section ul {
+ margin: 0;
+}
+
+.wym_skin_minimal div.wym_section ul li {
+ float: left;
+ list-style-type: none;
+ margin-right: 5px;
+}
+
+.wym_skin_minimal div.wym_area_top,
+.wym_skin_minimal div.wym_area_right,
+.wym_skin_minimal div.wym_containers,
+.wym_skin_minimal div.wym_classes {
+ float: left;
+}
+
+.wym_skin_minimal div.wym_area_main {
+ clear: both;
+}
+
+.wym_skin_minimal div.wym_html {
+ width: 90%;
+}
+
+.wym_skin_minimal textarea.wym_html_val {
+ width: 100%;
+ height: 100px;
+}
+
+/* DROPDOWNS (see Silver skin) */
+.wym_skin_minimal div.wym_dropdown {
+ cursor: pointer;
+ margin: 0px 4px 10px 0px;
+ padding: 0px;
+ z-index: 1001;
+ display: block;
+}
+
+.wym_skin_minimal div.wym_dropdown ul {
+ display: none;
+ width: 124px;
+ padding: 0px;
+ margin: 0px;
+ list-style-type: none;
+ list-style-image: none;
+ z-index: 1002;
+ position: absolute;
+ border-top: 1px solid #AAA;
+}
+
+.wym_skin_minimal div.wym_dropdown ul li {
+ width: 146px;
+ height: 20px;
+ padding: 0px;
+ margin: 0px;
+ border: 1px solid #777;
+ border-top: none;
+ background: #EEE;
+ list-style-image: none;
+}
+
+.wym_skin_minimal div.wym_dropdown h2 {
+ width: 138px;
+ height: 16px;
+ color: #000;
+ background-image: url(images/bg.selector.silver.gif);
+ background-position: 0px -18px;
+ background-repeat: no-repeat;
+ border: none;
+ font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif;
+ font-size: 12px;
+ font-weight: bold;
+ padding: 2px 0px 0px 10px;
+ margin: 0px;
+}
+
+.wym_skin_minimal div.wym_dropdown a {
+ text-decoration: none;
+ font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif;
+ font-size: 12px;
+ padding: 5px 0px 0px 10px;
+ display: block;
+ width: 136px;
+ height: 15px;
+ color: #000;
+ text-align: left;
+ margin-left: 0px;
+}
+
+.wym_skin_minimal div.wym_dropdown a:hover {
+ background: #BBB;
+ border-bottom: none;
+}
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/skin.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/skin.js
new file mode 100644
index 0000000..af29ed4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/minimal/skin.js
@@ -0,0 +1,30 @@
+jQuery.fn.selectify = function() {
+ return this.each(function() {
+ jQuery(this).hover(
+ function() {
+ jQuery("h2", this).css("background-position", "0px -18px");
+ jQuery("ul", this).fadeIn("fast");
+ },
+ function() {
+ jQuery("h2", this).css("background-position", "");
+ jQuery("ul", this).fadeOut("fast");
+ }
+ );
+ });
+};
+
+WYMeditor.SKINS['minimal'] = {
+ //placeholder for the skin JS, if needed
+
+ //init the skin
+ //wym is the WYMeditor.editor instance
+ init: function(wym) {
+
+ //render following sections as dropdown menus
+ jQuery(wym._box).find(wym._options.toolsSelector + ', ' + wym._options.containersSelector + ', ' + wym._options.classesSelector)
+ .addClass("wym_dropdown")
+ .selectify();
+
+
+ }
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/COPYING b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/README b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/README
new file mode 100644
index 0000000..130dc46
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/README
@@ -0,0 +1,27 @@
+/**
+* @version Alpha 0.1 2008-05-10 23:28:43 $
+* @package Silver skin for WYMeditor
+* @copyright Copyright (C) 2008 Scott Edwin Lewis. All rights reserved.
+* @license GNU/GPL, see COPYING
+* Silver skin for WYMeditor is free software and is licensed under the
+* GNU General Public License. See COPYING for copyright notices and details.
+*/
+
+Adds custom buttons and color palette to the WYMeditor XHTML Editor.
+
+INSTALLATION:
+
+1. Copy the entire /silver/ directory to /wymeditor/skins/
+2. Initialize the WYMeditor 'skin' option as below:
+
+<script type="text/javascript">
+jQuery(function() {
+
+ jQuery('.wymeditor').wymeditor({
+ skin: 'silver'
+ });
+
+});
+</script>
+
+That's it. You're done.
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.header.gif b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.header.gif
new file mode 100644
index 0000000..b2d2907
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.header.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.selector.silver.gif b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.selector.silver.gif
new file mode 100644
index 0000000..e65976b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.selector.silver.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.wymeditor.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.wymeditor.png
new file mode 100644
index 0000000..1e84813
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/bg.wymeditor.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/icons.silver.gif b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/icons.silver.gif
new file mode 100644
index 0000000..8c6a4fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/images/icons.silver.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/skin.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/skin.css
new file mode 100644
index 0000000..8284d81
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/skin.css
@@ -0,0 +1,297 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * screen.css
+ * main stylesheet for the default WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+ * Scott Edwin Lewis
+*/
+
+/*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/
+ .wym_skin_silver p, .wym_skin_silver h2, .wym_skin_silver h3,
+ .wym_skin_silver ul, .wym_skin_silver li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; }
+
+
+/*HIDDEN BY DEFAULT*/
+ .wym_skin_silver .wym_area_left { display: none; }
+ .wym_skin_silver .wym_area_right { display: block; }
+
+
+/*TYPO*/
+ .wym_skin_silver { font-size: 62.5%; font-family: Verdana, Arial, sans-serif; }
+ .wym_skin_silver h2 { font-size: 110%; /* = 11px */}
+ .wym_skin_silver h3 { font-size: 100%; /* = 10px */}
+ .wym_skin_silver li { font-size: 100%; /* = 10px */}
+
+
+/*WYM_BOX*/
+ .wym_skin_silver { border: 1px solid gray; background: #f2f2f2; padding: 0px; margin: 0px;}
+
+ /*auto-clear the wym_box*/
+ .wym_skin_silver:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_silver { height: 1%;}
+
+
+/*WYM_HTML*/
+ .wym_skin_silver .wym_html { width: 98%;}
+ .wym_skin_silver .wym_html textarea { width: 100%; height: 200px; border: 1px solid gray; background: white; }
+
+
+/*WYM_IFRAME*/
+ .wym_skin_silver .wym_iframe { width: 98%;}
+ .wym_skin_silver .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white }
+
+
+/*AREAS*/
+ .wym_skin_silver .wym_area_left { width: 150px; float: left;}
+ .wym_skin_silver .wym_area_right { width: 150px; float: right;}
+ .wym_skin_silver .wym_area_bottom { height: 1%; clear: both;}
+ * html .wym_skin_silver .wym_area_main { height: 1%;}
+ * html .wym_skin_silver .wym_area_top { height: 1%;}
+ *+html .wym_skin_silver .wym_area_top { height: 1%;}
+
+/*SECTIONS SYSTEM*/
+
+ /*common defaults for all sections*/
+ .wym_skin_silver .wym_section { margin-bottom: 5px; }
+ .wym_skin_silver .wym_section h2,
+ .wym_skin_silver .wym_section h3 { padding: 1px 3px; margin: 0; cursor: pointer; }
+ .wym_skin_silver .wym_section a { padding: 5px 0px 0px 10px; display: block; text-decoration: none; color: black; }
+ .wym_skin_silver .wym_section a:hover { /*background-color: #DDD;*/}
+ /*hide section titles by default*/
+ .wym_skin_silver .wym_section h2 { display: none; }
+ /*disable any margin-collapse*/
+ .wym_skin_silver .wym_section { padding-top: 1px; padding-bottom: 1px; }
+ /*auto-clear sections*/
+ .wym_skin_silver .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; padding: 0px; }
+ * html .wym_skin_silver .wym_section ul { height: 1%;}
+ .wym_skin_silver .wym_section li {}
+
+ /*option: add this class to a section to make it render as a panel*/
+ .wym_skin_silver .wym_panel { }
+ .wym_skin_silver .wym_panel h2 { display: block; font-size: 11px; }
+
+ /*option: add this class to a section to make it render as a dropdown menu*/
+ .wym_skin_silver .wym_dropdown h2 { display: block; font-size: 11px;}
+ .wym_skin_silver .wym_dropdown ul { position: absolute; background: white; padding: 0px;}
+ .wym_skin_silver .wym_dropdown:hover ul,
+ .wym_skin_silver .wym_dropdown.hover ul { cursor: pointer;}
+ .wym_skin_silver .wym_dropdown ul li a {/*border-bottom: 1px solid #AAA;*/}
+
+ /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/
+ .wym_skin_silver .wym_buttons li { float:left;}
+ .wym_skin_silver .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px; text-decoration: none !important; border: 1px solid #666; }
+ .wym_skin_silver .wym_buttons a:hover { text-decoration: none !important; border: 1px solid #000;}
+ /*image replacements*/
+ .wym_skin_silver .wym_buttons li a { background: url(images/icons.silver.gif) no-repeat; text-indent: -9999px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_strong a { background-position: 0 -384px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_emphasis a { background-position: 0 -24px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_superscript a { background-position: 0 -432px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_subscript a { background-position: 0 -456px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_indent a { background-position: 0 -600px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_outdent a { background-position: 0 -624px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_undo a { background-position: 0 -504px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_redo a { background-position: 0 -528px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_link a { background-position: 0 -96px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_image a { background-position: 0 -120px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_table a { background-position: 0 -144px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_html a { background-position: 0 -192px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_gadget a { background-position: 0 -576px;}
+
+ .wym_skin_silver .wym_buttons li.wym_tools_strong a:hover { background-position: -24px -384px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_emphasis a:hover { background-position: -24px -24px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_superscript a:hover { background-position: -24px -432px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_subscript a:hover { background-position: -24px -456px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_ordered_list a:hover { background-position: -24px -48px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_unordered_list a:hover{ background-position: -24px -72px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_indent a:hover { background-position: -24px -600px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_outdent a:hover { background-position: -24px -624px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_undo a:hover { background-position: -24px -504px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_redo a:hover { background-position: -24px -528px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_link a:hover { background-position: -24px -96px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_unlink a:hover { background-position: -24px -168px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_image a:hover { background-position: -24px -120px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_table a:hover { background-position: -24px -144px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_paste a:hover { background-position: -24px -552px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_html a:hover { background-position: -24px -192px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_preview a:hover { background-position: -24px -408px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_gadget a:hover { background-position: -24px -576px;}
+
+/*DECORATION*/
+ .wym_skin_silver .wym_section h2 { background: #ddd; border: none;}
+ .wym_skin_silver .wym_section h2 span { color: gray;}
+ .wym_skin_silver .wym_panel { padding: 0; border: solid gray; border-width: 0px;}
+ .wym_skin_silver .wym_panel ul { margin: 2px 0 5px; }
+ .wym_skin_silver .wym_dropdown { padding: 0; border: none; }
+ .wym_skin_silver .wym_dropdown ul { border: none; margin-left: -1px; padding: 0px;}
+
+/*DIALOGS*/
+ .wym_dialog div.row { margin-bottom: 5px;}
+ .wym_dialog div.row input { margin-right: 5px;}
+ .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; }
+ .wym_dialog div.row-indent { padding-left: 160px; }
+ /*autoclearing*/
+ .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ .wym_dialog div.row { display: inline-block; }
+ /* Hides from IE-mac \*/
+ * html .wym_dialog div.row { height: 1%; }
+ .wym_dialog div.row { display: block; }
+ /* End hide from IE-mac */
+
+/*WYMEDITOR_LINK*/
+ a.wym_wymeditor_link
+ {
+ text-indent: -9999px;
+ float: right;
+ display: block;
+ width: 50px;
+ height: 15px;
+ background: url(../wymeditor_icon.png);
+ background-position: 1px 1px;
+ background-repeat: no-repeat;
+ overflow: hidden;
+ text-decoration: none;
+ padding: 1px !important;
+ border: 1px solid #333 !important;
+ background-color: #FFF !important;
+ }
+
+.wym_box
+{
+ padding: 0px !important;
+ margin: 0px;
+}
+.wym_inner
+{
+ border-left: 1px solid #FFF;
+ border-top: 1px solid #FFF;
+ border-right: 1px solid #FFF;
+ border-bottom: 1px solid #FFF;
+ padding: 5px;
+ background-color: #B8C1C4;
+ height: auto;
+}
+
+.clear {clear: both;}
+
+div.wym_dropdown
+{
+ cursor: pointer;
+ width: 138px !important;
+ margin: 0px 4px 10px 0px !important;
+ padding: 0px;
+ z-index: 1001;
+ display: block;
+ border: 1px solid red;
+}
+
+div.wym_dropdown ul
+{
+ display: none;
+ width: 124px;
+ padding: 0px !important;
+ margin: 0px !important;
+ list-style-type: none;
+ list-style-image: none;
+ z-index: 1002;
+ position: absolute;
+ border-top: 1px solid #AAA;
+}
+
+div.wym_dropdown ul li
+{
+ width: 146px;
+ height: 20px;
+ padding: 0px !important;
+ margin: 0px;
+ border: 1px solid #777;
+ border-top: none;
+ background: #DDD;
+ list-style-image: none;
+}
+
+div.wym_dropdown h2
+{
+ width: 138px;
+ height: 16px;
+ color: #000 !important;
+ background-image: url(images/bg.selector.silver.gif) !important;
+ background-position: 0px -18px;
+ background-repeat: no-repeat;
+ border: none;
+ font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif;
+ font-size: 12px !important;
+ font-weight: bold !important;
+ padding: 2px 0px 0px 10px !important;
+ margin: 0px !important;
+}
+
+.wym_skin_silver .wym_panel h2
+{
+ width: 138px;
+ height: 16px;
+ color: #000 !important;
+ background-image: url(images/bg.header.gif) !important;
+ background-position: 0px 0px;
+ background-repeat: no-repeat;
+ border: none;
+ font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif;
+ font-size: 12px !important;
+ font-weight: bold !important;
+ padding: 2px 0px 0px 10px !important;
+ margin: 0px !important;
+}
+
+.wym_skin_silver .wym_panel ul
+{
+ margin-top: 0px !important;
+}
+
+.wym_skin_silver .wym_panel ul li
+{
+ width: 146px;
+ height: 20px;
+ padding: 0px !important;
+ margin: 0px;
+ border: 1px solid #777;
+ border-top: none;
+ background: #DDD;
+ list-style-image: none;
+}
+
+.wym_skin_silver .wym_panel a,
+div.wym_dropdown a
+{
+ text-decoration: none;
+ font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif;
+ font-size: 12px;
+ padding: 5px 0px 0px 10px !important;
+ display: block;
+ width: 136px;
+ height: 15px;
+ color: #000;
+ text-align: left !important;
+ margin-left: 0px !important;
+}
+
+div.wym_dropdown a:hover,
+.wym_skin_silver .wym_panel a:hover
+{
+ background: #BBB;
+ border-bottom: none !important;
+}
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/skin.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/skin.js
new file mode 100644
index 0000000..948ed91
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/silver/skin.js
@@ -0,0 +1,61 @@
+/* This file is part of the Silver skin for WYMeditor by Scott Edwin Lewis */
+
+jQuery.fn.selectify = function() {
+ return this.each(function() {
+ jQuery(this).hover(
+ function() {
+ jQuery("h2", this).css("background-position", "0px -18px");
+ jQuery("ul", this).fadeIn("fast");
+ },
+ function() {
+ jQuery("h2", this).css("background-position", "");
+ jQuery("ul", this).fadeOut("fast");
+ }
+ );
+ });
+};
+
+WYMeditor.SKINS['silver'] = {
+
+ init: function(wym) {
+
+ //add some elements to improve the rendering
+ jQuery(wym._box)
+ .append('<div class="clear"></div>')
+ .wrapInner('<div class="wym_inner"></div>');
+
+ //render following sections as panels
+ jQuery(wym._box).find(wym._options.classesSelector)
+ .addClass("wym_panel");
+
+ //render following sections as buttons
+ jQuery(wym._box).find(wym._options.toolsSelector)
+ .addClass("wym_buttons");
+
+ //render following sections as dropdown menus
+ jQuery(wym._box).find(wym._options.containersSelector)
+ .addClass("wym_dropdown")
+ .selectify();
+
+ // auto add some margin to the main area sides if left area
+ // or right area are not empty (if they contain sections)
+ jQuery(wym._box).find("div.wym_area_right ul")
+ .parents("div.wym_area_right").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-right": "155px"});
+
+ jQuery(wym._box).find("div.wym_area_left ul")
+ .parents("div.wym_area_left").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-left": "155px"});
+
+ //make hover work under IE < 7
+ jQuery(wym._box).find(".wym_section").hover(function(){
+ jQuery(this).addClass("hover");
+ },function(){
+ jQuery(this).removeClass("hover");
+ });
+ }
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/icons.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/icons.png
new file mode 100644
index 0000000..c6eb463
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/icons.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/skin.css b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/skin.css
new file mode 100644
index 0000000..7e6b8fd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/skin.css
@@ -0,0 +1,134 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * screen.css
+ * main stylesheet for the WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+ * Jean-Francois Hovinne
+*/
+
+/*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/
+ .wym_skin_twopanels p, .wym_skin_twopanels h2, .wym_skin_twopanels h3,
+ .wym_skin_twopanels ul, .wym_skin_twopanels li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; }
+
+
+/*HIDDEN BY DEFAULT*/
+ .wym_skin_twopanels .wym_area_left { display: block; }
+ .wym_skin_twopanels .wym_area_right { display: block; }
+
+
+/*TYPO*/
+ .wym_skin_twopanels { font-size: 62.5%; font-family: Verdana, Arial, sans-serif; }
+ .wym_skin_twopanels h2 { font-size: 110%; /* = 11px */}
+ .wym_skin_twopanels h3 { font-size: 100%; /* = 10px */}
+ .wym_skin_twopanels li { font-size: 100%; /* = 10px */}
+
+
+/*WYM_BOX*/
+ .wym_skin_twopanels { border: 1px solid gray; background: #f2f2f2; padding: 5px}
+
+ /*auto-clear the wym_box*/
+ .wym_skin_twopanels:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_twopanels { height: 1%;}
+
+
+/*WYM_HTML*/
+ .wym_skin_twopanels .wym_html { width: 98%;}
+ .wym_skin_twopanels .wym_html textarea { width: 100%; height: 200px; border: 1px solid gray; background: white; }
+
+
+/*WYM_IFRAME*/
+ .wym_skin_twopanels .wym_iframe { width: 98%;}
+ .wym_skin_twopanels .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white }
+
+
+/*AREAS*/
+ .wym_skin_twopanels .wym_area_left { width: 100px; float: left;}
+ .wym_skin_twopanels .wym_area_right { width: 150px; float: right;}
+ .wym_skin_twopanels .wym_area_bottom { height: 1%; clear: both;}
+ * html .wym_skin_twopanels .wym_area_main { height: 1%;}
+ * html .wym_skin_twopanels .wym_area_top { height: 1%;}
+ *+html .wym_skin_twopanels .wym_area_top { height: 1%;}
+
+/*SECTIONS SYSTEM*/
+
+ /*common defaults for all sections*/
+ .wym_skin_twopanels .wym_section { margin-bottom: 5px; }
+ .wym_skin_twopanels .wym_section h2,
+ .wym_skin_twopanels .wym_section h3 { padding: 1px 3px; margin: 0; }
+ .wym_skin_twopanels .wym_section a { padding: 0 3px; display: block; text-decoration: none; color: black; }
+ .wym_skin_twopanels .wym_section a:hover { background-color: yellow; }
+ /*hide section titles by default*/
+ .wym_skin_twopanels .wym_section h2 { display: none; }
+ /*disable any margin-collapse*/
+ .wym_skin_twopanels .wym_section { padding-top: 1px; padding-bottom: 1px; }
+ /*auto-clear sections*/
+ .wym_skin_twopanels .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_twopanels .wym_section ul { height: 1%;}
+
+ /*option: add this class to a section to make it render as a panel*/
+ .wym_skin_twopanels .wym_panel { }
+ .wym_skin_twopanels .wym_panel h2 { display: block; }
+
+ /*option: add this class to a section to make it render as a dropdown menu*/
+ .wym_skin_twopanels .wym_dropdown h2 { display: block; }
+ .wym_skin_twopanels .wym_dropdown ul { display: none; position: absolute; background: white; }
+ .wym_skin_twopanels .wym_dropdown:hover ul,
+ .wym_skin_twopanels .wym_dropdown.hover ul { display: block; }
+
+ /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/
+ .wym_skin_twopanels .wym_buttons li { float:left;}
+ .wym_skin_twopanels .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px }
+ /*image replacements*/
+ .wym_skin_twopanels .wym_buttons li a { background: url(icons.png) no-repeat; text-indent: -9999px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_strong a { background-position: 0 -382px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_emphasis a { background-position: 0 -22px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_superscript a { background-position: 0 -430px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_subscript a { background-position: 0 -454px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_indent a { background-position: 0 -574px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_outdent a { background-position: 0 -598px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_undo a { background-position: 0 -502px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_redo a { background-position: 0 -526px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_link a { background-position: 0 -96px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_image a { background-position: 0 -121px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_table a { background-position: 0 -144px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_html a { background-position: 0 -193px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;}
+
+/*DECORATION*/
+ .wym_skin_twopanels .wym_section h2 { background: #ddd; border: solid gray; border-width: 0 0 1px;}
+ .wym_skin_twopanels .wym_section h2 span { color: gray;}
+ .wym_skin_twopanels .wym_panel { padding: 0; border: solid gray; border-width: 1px; background: white;}
+ .wym_skin_twopanels .wym_panel ul { margin: 2px 0 5px; }
+ .wym_skin_twopanels .wym_dropdown { padding: 0; border: solid gray; border-width: 1px 1px 0 1px; }
+ .wym_skin_twopanels .wym_dropdown ul { border: solid gray; border-width: 0 1px 1px 1px; margin-left: -1px; padding: 5px 10px 5px 3px;}
+
+/*DIALOGS*/
+ .wym_dialog div.row { margin-bottom: 5px;}
+ .wym_dialog div.row input { margin-right: 5px;}
+ .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; }
+ .wym_dialog div.row-indent { padding-left: 160px; }
+ /*autoclearing*/
+ .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ .wym_dialog div.row { display: inline-block; }
+ /* Hides from IE-mac \*/
+ * html .wym_dialog div.row { height: 1%; }
+ .wym_dialog div.row { display: block; }
+ /* End hide from IE-mac */
+
+/*WYMEDITOR_LINK*/
+ a.wym_wymeditor_link { text-indent: -9999px; float: right; display: block; width: 50px; height: 15px; background: url(../wymeditor_icon.png); overflow: hidden; text-decoration: none; }
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/skin.js b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/skin.js
new file mode 100644
index 0000000..e82efc5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/twopanels/skin.js
@@ -0,0 +1,39 @@
+WYMeditor.SKINS['twopanels'] = {
+
+ init: function(wym) {
+
+ //move the containers panel to the left area
+ jQuery(wym._box).find(wym._options.containersSelector)
+ .appendTo("div.wym_area_left");
+
+ //render following sections as panels
+ jQuery(wym._box).find(wym._options.classesSelector + ', '
+ + wym._options.containersSelector)
+ .addClass("wym_panel");
+
+ //render following sections as buttons
+ jQuery(wym._box).find(wym._options.toolsSelector)
+ .addClass("wym_buttons");
+
+ // auto add some margin to the main area sides if left area
+ // or right area are not empty (if they contain sections)
+ jQuery(wym._box).find("div.wym_area_right ul")
+ .parents("div.wym_area_right").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-right": "155px"});
+
+ jQuery(wym._box).find("div.wym_area_left ul")
+ .parents("div.wym_area_left").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-left": "115px"});
+
+ //make hover work under IE < 7
+ jQuery(wym._box).find(".wym_section").hover(function(){
+ jQuery(this).addClass("hover");
+ },function(){
+ jQuery(this).removeClass("hover");
+ });
+ }
+};
diff --git a/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/wymeditor_icon.png b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/wymeditor_icon.png
new file mode 100644
index 0000000..d4fc155
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/static/gstudio/js/wymeditor/skins/wymeditor_icon.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/404.html b/build/lib.linux-i686-2.6/gstudio/templates/404.html
new file mode 100644
index 0000000..0a253b3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/404.html
@@ -0,0 +1,46 @@
+{% extends "gstudio/skeleton.html" %}
+{% load i18n gstudio_tags %}
+
+{% block breadcrumbs %}
+ {% trans "Error 404" %}
+{% endblock %}
+
+{% block title %}{% trans "Page not found" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Page not found" %}</h2>
+
+<p>{% trans "Sorry, but the requested page could not be found." %}</p>
+
+<h3>{% trans "Useful links" %}</h3>
+<div class="links">
+ <ul>
+ <li>
+ <a href="{% url gstudio_nodetype_archive_index %}" title="{% trans "Blog index" %}">
+ {% trans "Blog index" %}
+ </a>
+ </li>
+ <li>
+ <a href="{% url gstudio_sitemap %}" title="{% trans "Sitemap" %}">
+ {% trans "Sitemap" %}
+ </a>
+ </li>
+ </ul>
+</div>
+
+<h3>{% trans "Recent node types" %}</h3>
+<div class="recents">
+ {% get_recent_nodetypes 5 %}
+</div>
+
+<h3>{% trans "Search" %}</h3>
+<div class="search">
+ <form method="get" id="searchform" action="{% url gstudio_nodetype_search %}">
+ <p>
+ <input type="text" value="{% trans "Keywords..." %}" name="pattern" id="searchbox" onfocus="this.value=''"/>
+ <input type="submit" class="submitbutton" value="OK" />
+ </p>
+ </form>
+</div>
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/500.html b/build/lib.linux-i686-2.6/gstudio/templates/500.html
new file mode 100644
index 0000000..bf0551a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/500.html
@@ -0,0 +1,46 @@
+{% extends "gstudio/skeleton.html" %}
+{% load i18n gstudio_tags %}
+
+{% block breadcrumbs %}
+ {% trans "Error 500" %}
+{% endblock %}
+
+{% block title %}{% trans "Server error" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Server error" %}</h2>
+
+<p>{% trans "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience." %}</p>
+
+<h3>{% trans "Useful links" %}</h3>
+<div class="links">
+ <ul>
+ <li>
+ <a href="{% url gstudio_nodetype_archive_index %}" title="{% trans "Blog index" %}">
+ {% trans "Blog index" %}
+ </a>
+ </li>
+ <li>
+ <a href="{% url gstudio_sitemap %}" title="{% trans "Sitemap" %}">
+ {% trans "Sitemap" %}
+ </a>
+ </li>
+ </ul>
+</div>
+
+<h3>{% trans "Recent node types" %}</h3>
+<div class="recents">
+ {% get_recent_nodetypes 5 %}
+</div>
+
+<h3>{% trans "Search" %}</h3>
+<div class="search">
+ <form method="get" id="searchform" action="{% url gstudio_nodetype_search %}">
+ <p>
+ <input type="text" value="{% trans "Keywords..." %}" name="pattern" id="searchbox" onfocus="this.value=''"/>
+ <input type="submit" class="submitbutton" value="OK" />
+ </p>
+ </form>
+</div>
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/app_index.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/app_index.html
new file mode 100644
index 0000000..3bd4171
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/app_index.html
@@ -0,0 +1,41 @@
+{% extends "admin/app_index.html" %}
+{% load i18n adminmedia %}
+
+{% block extrastyle %}
+{{ block.super }}
+<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}gstudio/css/jquery.autocomplete.css" />
+<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}gstudio/css/dashboard_gstudio.css" />
+{% endblock %}
+
+{% block extrahead %}
+{{ block.super }}
+<script type="text/javascript" src="{{ STATIC_URL }}gstudio/js/jquery.js"></script>
+<script type="text/javascript" src="{{ STATIC_URL }}gstudio/js/jquery.masonry.js"></script>
+<script type="text/javascript" src="{{ STATIC_URL }}gstudio/js/jquery.bgiframe.js"></script>
+<script type="text/javascript" src="{{ STATIC_URL }}gstudio/js/jquery.autocomplete.js"></script>
+<script type="text/javascript" src="{% url admin:gstudio_nodetype_autocomplete_tags %}"></script>
+<script type="text/javascript">
+$(document).ready(function() {
+ $("#content-main").masonry({
+ singleMode: true, itemSelector: ".module"
+ });
+});
+</script>
+{% endblock %}
+
+{% block content %}
+<div id="content-main">
+ {% include "admin/gstudio/widgets/content_stats.html" %}
+
+ {% include "admin/gstudio/widgets/quickpost.html" %}
+
+ {% include "admin/gstudio/widgets/recent_comments.html" %}
+
+ {% include "admin/gstudio/widgets/draft_nodetypes.html" %}
+
+ {% include "admin/gstudio/widgets/recent_linkbacks.html" %}
+</div>
+{% endblock %}
+
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/autocomplete_tags.js b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/autocomplete_tags.js
new file mode 100644
index 0000000..8d318ae
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/autocomplete_tags.js
@@ -0,0 +1,11 @@
+{% load tagging_tags %}
+
+$(document).ready(function() {
+ {% tags_for_model gstudio.Objecttype as objecttype_tags %}
+ var data = "{{ objecttype_tags|join:',' }}".split(",");
+ $("#id_tags").autocomplete(data, {
+ width: 150, max: 10,
+ multiple: true, multipleSeparator: ", ",
+ scroll: true, scrollHeight: 300,
+ matchContains: true, autoFill: true,});
+}); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/markitup.js b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/markitup.js
new file mode 100644
index 0000000..543d49b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/markitup.js
@@ -0,0 +1,3 @@
+$(document).ready(function() {
+ $("#id_content").markItUp(mySettings);
+});
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/tinymce_textareas.js b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/tinymce_textareas.js
new file mode 100644
index 0000000..51461c6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/tinymce_textareas.js
@@ -0,0 +1,23 @@
+tinyMCE.init({
+ mode: "exact",
+ elements: "id_content",
+ theme: "advanced",
+ skin : "o2k7",
+ skin_variant : "silver",
+ height: "250",
+ width: "800",
+ relative_urls: false,
+ language: "{{ language }}",
+ directionality: "{{ directionality }}",
+ spellchecker_languages : "{{ spellchecker_languages }}",
+ spellchecker_rpc_url : "{{ spellchecker_rpc_url }}",
+ theme_advanced_toolbar_location : "top",
+ theme_advanced_toolbar_align : "left",
+ theme_advanced_statusbar_location : "bottom",
+ theme_advanced_resizing : true,
+ plugins: "contextmenu,directionality,fullscreen,paste,preview,searchreplace,spellchecker,visualchars,wordcount",
+ paste_auto_cleanup_on_paste : true,
+ theme_advanced_buttons1 : "formatselect,fontsizeselect,|,undo,redo,|,cut,copy,paste,pastetext,pasteword,|,search,replace,|,visualchars,visualaid,cleanup,code,preview,fullscreen",
+ theme_advanced_buttons2 : "bold,italic,underline,strikethrough,|,forecolor,backcolor,removeformat,|,justifyleft,justifycenter,justifyright,justifyfull,|,sub,sup,|,bullist,numlist,|,outdent,indent,|,link,unlink,anchor,image,blockquote,hr,charmap,",
+ theme_advanced_buttons3 : "",
+ });
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/wymeditor.js b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/wymeditor.js
new file mode 100644
index 0000000..6cf8633
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/nodetype/wymeditor.js
@@ -0,0 +1,10 @@
+$(document).ready(function() {
+ $("#id_content").wymeditor({
+ skin: "django", lang: "{{ LANGUAGE_CODE }}",
+ stylesheet: "{{ STATIC_URL }}gstudio/css/wymeditor_styles.css",
+ updateSelector: "input:submit", updateEvent: "click",
+ postInit: function(wym) {
+ wym.hovertools();
+ }
+ });
+ });
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/ATquickpost.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/ATquickpost.html
new file mode 100644
index 0000000..025dc6e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/ATquickpost.html
@@ -0,0 +1,59 @@
+{% load i18n %}
+<div id="AT_quickpost" class="module">
+ <form method="post" action="{% url gstudio_nodetype_quick_post %}">
+ {% csrf_token %}
+ <table summary="{% trans "Quick publishing" %}">
+
+
+ <tr><p class="help">All the fields are mandatory</p>
+ <th>
+ <label for="id_title" class="required">{% trans "Title" %}:</label>
+ </th>
+ <td>
+ <input name="title" class="vTextField" maxlength="255" id="id_title" type="text" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label for="id_slug" class="required">{% trans "Slug" %}:</label>
+ </th>
+ <td>
+ <input name="slug" class="vTextField" maxlength="255" id="id_slug" type="text" />
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <label for="id_status" class="required">{% trans "Status" %}:</label>
+ </th>
+ <td>
+ <input name="status" class="vTextField" maxlength="100" id="id_status" type="text" />
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <label for="id_content" class="required">{% trans "Content" %}:</label>
+ </th>
+ <td>
+ <textarea id="id_content" rows="7" name="content" class="vLargeTextField"></textarea>
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <label for="id_tags">{% trans "Tags" %}:</label>
+ </th>
+ <td>
+ <input name="tags" class="vTextField" maxlength="255" id="id_tags" type="text" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input type="submit" value="{% trans "Save as draft" %}" name="save_draft" class="button" />
+ <input type="reset" value="{% trans "Reset" %}" class="button" />
+ <input type="submit" value="{% trans "Publish" %}" class="default" name="save" />
+
+ </td>
+ </tr>
+ </table>
+ </form>
+</div>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/OTquickpost.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/OTquickpost.html
new file mode 100644
index 0000000..da24e30
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/OTquickpost.html
@@ -0,0 +1,58 @@
+{% load i18n %}
+<div id="OTquickpost" class="module">
+ <form method="post" action="{% url gstudio_nodetype_quick_post %}">
+ {% csrf_token %}
+ <table summary="{% trans "Quick publishing" %}">
+
+ <tr><p class="help">All the fields are mandatory</p>
+ <th>
+ <label for="id_title" class="required">{% trans "Title" %}:</label>
+ </th>
+ <td>
+ <input name="title" class="vTextField" maxlength="255" id="id_title" type="text" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label for="id_slug" class="required">{% trans "Slug" %}:</label>
+ </th>
+ <td>
+ <input name="slug" class="vTextField" maxlength="255" id="id_slug" type="text" />
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <label for="id_status" class="required">{% trans "Status" %}:</label>
+ </th>
+ <td>
+ <input name="status" class="vTextField" maxlength="100" id="id_status" type="text" />
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <label for="id_content" class="required">{% trans "Content" %}:</label>
+ </th>
+ <td>
+ <textarea id="id_content" rows="7" name="content" class="vLargeTextField"></textarea>
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <label for="id_tags">{% trans "Tags" %}:</label>
+ </th>
+ <td>
+ <input name="tags" class="vTextField" maxlength="255" id="id_tags" type="text" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input type="submit" value="{% trans "Save as draft" %}" name="save_draft" class="button" />
+ <input type="reset" value="{% trans "Reset" %}" class="button" />
+ <input type="submit" value="{% trans "Publish" %}" class="default" name="save" />
+
+ </td>
+ </tr>
+ </table>
+ </form>
+</div>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_content_stats.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_content_stats.html
new file mode 100644
index 0000000..90709fe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_content_stats.html
@@ -0,0 +1,146 @@
+{% load i18n %}
+
+<tr>
+ <th>{% trans "Contents" %}</th>
+ <th>{% trans "Discussions" %}</th>
+</tr>
+
+
+
+<tr>
+ <td>
+ <a href="{% url admin:gstudio_objecttype_changelist %}">
+ {% blocktrans %}{{ objecttypes }} objecttype{% endblocktrans %}
+ </a>
+ </td>
+ <td>
+ <a href="{% url admin:comments_comment_changelist %}?is_public__exact=1">
+ {% blocktrans %}{{ comments }} comments{% endblocktrans %}
+ </a>
+ </td>
+ <td>
+ <ul class="actions">
+ <li class="add-link">
+ <a href="/admin/gstudio/objecttype/add/">Add</a>
+ </li>
+ </td>
+ <td>
+ <ul class="actions">
+ <li class="change-link">
+ <a href="/admin/gstudio/objecttype/">Change</a>
+ </li>
+ </ul>
+ </td>
+</tr>
+
+<tr>
+ <td>
+ <a href="{% url admin:gstudio_objecttype_changelist %}">
+ {% blocktrans %}{{ nodetypes }} nodetypes{% endblocktrans %}
+ </a>
+ </td>
+ <td>
+ <a href="{% url admin:comments_comment_changelist %}?is_public__exact=1">
+ {% blocktrans %}{{ comments }} comments{% endblocktrans %}
+ </a>
+ </td>
+ <td>
+ <ul class="actions">
+ <li class="add-link">
+ <a href="/admin/comments/comment/add/">Add</a>
+ </li>
+ </td>
+ <td>
+ <ul class="actions">
+ <li class="change-link">
+ <a href="/admin/comments/comment/">Change</a>
+ </li>
+ </ul>
+ </td>
+</tr>
+<tr>
+ <td>
+ <a href="{% url admin:gstudio_metatype_changelist %}">
+ {% blocktrans %}{{ metatypes }} metatypes{% endblocktrans %}
+ </a>
+ </td>
+ <td>{% blocktrans %}{{ pingbacks }} pingbacks{% endblocktrans %}</td>
+
+ <td>
+ <ul class="actions">
+ <li class="add-link">
+ <a href="/admin/gstudio/metatype/add/">Add</a>
+ </li>
+ </td>
+ <td>
+ <ul class="actions">
+ <li class="change-link">
+ <a href="/admin/gstudio/metatype/">Change</a>
+ </li>
+ </ul>
+ </td>
+
+
+</tr>
+
+<tr>
+ <td>
+ <a href="{% url admin:gstudio_attributetype_changelist %}">
+ {% blocktrans %}{{ attributetype }} attributetype{% endblocktrans %}
+ </a>
+ </td>
+
+ <td><a href="{% url admin:comments_comment_changelist %}?is_public__exact=1">
+ {% blocktrans %}{{ comments }} comments{% endblocktrans %}
+ </a>
+ </td>
+ <td>
+ <ul class="actions">
+ <li class="add-link">
+ <a href="/admin/gstudio/attributetype/add/">Add</a>
+ </li>
+ </td>
+ <td>
+ <ul class="actions">
+ <li class="change-link">
+ <a href="/admin/gstudio/attributetype/">Change</a>
+ </li>
+ </ul>
+ </td>
+</tr>
+
+<tr>
+ <td>
+ <a href="{% url admin:tagging_tag_changelist %}">
+ {% blocktrans %}{{ tags }} tags{% endblocktrans %}
+ </a>
+ </td>
+ <td>{% blocktrans %}{{ trackbacks }} trackbacks{% endblocktrans %}</td>
+
+ <td>
+ <ul class="actions">
+ <li class="add-link">
+ <a href="/admin/tagging/tag/add/">Add</a>
+ </li>
+ </td>
+ <td>
+ <ul class="actions">
+ <li class="change-link">
+ <a href="/admin/tagging/tag/">Change</a>
+ </li>
+ </ul>
+ </td>
+
+</tr>
+<tr>
+ <td>
+ <a href="{% url admin:auth_user_changelist %}">
+ {% blocktrans %}{{ authors }} authors{% endblocktrans %}
+ </a>
+ </td>
+ <td>
+ <a href="{% url admin:comments_comment_changelist %}?is_public__exact=0">
+ {% blocktrans %}{{ rejects }} rejected{% endblocktrans %}
+ </a>
+ </td>
+ </tr>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_draft_nodetypes.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_draft_nodetypes.html
new file mode 100644
index 0000000..4be2308
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_draft_nodetypes.html
@@ -0,0 +1,37 @@
+{% load i18n gstudio_tags %}
+
+{% for nodetype in nodetypes %}
+<tr>
+ <th>
+ <a href="{% url admin:gstudio_nodetype_change nodetype.pk %}"
+ title="{% trans "Edit the nodetype" %}">
+ {{ nodetype.title }}
+ </a>
+ {% trans "on" %}
+ <abbr>{{ nodetype.creation_date|date:"DATE_FORMAT" }}</abbr>
+ {{ nodetype.html_content|truncatewords_html:20|safe }}
+ </th>
+ <td>
+ <a href="{{ nodetype.get_absolute_url }}" class="previewlink">
+ {% trans "Preview" %}
+ </a>
+ </td>
+</tr>
+{% empty %}
+<tr>
+ <th colspan="2">
+ {% trans "No draft nodetypes." %}
+ </th>
+</tr>
+{% endfor %}
+
+{% if nodetypes %}
+<tr>
+ <th colspan="2">
+ <a href="{% url admin:gstudio_objecttype_changelist %}?status__exact=0"
+ title="{% trans "View all draft nodetypes" %}" class="managelink">
+ {% trans "View all draft nodetypes" %}
+ </a>
+ </th>
+</tr>
+{% endif %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_recent_comments.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_recent_comments.html
new file mode 100644
index 0000000..bb19910
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_recent_comments.html
@@ -0,0 +1,45 @@
+{% load i18n gstudio_tags %}
+
+{% for comment in comments %}
+<tr>
+ <th>
+ <img src="{% get_gravatar comment.email 40 "G" %}"
+ class="gravatar photo" alt="{{ comment.user_name }}" />
+ </th>
+ <td>
+ {% with comment.content_object as nodetype %}
+ <strong>{{ comment.user_name }}</strong> {% trans "in" %}
+ <strong>
+ <a href="{{ nodetype.get_absolute_url }}#comment_{{ comment.pk }}"
+ title="{% trans "Comment on" %} {{ nodetype.title }}">
+ {{ nodetype.title }}
+ </a>
+ </strong>
+ {% endwith %}
+ {{ comment.comment|truncatewords:20|linebreaks }}
+ </td>
+ <td>
+ <a href="{% url admin:comments_comment_change comment.pk %}"
+ title="{% trans "Edit the comment" %}" class="changelink">
+ {% trans "Edit" %}
+ </a>
+ </td>
+</tr>
+{% empty %}
+<tr>
+ <th colspan="3">
+ {% trans "No comments yet." %}
+ </th>
+</tr>
+{% endfor %}
+
+{% if comments %}
+<tr>
+ <th colspan="3">
+ <a href="{% url admin:comments_comment_changelist %}"
+ title="{% trans "Manage the comments" %}" class="managelink">
+ {% trans "Manage the comments" %}
+ </a>
+ </th>
+</tr>
+{% endif %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_recent_linkbacks.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_recent_linkbacks.html
new file mode 100644
index 0000000..57437da
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/_recent_linkbacks.html
@@ -0,0 +1,31 @@
+{% load i18n %}
+
+{% for linkback in linkbacks %}
+<tr>
+ <th>
+ {% with linkback.content_object as nodetype %}
+ <a href="{{ linkback.url }}">{{ linkback.user_name }}</a>
+ {% trans "made a linkback on" %}
+ <a href="{{ nodetype.get_absolute_url }}#{{ linkback.flags.all.0.flag }}_{{ linkback.pk }}"
+ title="{{ nodetype.title }}">
+ {{ nodetype.title }}
+ </a>
+ {% endwith %}
+ {{ linkback.comment|truncatewords:20|linebreaks }}
+ </th>
+ <td>
+ <a href="{% url admin:comments_comment_change linkback.pk %}"
+ title="{% trans "Edit the linkback" %}" class="changelink">
+ {% trans "Edit" %}
+ </a>
+ </td>
+</tr>
+{% empty %}
+<tr>
+ <th colspan="2">
+ {% trans "No linkbacks yet." %}
+ </th>
+</tr>
+{% endfor %}
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/base.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/base.html
new file mode 100644
index 0000000..d0790cd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/base.html
@@ -0,0 +1,6 @@
+<div id="{% block module_id %}{% endblock %}" class="module">
+ <table summary="{% block summary %}{% endblock %}">
+ <caption>{% block title %}{% endblock %}</caption>
+ {% block content %}{% endblock %}
+ </table>
+</div>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/content_stats.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/content_stats.html
new file mode 100644
index 0000000..6817b0b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/content_stats.html
@@ -0,0 +1,12 @@
+{% extends "admin/gstudio/widgets/base.html" %}
+{% load i18n gstudio_admin_tags %}
+
+{% block module_id %}contents{% endblock %}
+
+{% block summary %}{% trans "Today" %}{% endblock %}
+{% block title %}{% trans "Today" %}{% endblock %}
+
+{% block content %}
+ {% get_content_stats %}
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/draft_nodetypes.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/draft_nodetypes.html
new file mode 100644
index 0000000..f43064b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/draft_nodetypes.html
@@ -0,0 +1,12 @@
+{% extends "admin/gstudio/widgets/base.html" %}
+{% load i18n gstudio_admin_tags %}
+
+{% block module_id %}drafts{% endblock %}
+
+{% block summary %}{% trans "Draft nodetypes" %}{% endblock %}
+{% block title %}{% trans "Draft nodetypes" %}{% endblock %}
+
+{% block content %}
+ {% get_draft_nodetypes %}
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/quickpost.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/quickpost.html
new file mode 100644
index 0000000..9aff395
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/quickpost.html
@@ -0,0 +1,14 @@
+{% load i18n %}
+<div id="quickpost" class="module">
+ <fieldset>
+ <legend>{% trans "Quick Publishing" %}</legend>
+ <select>
+ <option value="object type">OT</option>
+ <option value="attribute type">AT</option>
+ <option value="relation type">RT</option>
+ <option value="process type">PT</option>
+ <option value="system type">ST</option>
+ </select>
+ </fieldset>
+
+</div>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/recent_comments.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/recent_comments.html
new file mode 100644
index 0000000..5f42a27
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/recent_comments.html
@@ -0,0 +1,12 @@
+{% extends "admin/gstudio/widgets/base.html" %}
+{% load i18n gstudio_tags %}
+
+{% block module_id %}comments{% endblock %}
+
+{% block summary %}{% trans "Recent comments" %}{% endblock %}
+{% block title %}{% trans "Recent comments" %}{% endblock %}
+
+{% block content %}
+ {% get_recent_comments 3 "admin/gstudio/widgets/_recent_comments.html" %}
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/recent_linkbacks.html b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/recent_linkbacks.html
new file mode 100644
index 0000000..721a286
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/admin/gstudio/widgets/recent_linkbacks.html
@@ -0,0 +1,12 @@
+{% extends "admin/gstudio/widgets/base.html" %}
+{% load i18n gstudio_tags %}
+
+{% block module_id %}linkbacks{% endblock %}
+
+{% block summary %}{% trans "Recent linkbacks" %}{% endblock %}
+{% block title %}{% trans "Recent linkbacks" %}{% endblock %}
+
+{% block content %}
+ {% get_recent_linkbacks 5 "admin/gstudio/widgets/_recent_linkbacks.html" %}
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/base.html b/build/lib.linux-i686-2.6/gstudio/templates/base.html
new file mode 100644
index 0000000..9662a42
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/base.html
@@ -0,0 +1,105 @@
+{% extends "gstudio/skeleton.html" %}
+{% load gstudio_tags i18n %}
+
+{% block meta %}
+ <meta name="generator" content="Gstudio {{ GSTUDIO_VERSION }}" />
+{% endblock %}
+
+{% block link %}
+ <link rel="index" href="{% url gstudio_nodetype_archive_index %}" />
+ <link rel="EditURI" type="application/rsd+xml" href="{% url gstudio_rsd %}" />
+ <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="{% url gstudio_wlwmanifest %}" />
+ <link rel="search" type="application/opensearchdescription+xml" title="Gnowledge Studio" href="{% url gstudio_opensearch %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of latest nodetypes" %}" href="{% url gstudio_nodetype_latest_feed %}" />
+ {% get_archives_nodetypes "gstudio/tags/archives_nodetypes_link.html" %}
+{% endblock %}
+
+{% block breadcrumbs %}
+ {% gstudio_breadcrumbs %}
+{% endblock %}
+
+{% block sidebar %}
+ <img src="{{ STATIC_URL }}objectapp/img/rss.png" alt="?" width="20" height="" />
+ <a href="{% url objectapp_gbobject_latest_feed %}" class="feeds"><h4>Rssfeed</h4></a>
+
+<div class="search">
+ <h3>{% trans "Search" %}</h3>
+ <form method="get" id="searchform" action="{% url objectapp_gbobject_search %}">
+ <p>
+ <input type="text" value="{% trans "Keywords..." %}" name="pattern" id="searchbox" onfocus="this.value=''" />
+ <input type="submit" class="submitbutton" value="OK" />
+ <a title="{% trans 'You can use - to exclude words or phrases, &quot;double quotes&quot; for exact phrases and the AND/OR boolean operators combined with parenthesis for complex searchs.' %}">
+ <img src="{{ STATIC_URL }}objectapp/img/help.png" alt="?" width="14" height="14" />
+ </a>
+ </p>
+ </form>
+</div>
+<div class="objecttypes">
+ <h3>{% trans "Objecttypes" %}</h3>
+ {% get_objecttypes %}
+</div>
+<div class="authors">
+ <h3>{% trans "Authors" %}</h3>
+ {% get_authors %}
+</div>
+<div class="calendar">
+ <h3>{% trans "Calendar" %}</h3>
+ {% get_calendar_gbobjects %}
+</div>
+<div class="tags">
+ <h3>{% trans "Tags" %}</h3>
+ {% get_tag_cloud %}
+</div>
+<div class="recents">
+ <h3>{% trans "Recent gbobjects" %}</h3>
+ {% get_recent_gbobjects 5 %}
+</div>
+<div class="comments">
+ <h3>{% trans "Recent comments" %}</h3>
+ {% get_recent_comments 5 %}
+</div>
+<div class="linkbacks">
+ <h3>{% trans "Recent linkbacks" %}</h3>
+ {% get_recent_linkbacks 5 %}
+</div>
+<div class="randoms">
+ <h3>{% trans "Random gbobjects" %}</h3>
+ {% get_random_gbobjects 5 %}
+</div>
+<div class="populars">
+ <h3>{% trans "Popular gbobjects" %}</h3>
+ {% get_popular_gbobjects 5 %}
+</div>
+<div class="archives">
+ <h3>{% trans "Archives" %}</h3>
+ {% get_archives_gbobjects_tree %}
+</div>
+{% if user.is_authenticated %}
+<div class="tools">
+ <h3>{% trans "Tools" %}</h3>
+ <ul>
+ {% if perms.objectapp %}
+ <li>
+ <a href="{% url admin:app_list "objectapp" %}" title="{% trans "Dashboard" %}">
+ {% trans "Dashboard" %}
+ </a>
+ </li>
+ {% endif %}
+ {% if perms.objectapp.add_gbobject %}
+ <li>
+ <a href="{% url admin:objectapp_gbobject_add %}" title="{% trans "Post an gbobject" %}">
+ {% trans "Post an gbobject" %}
+ </a>
+ </li>
+ {% endif %}
+ {% block admin_tools %}
+ {% endblock %}
+ <li>
+ <a href="{% url admin:logout %}" title="{% trans "Log out" %}">
+ {% trans "Log out" %}
+ </a>
+ </li>
+ </ul>
+</div>
+{% endif %}
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/comments/comment_authors_email.txt b/build/lib.linux-i686-2.6/gstudio/templates/comments/comment_authors_email.txt
new file mode 100644
index 0000000..e32c876
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/comments/comment_authors_email.txt
@@ -0,0 +1,6 @@
+{% load i18n %}{% trans "Author" %}: {{ comment.userinfo.name }} {{ comment.userinfo.url }}
+
+{% trans "Comment" %}:
+{{ comment.comment }}
+
+{% trans "View this comment" %}: {{ protocol }}://{{ site }}{{ content_object.get_absolute_url }}#comment_{{ comment.pk }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/comments/comment_notification_email.txt b/build/lib.linux-i686-2.6/gstudio/templates/comments/comment_notification_email.txt
new file mode 100644
index 0000000..996166b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/comments/comment_notification_email.txt
@@ -0,0 +1,14 @@
+{% load i18n %}{% trans "Author" %}: {{ comment.userinfo.name }} {{ comment.userinfo.url }}
+{% trans "Email" %}: {{ comment.userinfo.email }}
+{% trans "IP" %}: {{ comment.ip_address }}
+
+{% trans "Comment" %}:
+{{ comment.comment }}
+
+{% trans "View this comment" %}: {{ protocol }}://{{ site }}{{ content_object.get_absolute_url }}#comment_{{ comment.pk }}
+
+{% trans "Flag this comment" %}: {{ protocol }}://{{ site }}{% url comments-flag comment.pk %}
+
+{% trans "Delete this comment" %}: {{ protocol }}://{{ site }}{% url comments-delete comment.pk %}
+
+{% trans "Approve this comment" %}: {{ protocol }}://{{ site }}{% url comments-approve comment.pk %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/comments/comment_reply_email.txt b/build/lib.linux-i686-2.6/gstudio/templates/comments/comment_reply_email.txt
new file mode 100644
index 0000000..e32c876
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/comments/comment_reply_email.txt
@@ -0,0 +1,6 @@
+{% load i18n %}{% trans "Author" %}: {{ comment.userinfo.name }} {{ comment.userinfo.url }}
+
+{% trans "Comment" %}:
+{{ comment.comment }}
+
+{% trans "View this comment" %}: {{ protocol }}://{{ site }}{{ content_object.get_absolute_url }}#comment_{{ comment.pk }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio/nodetype/form.html b/build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio/nodetype/form.html
new file mode 100644
index 0000000..8d5e27d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio/nodetype/form.html
@@ -0,0 +1,22 @@
+{% load comments i18n %}
+
+<form action="{% comment_form_target %}" method="post">
+ {% csrf_token %}
+ <fieldset>
+ <input type="hidden" name="next" value="{% url gstudio_discussion_success %}"/>
+ <legend>{% trans "Post your comment" %}</legend>
+ {% for field in form %}
+ {% if field.is_hidden %}{{ field }}{% else %}
+ <div{% if field.errors %} class="error"{% endif %}{% ifequal field.name "honeypot" %} style="display:none;"{% endifequal %}>
+ {{ field.label_tag }}
+ {% if field.errors %}{{ field.errors }}{% else %}<br />{% endif %}
+ {{ field }}
+ </div>
+ {% endif %}
+ {% endfor %}
+ <p class="submit">
+ <input type="submit" name="submit" class="submit-post" value="{% trans "Post" %}" />
+ <input type="submit" name="preview" class="submit-preview" value="{% trans "Preview" %}" />
+ </p>
+ </fieldset>
+</form>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio/nodetype/posted.html b/build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio/nodetype/posted.html
new file mode 100644
index 0000000..f54134f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio/nodetype/posted.html
@@ -0,0 +1,13 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block title %}{% trans "Thanks for your comment" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Thanks for your comment" %}</h2>
+<p>
+ <a href="{% url gstudio_nodetype_archive_index %}" title="{% trans "Return to nodetype list" %}">
+ {% trans "Return to nodetype list" %}
+ </a>
+</p>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio_nodetype_preview.html b/build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio_nodetype_preview.html
new file mode 100644
index 0000000..d360568
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/comments/gstudio_nodetype_preview.html
@@ -0,0 +1,37 @@
+{% extends "gstudio/base.html" %}
+{% load i18n gstudio_tags comments %}
+
+{% block title %}{% trans "Comment preview" %}{% endblock %}
+
+{% block content %}
+ {% if form.errors %}
+ <h2>
+ {% blocktrans count form.errors|length as errors %}Please correct following error.{% plural %}Please correct following errors.{% endblocktrans %}
+ </h2>
+ {% else %}
+ <h2>{% trans "Preview of the comment" %}</h2>
+ <ol id="comment-list" class="span-15 last">
+ <li id="comment_preview" class="comment vcard {% cycle box1,box2 %} span-15 last">
+ <div class="span-2">
+ <img src="{% get_gravatar form.cleaned_data.email 60 "G" %}" class="gravatar photo" alt="form.cleaned_data.name" />
+ </div>
+ <div class="comment-body span-13 last">
+ <div class="comment-author span-13 last">
+ {% if form.cleaned_data.url %}
+ <a href="{{ form.cleaned_data.url }}" class="fn url">{{ form.cleaned_data.name }}</a>
+ {% else %}
+ {{ form.cleaned_data.name }}
+ {% endif %}
+ {% trans "on" %} {% now "m/d/Y P" %}
+ </div>
+ <div class="span-13 last">
+ {{ comment|linebreaks }}
+ </div>
+ </div>
+ </li>
+ </ol>
+ {% endif %}
+ <div class="commentForm span-16 last">
+ {% include "comments/gstudio/nodetype/form.html" %}
+ </div>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/feeds/comment_description.html b/build/lib.linux-i686-2.6/gstudio/templates/feeds/comment_description.html
new file mode 100644
index 0000000..8141388
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/feeds/comment_description.html
@@ -0,0 +1 @@
+{{ obj.comment }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/feeds/comment_title.html b/build/lib.linux-i686-2.6/gstudio/templates/feeds/comment_title.html
new file mode 100644
index 0000000..f9ee8ab
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/feeds/comment_title.html
@@ -0,0 +1,2 @@
+{% load i18n %}
+{{ obj.user_name }} {% trans "on" %} {{ obj.submit_date|date:"DATETIME_FORMAT" }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/feeds/discussion_description.html b/build/lib.linux-i686-2.6/gstudio/templates/feeds/discussion_description.html
new file mode 100644
index 0000000..8141388
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/feeds/discussion_description.html
@@ -0,0 +1 @@
+{{ obj.comment }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/feeds/discussion_title.html b/build/lib.linux-i686-2.6/gstudio/templates/feeds/discussion_title.html
new file mode 100644
index 0000000..f9ee8ab
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/feeds/discussion_title.html
@@ -0,0 +1,2 @@
+{% load i18n %}
+{{ obj.user_name }} {% trans "on" %} {{ obj.submit_date|date:"DATETIME_FORMAT" }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/feeds/nodetype_description.html b/build/lib.linux-i686-2.6/gstudio/templates/feeds/nodetype_description.html
new file mode 100644
index 0000000..7afb28a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/feeds/nodetype_description.html
@@ -0,0 +1 @@
+{{ obj.html_content|safe }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/feeds/nodetype_title.html b/build/lib.linux-i686-2.6/gstudio/templates/feeds/nodetype_title.html
new file mode 100644
index 0000000..91b32ca
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/feeds/nodetype_title.html
@@ -0,0 +1 @@
+{{ obj.title|safe }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/feeds/pingback_description.html b/build/lib.linux-i686-2.6/gstudio/templates/feeds/pingback_description.html
new file mode 100644
index 0000000..8141388
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/feeds/pingback_description.html
@@ -0,0 +1 @@
+{{ obj.comment }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/feeds/pingback_title.html b/build/lib.linux-i686-2.6/gstudio/templates/feeds/pingback_title.html
new file mode 100644
index 0000000..f9ee8ab
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/feeds/pingback_title.html
@@ -0,0 +1,2 @@
+{% load i18n %}
+{{ obj.user_name }} {% trans "on" %} {{ obj.submit_date|date:"DATETIME_FORMAT" }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/feeds/trackback_description.html b/build/lib.linux-i686-2.6/gstudio/templates/feeds/trackback_description.html
new file mode 100644
index 0000000..8141388
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/feeds/trackback_description.html
@@ -0,0 +1 @@
+{{ obj.comment }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/feeds/trackback_title.html b/build/lib.linux-i686-2.6/gstudio/templates/feeds/trackback_title.html
new file mode 100644
index 0000000..f9ee8ab
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/feeds/trackback_title.html
@@ -0,0 +1,2 @@
+{% load i18n %}
+{{ obj.user_name }} {% trans "on" %} {{ obj.submit_date|date:"DATETIME_FORMAT" }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_header.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_header.html
new file mode 100644
index 0000000..f1f21d1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_header.html
@@ -0,0 +1,80 @@
+{% load i18n grp_tags %}
+
+<div id="header">
+
+ <div class="branding">&nbsp; Gnowledge Studio </div>
+
+ <!-- Title -->
+ <div class="admin-title"> {% if grappelli_admin_title %}{{
+ grappelli_admin_title }}{% else %}{% get_admin_title %}{% endif %}
+ | <a href="/">Home</a>
+ | <a href="{{ get_absolute_url }}/objects">objects</a>
+
+ {% if user.is_authenticated %}
+ | <a href="{{ get_absolute_url }}/gstudio/userdashboard">My Dashboard</a>
+ {% if user.is_staff %}
+ | <a href="{{ get_absolute_url }}/admin">Admin Dashboard</a>
+
+ {% endif %}
+ {% endif %}
+
+
+ </div>
+
+ {% if user.is_authenticated %}
+ <ul id="user-tools">
+ <!-- Username -->
+ <li class="user-options-container collapse closed">
+ <a href="javascript://" class="user-options-handler collapse-handler">{% firstof user.first_name user.username %}</a>
+ <ul class="user-options">
+ <!-- Change Password -->
+ {% url admin:password_change as password_change_url %}
+ {% if password_change_url %}
+ <li><a href="{{ password_change_url }}">
+ {% else %}
+ <li><a href="{{ root_path }}password_change/">
+ {% endif %}
+ {% trans 'Change password' %}</a></li>
+ <!-- Logout -->
+ <li><a href="{{get_absoulute_url}}/accounts/logout/">
+ {% trans 'Log out' %}</a></li>
+
+ </ul>
+ </li>
+ <!-- Userlinks -->
+ {% block userlinks %}
+ <!-- JS tests -->
+ {% url test-index as testindexurl %}
+ {% if testindexurl %}
+ <li><a href="{{ testindexurl }}">{% trans 'Tests' %}</a></li>
+ {% endif %}
+ <!-- Documentation -->
+ {% url django-admindocs-docroot as docsroot %}
+ {% if docsroot %}
+ <li><a href="{{ docsroot }}">{% trans 'Documentation' %}</a></li>
+ {% endif %}
+ <li><a href="http://github.com/gnowgi/django-gstudio">Code</a></li>
+ {% endblock %}
+ </ul>
+ {% else %}
+ <ul id="user-tools">
+ <li><a href="{{root_path}}/accounts/login">{% trans 'Login' %}</a></li>
+ <li>Not registered ? <a href="{{root_path}}/accounts/register">{% trans 'Register' %}</a></li>
+ </ul>
+
+
+
+
+ {% endif %}
+ {% block nav-global %}
+ {% endblock %}
+</div>
+
+<script type="text/javascript" charset="utf-8">
+ (function($) {
+ $(document).ready(function() {
+ $("div#header .collapse").grp_collapsible();
+ });
+ })(django.jQuery);
+</script>
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_narrative_detail.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_narrative_detail.html
new file mode 100644
index 0000000..53e62ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_narrative_detail.html
@@ -0,0 +1,200 @@
+
+ </p><p>
+
+
+ {% if object.get_rendered_nbh.plural %}
+ <b> Its plural form is:<nbsp></b>
+ {{object.get_rendered_nbh.plural}};<nbsp>
+ {% endif %}
+ {% if object.get_rendered_nbh.altnames %}
+ <b> It is known by other names:<nbsp></b>
+ {{object.get_rendered_nbh.altnames}} ;<nbsp>
+ {% endif %}
+
+ {% if object.get_rendered_nbh.member_of_metatypes %}
+
+ {% if object.get_rendered_nbh.type_of %}
+ <b> is a kind of:<nbsp></b>
+ {% for typekey,typevalue in object.get_rendered_nbh.type_of.items %}
+ <a href="{{typevalue}}">{{typekey}}</a>;
+ {% endfor %};<nbsp>
+ {% endif %}
+
+ <b> member of metatype/s:<nbsp></b>
+ {% for mkey,mvalue in object.get_rendered_nbh.member_of_metatypes.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %};<nbsp>
+ {% endif %}
+
+ {% if object.get_rendered_nbh.contains_subtypes %}
+ <b> contains subtypes:<nbsp></b>
+ {% for stkey,stvalue in object.get_rendered_nbh.contains_subtypes.items %}
+ <a href="{{stvalue}}">{{stkey}}</a>;
+ {% endfor %};<nbsp>
+ {% endif %}
+
+
+ {% if object.get_rendered_nbh.contains_members %}
+
+
+ <b>has members:<nbsp></b>
+ {% for mkey,mvalue in object.get_rendered_nbh.contains_members.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %};<nbsp>
+ {% endif %}
+
+
+
+
+ {% if object.get_rendered_nbh.relations %}
+
+
+ {% for relkey,relvalue in object.get_rendered_nbh.relations.items %}
+ <b>{{relkey}}:<nbsp></b>
+ {% for relk, relv in relvalue.items %}
+ <a href="{{relv}}">{{relk}}</a>;
+ {% endfor %};<nbsp>
+ {% endfor %}
+ {% endif %}
+
+ {% if object.get_rendered_nbh.attributes %}
+
+
+
+ <b>It has some more properties: <nbsp> </b>
+
+ {% for items in object.get_rendered_nbh.attributes.items %}
+ {{items}};
+ {% endfor %} ;<nbsp>
+ {% endif %}
+
+
+ {% if object.get_rendered_nbh.leftroles %}
+
+
+
+ <b>it is used as a subject-type for the relation: <nbsp> </b>
+
+ {% for lrkey,lrvalue in object.get_rendered_nbh.leftroles.items %}
+ <a href="{{lrvalue}}">{{lrkey}}</a>;
+ {% endfor %} ;<nbsp>
+ {% endif %}
+
+
+ {% if object.get_rendered_nbh.rightroles %}
+
+ <b>it is used as an object in the predicate position for the relation: <nbsp> </b>
+
+ {% for rrkey,rrvalue in object.get_rendered_nbh.rightroles.items %}
+ <a href="{{rrvalue}}">{{rrkey}}</a>;
+ {% endfor %} ;<nbsp>
+ {% endif %}
+
+
+ {% if object.get_rendered_nbh.ats %}
+
+
+ <b>it is subject-type for the property: <nbsp> </b>
+
+ {% for atkey,atvalue in object.get_rendered_nbh.ats.items %}
+ <a href="{{atvalue}}">{{atkey}}</a>;
+ {% endfor %} ;<nbsp>
+ {% endif %}
+
+</p><p>
+ {% if object.get_rendered_nbh.priornodes %}
+
+
+ <b>It has prerequisites:<nbsp></b>
+ {% for mkey,mvalue in object.get_rendered_nbh.priornodes.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %};<nbsp>
+ {% endif %}
+
+ {% if object.get_rendered_nbh.posteriornodes %}
+
+
+ <b>It is a prerequisite for:<nbsp></b>
+ {% for mkey,mvalue in object.get_rendered_nbh.posteriornodes.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %};<nbsp>
+ {% endif %}
+
+
+
+
+ </p>
+
+ <div class="nodetype-body span-16 last">
+ {% if object.image %}
+ <div class="nodetype-image">
+ <p>
+ <a href="{{ object.get_absolute_url }}" rel="bookmark">
+ <img src="{{ object.image.url }}" alt="{{ object.title }}" class="left" />
+ </a>
+ </p>
+ </div>
+ {% endif %}
+ <div class="nodetype-content">
+ <br>
+ {{ object_content }}
+ </div>
+
+
+
+ </div>
+
+
+ <div class="nodetype-footer">
+ <p class="nodetype-tags span-16 last">
+ <strong>{% trans "Tags" %}</strong> :
+ {% tags_for_object object as tag_list %}
+ {% for tag in tag_list %}
+ <a href="{% url gstudio_tag_detail tag %}"
+ title="Tag {{ tag }}" rel="tag">{{ tag }}</a>
+ {% empty %}
+ <span>{% trans "No tags" %}</span>
+ {% endfor %}
+ </p>
+
+ <p class="nodetype-shorturl span-16 last">
+ <strong>{% trans "Short url" %}</strong> :
+ <a href="{{ object.short_url }}" title="{{ object.title }}" rel="shortlink">
+ {{ object.short_url }}
+ </a>
+ </p>
+
+ <p class="nodetype-comments span-16 last">
+ <strong>{% trans "Discussions" %}</strong> :
+ {% with object.comments.count as comment_count %}
+ {% if comment_count %}
+ <a href="{{ object.get_absolute_url }}#comments" title="{{ object.title }}">
+ {% blocktrans count comment_count as comment_count %}{{ comment_count }} comment{% plural %}{{ comment_count }} comments{% endblocktrans %}
+ </a>
+ {% else %}
+ {% if object.comments_are_open %}
+ {% trans "No comments yet." %}
+ <a href="{{ object.get_absolute_url }}#comments" title="{{ object.title }}">
+ {% trans "Discuss the relations or raise any issues with the representation!" %}
+ </a>
+ {% else %}
+ {% trans "Comments are closed." %}
+ {% endif %}
+ {% endif %}
+ {% endwith %}
+ {% with object.pingbacks.count as pingback_count %}
+ {% if pingback_count %}
+ , <a href="{{ object.get_absolute_url }}#pingbacks" title="{{ object.title }}">
+ {% blocktrans count pingback_count as pingback_count %}{{ pingback_count }} pingback{% plural %}{{ pingback_count }} pingbacks{% endblocktrans %}
+ </a>
+ {% endif %}
+ {% endwith %}
+ {% with object.trackbacks.count as trackback_count %}
+ {% if trackback_count %}
+ , <a href="{{ object.get_absolute_url }}#trackbacks" title="{{ object.title }}">
+ {% blocktrans count trackback_count as trackback_count %}{{ trackback_count }} trackback{% plural %}{{ trackback_count }} trackbacks{% endblocktrans %}
+ </a>
+ {% endif %}
+ {% endwith %}
+ </p>
+ </div>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_nodetype_detail.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_nodetype_detail.html
new file mode 100644
index 0000000..7f56f40
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_nodetype_detail.html
@@ -0,0 +1,32 @@
+{% load tagging_tags comments i18n %}
+<div id="nodetype-{{ object.pk }}" class="hnodetype{% if object.featured %} featured{% endif %} span-16 last">
+ <div class="nodetype-header span-16 last">
+ <h2 class="nodetype-title">
+ <a href="{{ object.get_absolute_url }}" title="{{ object.title }}" rel="bookmark">
+ {{ object.title }}
+ </a>
+ <a href="{{ object.ref.get_edit_url }}" target="_blank" >[edit]</a>
+
+ </h2>
+
+ <p class="nodetype-info">
+
+
+ {% if object.authors.count %}
+ {% trans "Contributed by" %}
+ {% for author in object.authors.all %}
+ <span class="vcard author">
+ <a href="{% url gstudio_author_detail author %}" class="fn nickname url" rel="author"
+ title="{% blocktrans with author as author %}Show {{ author }} nodetypes{% endblocktrans %}">{{ author }}</a>
+ </span>{% if not forloop.last %}, {% endif %}
+ {% endfor %}
+ {% trans "on" %}
+ {% else %}
+ {% trans "Contributed by" %}
+ {% endif %}
+ <abbr class="published" title="{{ object.creation_date|date:"c" }}Z">{{ object.creation_date|date:"DATE_FORMAT" }}</abbr>
+
+
+
+</div>
+</div>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_nodetype_neighbourhood.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_nodetype_neighbourhood.html
new file mode 100644
index 0000000..9941b86
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_nodetype_neighbourhood.html
@@ -0,0 +1,18 @@
+{% load tagging_tags comments i18n %}
+
+{% block neighbourhood %}
+
+ {% for key,value in object.get_nbh.items %}
+
+ <p> <b>{{key}}:</b>
+ {% if key == 'title'%}
+ {{value}}
+ {% endif %}
+ {% for key,value in value.items %}
+ {{value}},
+ {% endfor %}
+ </p>
+
+
+ {% endfor %}
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_subtype_detail.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_subtype_detail.html
new file mode 100644
index 0000000..e77ced8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/_subtype_detail.html
@@ -0,0 +1 @@
+nothing as yet
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/attributetype_detail.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/attributetype_detail.html
new file mode 100644
index 0000000..a09f561
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/attributetype_detail.html
@@ -0,0 +1,281 @@
+{% extends "gstudio/base.html" %}
+{% load i18n comments gstudio_tags %}
+
+{% block title %}{{ object.title }}{% endblock %}
+
+{% block meta-description %}{% if object.excerpt %}{{ object.excerpt|striptags }}{% else %}{{ object.content|striptags|truncatewords:100 }}{% endif %}{% endblock %}
+
+{% block meta-keywords %}{% if object.tags %}{{ object.tags }}{% else %}{{ block.super }}{% endif %}{% endblock %}
+
+
+{% block link %}
+ {{ block.super }}
+ {% with object.previous_attributetype as previous_attributetype %}{% if previous_attributetype %}
+ <link rel="prev" title="{{ previous_attributetype.title }}" href="{{ previous_attributetype.get_absolute_url }}" />
+ {% endif %}{% endwith %}
+ {% with object.next_attributetype as next_attributetype %}{% if next_attributetype %}
+ <link rel="next" title="{{ next_attributetype.title }}" href="{{ next_attributetype.get_absolute_url }}" />
+ {% endif %}{% endwith %}
+ <link rel="shortlink" href="{{ object.short_url }}" />
+ <link rel="canonical" href="{{ object.get_absolute_url }}" />
+ {% with year=object.creation_date|date:"Y" month=object.creation_date|date:"m" day=object.creation_date|date:"d" %}
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of discussions on" %} '{{ object.title }}'"
+ href="{% url gstudio_attributetype_discussion_feed year month day object.slug %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of comments on" %} '{{ object.title }}'"
+ href="{% url gstudio_attributetype_comment_feed year month day object.slug %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of pingbacks on" %} '{{ object.title }}'"
+ href="{% url gstudio_attributetype_pingback_feed year month day object.slug %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of trackbacks on" %} '{{ object.title }}'"
+ href="{% url gstudio_attributetype_trackback_feed year month day object.slug %}" />
+ {% endwith %}
+{% endblock %}
+
+
+{% block content %}
+
+
+{% block attributetype-content %}
+ {% with object.html_content|safe as object_content %}
+
+
+ <b>Test successful : </b> {{ object.title }} <br/>
+
+ {% for key,value in object.get_rendered_nbh.items %}
+
+ {% if value %}
+ {% if key == "altnames" %}
+ <b> Alternate names :<nbsp></b>
+ {{value}} <br/>
+ {% endif %}
+ {% if key == "plural" %}
+ <b> Plural Name :<nbsp></b>
+ {{value}} <br/>
+ {% endif %}
+ {% if key == "type_of" %}
+ <b> Type of :<nbsp></b>
+ {{value}} <br/>
+ {% endif %}
+ {% if key == "contains_subtypes" %}
+ <b> SubTypes :<nbsp></b>
+ {{value}} <br/>
+ {% endif %}
+ {% if key == "siblings" %}
+ {% if value %}
+ <b>Siblings: <nbsp> </b>
+ {% endif %}
+ {% for sibkey,sibvalue in value.items %}
+ <a href="{{sibvalue}}">{{sibkey}}</a>;
+ {% endfor %} <br/>
+ {% endif %}
+ {% if key == "member_of_metatypes" %}
+ <b> Member of Metatypes :<nbsp></b>
+ {% for mkey,mvalue in value.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+ {% if key == "contains_members" %}
+ <b>Contains Member objects :<nbsp></b>
+ {% for mkey,mvalue in value.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+ {% if key == "leftroles" %}
+ <b>Left role of Relation types :<nbsp></b>
+ {% for lftkey, lftvalue in value.items %}
+ <a href="{{lftvalue}}">{{lftkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+ {% if key == "rightroles" %}
+ <b>Right role of Relation types :<nbsp></b>
+ {% for rghtkey, rghtvalue in value.items %}
+ <a href="{{rghtvalue}}">{{rghtkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+ {% if key == "posteriornodes" %}
+ <b>Posterior nodes :<nbsp></b>
+ {% for mkey,mvalue in value.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+ {% if key == "priornodes" %}
+ <b>Priornodes :<nbsp></b>
+ {% for mkey,mvalue in value.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+
+
+
+ {% endif %}
+ {% endfor %}
+
+
+
+ {% endwith %}
+ {% endblock %}
+
+
+
+{% block attributetype-widgets %}
+<div class="attributetype-widgets span-16 last"> {% with object.next_attributetype as next_attributetype %}
+ {% if object.posteriornodes.all %}
+ <div class="attributetype-next">
+ <h5>{% trans "Posterior node" %}</h5>
+ {% for items in object.posteriornodes.all %}
+ <a href="{{ items.get_absolute_url }}"> {{ items.title }}</a>;
+ {% endfor %}
+ </div>
+ {% endif %}
+ {% endwith %}
+ <!-- {% with object.previous_attributetype as previous_attributetype %} -->
+ {% if object.priornodes.all %}
+ <div class="attributetype-next">
+ <h5>{% trans "Prior node" %}</h5>
+ {% for items in object.priornodes.all %}
+ <a href="{{ items.get_absolute_url }}"> {{ items.title }}</a>;
+ {% endfor %}
+ </div>
+ {% endif %}
+ {% endwith %}
+ {% if object.related_published %}
+ <div class="attributetype-related">
+ <h5>{% trans "Related node types" %}</h5>
+ <ul>
+ {% for attributetype in object.related_published %}
+ <li>
+ <a href="{{ attributetype.get_absolute_url }}" title="{{ attributetype.title }}" rel="bookmark">{{ attributetype.title }}</a>
+ </li>
+ {% endfor %}
+ </ul>
+ </div>
+ {% endif %}
+</div>
+{% endblock %}
+
+{% block attributetype-comments %}
+<div id="comments" class="span-16 last">
+ <h5>{% trans "Comments" %}</h5>
+ {% with object.comments as comment_list %}
+ {% if comment_list.count %}
+ <ol id="comment-list" class="span-15 last">
+ {% for comment in comment_list %}
+ <li id="comment_{{ comment.pk }}" class="comment vcard {% cycle box1,box2 %}{% if comment.user in object.authors.all %} post-author{% endif %} span-15 last">
+ <div class="span-2">
+ <img src="{% get_gravatar comment.email 60 "G" %}" class="gravatar photo" alt="{{ comment.user_name }}"/>
+ </div>
+ <div class="comment-body span-13 last">
+ <div class="comment-author span-13 last">
+ {% if comment.url %}
+ <a href="{{ comment.url }}" class="fn url">{{ comment.user_name }}</a>
+ {% else %}
+ {{ comment.user_name }}
+ {% endif %}
+ {% trans "on" %} {{ comment.submit_date|date:"SHORT_DATETIME_FORMAT" }}
+ </div>
+ <div class="span-13 last">
+ {{ comment.comment|linebreaks }}
+ </div>
+ </div>
+ </li>
+ {% endfor %}
+ </ol>
+ {% if not object.comments_are_open %}
+ <p>{% trans "Comments are closed." %}</p>
+ {% endif %}
+ {% else %}
+ {% if object.comments_are_open %}
+ <p>{% trans "No comments yet." %}</p>
+ {% else %}
+ <p>{% trans "Comments are closed." %}</p>
+ {% endif %}
+ {% endif %}
+ {% endwith %}
+</div>
+{% endblock %}
+
+{% block attributetype-pingbacks %}
+<div id="pingbacks" class="span-16 last">
+ <h5>{% trans "Pingbacks" %}</h5>
+ {% with object.pingbacks as pingback_list %}
+ {% if pingback_list.count %}
+ <ol id="pingback-list" class="span-15 last">
+ {% for pingback in pingback_list %}
+ <li id="pingback_{{ pingback.pk }}" class="pingback {% cycle box1,box2 %} span-15 last">
+ <div class="pingback-body span-15 last">
+ <div class="pingback-author span-15 last">
+ <a href="{{ pingback.url }}">{{ pingback.user_name }}</a>
+ {% trans "on" %} {{ pingback.submit_date|date:"SHORT_DATETIME_FORMAT" }}
+ </div>
+ <div class="span-15 last">
+ <cite>
+ {{ pingback.comment }}
+ </cite>
+ </div>
+ </div>
+ </li>
+ {% endfor %}
+ </ol>
+ {% endif %}
+ {% if object.pingback_enabled %}
+ <p>{% trans "Pingbacks are open." %}</p>
+ {% else %}
+ <p>{% trans "Pingbacks are closed." %}</p>
+ {% endif %}
+ {% endwith %}
+</div>
+{% endblock %}
+
+{% block attributetype-trackbacks %}
+{% with object.trackbacks as trackback_list %}
+{% if trackback_list.count or object.pingback_enabled %}
+<div id="trackbacks" class="span-16 last">
+ <h5>{% trans "Trackbacks" %}</h5>
+ {% if trackback_list.count %}
+ <ol id="trackback-list" class="span-15 last">
+ {% for trackback in trackback_list %}
+ <li id="trackback_{{ trackback.pk }}" class="trackback {% cycle box1,box2 %} span-15 last">
+ <div class="trackback-body span-15 last">
+ <div class="trackback-author span-15 last">
+ <a href="{{ trackback.url }}">{{ trackback.user_name }}</a>
+ {% trans "on" %} {{ trackback.submit_date|date:"SHORT_DATETIME_FORMAT" }}
+ </div>
+ <div class="span-15 last">
+ <cite>
+ {{ trackback.comment }}
+ </cite>
+ </div>
+ </div>
+ </li>
+ {% endfor %}
+ </ol>
+ {% endif %}
+ {% if object.pingback_enabled %}
+ <p>
+ <a href="{% url gstudio_attributetype_trackback object.pk %}" rel="trackback">
+ {% trans "Trackback URL" %}</a>
+ </p>
+ {% endif %}
+</div>
+{% endif %}
+{% endwith %}
+{% endblock %}
+
+{% block attributetype-comments-form %}
+{% if object.comments_are_open %}
+<div class="commentForm span-16 last">
+ {% render_comment_form for object %}
+</div>
+{% endif %}
+{% endblock %}
+
+{% endblock %}
+
+{% block admin_tools %}
+{% if perms.gstudio.change_attributetype %}
+<li>
+ <a href="{% url admin:gstudio_objecttype_change object.pk %}" title="{% trans "Edit the attributetype" %}">
+ {% trans "Edit the node type" %}
+ </a>
+</li>
+{% endif %}
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/author/nodetype_list.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/author/nodetype_list.html
new file mode 100644
index 0000000..54b8914
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/author/nodetype_list.html
@@ -0,0 +1 @@
+{% extends "gstudio/nodetype_list.html" %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/author_list.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/author_list.html
new file mode 100644
index 0000000..2fd0295
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/author_list.html
@@ -0,0 +1,27 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block meta-description %}{% trans "Author list" %}{% endblock %}
+
+{% block title %}{% trans "Authors" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Author list" %}</h2>
+<div>
+ <ul>
+ {% for object in object_list %}
+ <li class="vcard">
+ <a href="{% url gstudio_author_detail object.username %}"
+ title="{{ object.username }}" class="fn nickname url">
+ {{ object.username }}
+ </a>
+ {% blocktrans count object.nodetypes_published.count as nodetype_count %}{{ nodetype_count }} nodetype{% plural %}{{ nodetype_count }} nodetypes{% endblocktrans %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No authors yet." %}
+ </li>
+ {% endfor %}
+ </ul>
+</div>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/base.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/base.html
new file mode 100644
index 0000000..2c612e1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/base.html
@@ -0,0 +1,108 @@
+{% extends "gstudio/skeleton.html" %}
+{% load gstudio_tags i18n %}
+{% load objectapp_tags i18n %}
+
+ {% block meta %}
+ <meta name="generator" content="Objectapp {{ OBJECTAPP_VERSION }}" />
+{% endblock %}
+
+{% block link %}
+ <link rel="index" href="{% url objectapp_gbobject_archive_index %}" />
+ <link rel="EditURI" type="application/rsd+xml" href="{% url objectapp_rsd %}" />
+ <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="{% url objectapp_wlwmanifest %}" />
+ <link rel="search" type="application/opensearchdescription+xml" title="Objectapp's Blog" href="{% url objectapp_opensearch %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of latest gbobjects" %}" href="{% url objectapp_gbobject_latest_feed %}" />
+ <!-- {% get_archives_gbobjects "objectapp/tags/archives_gbobjects_link.html" %} -->
+{% endblock %}
+
+{% block breadcrumbs %}
+ {% gstudio_breadcrumbs %}
+{% endblock %}
+
+{% block sidebar %}
+ <img src="{{ STATIC_URL }}objectapp/img/rss.png" alt="?" width="20" height="" />
+ <a href="{% url objectapp_gbobject_latest_feed %}" class="feeds"><h4>Rssfeed</h4></a>
+
+<div class="search">
+ <h3>{% trans "Search" %}</h3>
+ <form method="get" id="searchform" action="{% url objectapp_gbobject_search %}">
+ <p>
+ <input type="text" value="{% trans "Keywords..." %}" name="pattern" id="searchbox" onfocus="this.value=''" />
+ <input type="submit" class="submitbutton" value="OK" />
+ <a title="{% trans 'You can use - to exclude words or phrases, &quot;double quotes&quot; for exact phrases and the AND/OR boolean operators combined with parenthesis for complex searchs.' %}">
+ <img src="{{ STATIC_URL }}objectapp/img/help.png" alt="?" width="14" height="14" />
+ </a>
+ </p>
+ </form>
+</div>
+<div class="objecttypes">
+ <h3>{% trans "Objecttypes" %}</h3>
+ {% get_objecttypes %}
+</div>
+<div class="authors">
+ <h3>{% trans "Authors" %}</h3>
+ {% get_authors %}
+</div>
+<div class="calendar">
+ <h3>{% trans "Calendar" %}</h3>
+ {% get_calendar_gbobjects %}
+</div>
+<div class="tags">
+ <h3>{% trans "Tags" %}</h3>
+ {% get_tag_cloud %}
+</div>
+<div class="recents">
+ <h3>{% trans "Recent gbobjects" %}</h3>
+ {% get_recent_gbobjects 5 %}
+</div>
+<div class="comments">
+ <h3>{% trans "Recent comments" %}</h3>
+ {% get_recent_comments 5 %}
+</div>
+<div class="linkbacks">
+ <h3>{% trans "Recent linkbacks" %}</h3>
+ {% get_recent_linkbacks 5 %}
+</div>
+<div class="randoms">
+ <h3>{% trans "Random gbobjects" %}</h3>
+ {% get_random_gbobjects 5 %}
+</div>
+<div class="populars">
+ <h3>{% trans "Popular gbobjects" %}</h3>
+ {% get_popular_gbobjects 5 %}
+</div>
+<div class="archives">
+ <h3>{% trans "Archives" %}</h3>
+ {% get_archives_gbobjects_tree %}
+</div>
+{% if user.is_authenticated %}
+<div class="tools">
+ <h3>{% trans "Tools" %}</h3>
+ <ul>
+ {% if perms.objectapp %}
+ <li>
+ <a href="{% url admin:app_list "objectapp" %}" title="{% trans "Dashboard" %}">
+ {% trans "Dashboard" %}
+ </a>
+ </li>
+ {% endif %}
+ {% if perms.objectapp.add_gbobject %}
+ <li>
+ <a href="{% url admin:objectapp_gbobject_add %}" title="{% trans "Post an gbobject" %}">
+ {% trans "Post an gbobject" %}
+ </a>
+ </li>
+ {% endif %}
+ {% block admin_tools %}
+ {% endblock %}
+ <li>
+ <a href="{% url admin:logout %}" title="{% trans "Log out" %}">
+ {% trans "Log out" %}
+ </a>
+ </li>
+ </ul>
+</div>
+{% endif %}
+{% endblock %}
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/nodetype_detail.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/nodetype_detail.html
new file mode 100644
index 0000000..70bd8df
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/nodetype_detail.html
@@ -0,0 +1,8 @@
+{% load i18n %}
+{% for nodetype in nodetypes %}
+ {% with object=nodetype object_content=nodetype.html_content|truncatewords_html:100|safe %}
+ {% include "gstudio/_nodetype_detail.html" %}
+ {% endwith %}
+{% empty %}
+ <p class="notice">{% trans "No node types yet." %}</p>
+{% endfor %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/nodetype_list.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/nodetype_list.html
new file mode 100644
index 0000000..5b7806b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/nodetype_list.html
@@ -0,0 +1,12 @@
+{% load i18n %}
+<ul>
+ {% for nodetype in nodetypes %}
+ <li>
+ <a href="{{ nodetype.get_absolute_url }}" title="{{ nodetype.title }}" rel="bookmark">{{ nodetype.title }}</a>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No nodetypes yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/random_nodetypes.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/random_nodetypes.html
new file mode 100644
index 0000000..a3ae25c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/cms/random_nodetypes.html
@@ -0,0 +1,4 @@
+{% load gstudio_tags %}
+
+{% get_random_nodetypes number_of_nodetypes template_to_render %}
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/graph1.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/graph1.html
new file mode 100644
index 0000000..587b703
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/graph1.html
@@ -0,0 +1,347 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8">
+ <title>Objecttype Force-Directed Graph</title>
+
+ <link rel="stylesheet" href="/static/gstudio/css/jquery-ui.css" type="text/css" media="all">
+
+ <style type="text/css">
+ .link {
+ stroke : #ccc;
+ }
+
+ .nodetext {
+ pointer-events : none;
+ font : 10px sans-serif;
+ }
+
+ .node {
+ border-width : 1px;
+ border-color : gray;
+ }
+ body {
+ background-color:white;
+ }
+
+ #chart {
+ height: 90%;
+ margin: 0 auto;
+ width: 90%;
+ }
+
+ svg {
+ margin-left: 10%;
+ margin-right: 10%;
+ display: block;
+ position:absolute;
+ }
+
+
+ </style>
+
+
+</head>
+
+
+<body marginwidth="0" marginheight="0">
+<div class="body" >
+ <div class="content">
+
+ <!--
+ <div id="relation_type" class="ui-buttonset">
+ <span>Relation type:</span>
+ <input checked="checked" value="follows" type="radio" id="follows" name="radio" class="ui-helper-hidden-accessible"><label for="follows" class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-left" aria-pressed="false" role="button" aria-disabled="false"><span class="ui-button-text">Followers</span></label>
+ <input value="mentions" type="radio" id="mentions" name="radio" class="ui-helper-hidden-accessible"><label for="mentions" aria-pressed="true" class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-right ui-state-active" role="button" aria-disabled="false"><span class="ui-button-text">Mentions</span></label>
+ <input value="hashtags" type="radio" id="hashtags" name="radio"/><label for="hashtags">Shared interests</label>
+ </div>
+ -->
+ <div id="chart"><svg width="960" height="700" style="opacity: 1; ">
+ </div>
+
+
+ <script type="text/javascript" src="/static/gstudio/js/jquery.min.js" ></script>
+ <script type="text/javascript" src="/static/gstudio/js/jquery-ui.js" ></script>
+
+ <script type="text/javascript" src="/static/gstudio/js/underscore.js" ></script>
+
+ <script type="text/javascript" src="/static/gstudio/js/d3.js"></script>
+ <script type="text/javascript" src="/static/gstudio/js/d3.layout.js"></script>
+ <script type="text/javascript" src="/static/gstudio/js/d3.geom.js"></script>
+<!-- <script type="text/javascript" src="/static/gstudio/js/force.js"></script>
+
+Javascript for Object type force graph
+-->
+ <script type="text/javascript" >
+
+ var w = 960,
+ h = 700,
+ fill = d3.scale.category20();
+
+ var vis = d3.select("#chart")
+ .append("svg:svg")
+ .attr("width", w)
+ .attr("height", h);
+
+ vis.append("svg:g").attr("class", "edges");
+ vis.append("svg:g").attr("class", "nodes");
+
+$(function() {
+ $.ajax({
+ url: '/gstudio/graphs/graph_json/{{ node_id }}' ,
+ //crossDomain: true,
+ dataType: 'json',
+ success : function(json) {
+
+ var force;
+
+ // this contains all the nodes as a dict with _id as the key
+
+ var nodes_by_id = _.reduce(json.node_metadata, function(acc, n) {
+ acc[n._id] = n;
+ return acc;
+ }, {});
+
+ var member_of_metatype = _(json.member_of_metatype).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'member_of_metatype';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var contains_subtypes = _(json.contains_subtypes).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'contains_subtypes';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var contains_members = _(json.contains_members).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'contains_members';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var left_subjecttype_of = _(json.left_subjecttype_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'left_subjecttype_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var subjecttype_of = _(json.subjecttype_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'subjecttype_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var type_of = _(json.type_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'type_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var right_subjecttype_of = _(json.right_subjecttype_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'right_subjecttype_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var follows_edges = _(json.is_followed_by).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'follows_edges';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var mentions_edges = _(json.is_mentioned_by).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'mentions_edges';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ nodes_by_id[{{ node_id }}].x = w/2.0;
+ nodes_by_id[{{ node_id }}].y = h/2.0;
+
+ all_edges = new Array();
+ all_edges = all_edges.concat(follows_edges, member_of_metatype, contains_members, contains_subtypes, mentions_edges, right_subjecttype_of, left_subjecttype_of, subjecttype_of, type_of);
+ /* all_edges.concat(follows_edges);
+ all_edges.concat(member_of_metatype);
+ all_edges.concat(contains_members);
+ all_edges.concat(contains_subtypes);
+ all_edges.concat(mentions_edges);
+
+
+ document.getElementById('debugbox1').value= follows_edges; //member_of_metatype
+ document.getElementById('debugbox2').value= mentions_edges;
+ //document.getElementById('debugbox2').value= member_of_metatype;
+ document.getElementById('debugbox3').value= all_edges;
+ */
+ var force = d3.layout.force()
+ .linkStrength(0.5)
+ .charge(-2000)
+ .friction(0.7)
+ .gravity(0.7)
+ .linkDistance(50)
+ .nodes([])
+ .links([])
+ .size([w, h])
+ .start();
+
+ function update(edges){
+ // for each func
+ _.each(nodes_by_id, function(n){n.added = false});
+ // reduce the nodes list to have only those nodes for a given rel.
+ nodes = _.reduce(edges, function(acc, e) {
+ if(nodes_by_id[e.from] && !nodes_by_id[e.from].added){
+ nodes_by_id[e.from].added = true;
+ acc.push(nodes_by_id[e.from]);
+ }
+ if(nodes_by_id[e.to] && !nodes_by_id[e.to].added){
+ nodes_by_id[e.to].added = true;
+ acc.push(nodes_by_id[e.to]);
+ }
+ return acc;
+ }, []);
+
+ force.nodes(nodes);
+ force.links(edges);
+ force.start();
+
+ link = d3.select("#chart g.edges").selectAll("line.link")
+ .data(edges, function(e){return e.from + "-" + e.to + "-" + e.type});
+
+ link.enter().append("svg:line")
+ .attr("class", "link")
+ .style("stroke-width", 2 /* function(d) {
+ return Math.sqrt(d.value);
+ } */ )
+ .attr("x1", function(d) {
+ return d.source.x;
+ })
+ .attr("y1", function(d) {
+ return d.source.y;
+ })
+ .attr("x2", function(d) {
+ return d.target.x;
+ })
+ .attr("y2", function(d) {
+ return d.target.y;
+ })
+ .append("a")
+ .text(function(d) { return d.type; });
+
+
+ var node = d3.select("#chart g.nodes").selectAll("g.node").data(nodes);
+
+ var new_g = node.enter().append("svg:g")
+ .attr("class", "node")
+ .call(force.drag);
+
+ /* new_g.append("svg:image").attr('xlink:href',
+ function(d) {
+ return d.profile_image_url;
+ }).attr('height', 32).attr('width', 32);
+ */
+
+ new_g.append("svg:circle")
+ .attr("cx", function(d) { return d.x - w/2.0 + 15; })
+ .attr("cy", function(d) { return d.y - h/2.0 + 15; })
+ .attr("r", 7)
+ .style("fill", "steelblue");
+ /*
+ new_g.append("svg:circle")
+ .attr("fill", "steelblue")
+ .attr("text-anchor", "middle")
+ .text(function(d) {
+ return d.screen_name;
+ });
+ */
+ new_g.append("svg:text")
+ .attr("dy", 20)
+ .attr("dx", 25)
+
+ /* .attr("text-anchor", "middle") */
+ .text(function(d) {
+ return d.screen_name;
+ });
+
+ node.exit().remove();
+
+
+ force.on("tick", function() {
+
+ var x_center = $("#chart").width() / 2;
+ var y_center = $("#chart").height() / 2;
+
+ link.attr("x1", function(d) { return d.source.x; })
+ .attr("y1", function(d) { return d.source.y; })
+ .attr("x2", function(d) { return d.target.x; })
+ .attr("y2", function(d) { return d.target.y; });
+
+ node.attr("transform", function(d) { return "translate(" + (d.x-16) + "," + (d.y-16) + ")"; });
+
+ });
+ }
+
+ update(all_edges);
+ vis.style("opacity", 1e-6)
+ .transition()
+ .duration(1000)
+ .style("opacity", 1);
+
+ /* $('input#follows').change(function(){
+ update(all_edges);
+ });
+ */
+
+ /* $('input#mentions').change(function(){
+ update(all_edges);
+ }); */
+ }
+ });
+
+// $("#relation_type").buttonset();
+
+// $('input#mentions').change(function(){console.log(this)});
+// $('input#follows').change(function(){console.log(this)});
+});
+
+
+</script>
+
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/login.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/login.html
new file mode 100644
index 0000000..690d0be
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/login.html
@@ -0,0 +1,40 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block title %}{% trans "Login required" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Login required" %} </a> </h2>
+
+<div class="nodetype_login">
+ {% if form.errors %}
+ <p class="error">
+ {% trans "Your username and password didn't match. Please try again." %}
+ </p>
+ {% endif %}
+ <p>
+ {% trans "You need to be connected to view this nodetype." %}
+ </p>
+
+ <form method="post" action=".">
+ {% csrf_token %}
+ <table>
+ <tr>
+ <td>{{ form.username.label_tag }}</td>
+ <td>{{ form.username }}</td>
+ </tr>
+ <tr>
+ <td>{{ form.password.label_tag }}</td>
+ <td>{{ form.password }}</td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input type="hidden" name="next" value="." />
+ <input type="submit" value="{% trans "Login" %}" />
+ </td>
+ </tr>
+ </table>
+ </form>
+</div>
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/metatype/nodetype_list.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/metatype/nodetype_list.html
new file mode 100644
index 0000000..54b8914
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/metatype/nodetype_list.html
@@ -0,0 +1 @@
+{% extends "gstudio/nodetype_list.html" %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/metatype_list.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/metatype_list.html
new file mode 100644
index 0000000..bff3842
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/metatype_list.html
@@ -0,0 +1,25 @@
+{% extends "gstudio/base.html" %}
+{% load i18n mptt_tags %}
+
+{% block meta-description %}{% trans "Metatype list" %}{% endblock %}
+
+{% block title %}{% trans "Metatypes" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Metatype list" %}</h2>
+<div>
+ {% for object, structure in object_list|tree_info %}
+ {% if structure.new_level %}<ul><li>{% else %}</li><li>{% endif %}
+ <a href="{{ object.get_absolute_url }}" title="{{ object }}">{{ object }}</a>
+ {% blocktrans count object.nodetypes_published.count as nodetype_count %}{{ nodetype_count }} nodetype{% plural %}{{ nodetype_count }} nodetypes{% endblocktrans %}
+ {% if object.description %}<br />{{ object.description|striptags|safe }}{% endif %}
+ {% for level in structure.closed_levels %}</li></ul>{% endfor %}
+ {% empty %}
+ <ul>
+ <li>
+ {% trans "No metatypes yet." %}
+ </li>
+ </ul>
+ {% endfor %}
+</div>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive.html
new file mode 100644
index 0000000..2054cc4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive.html
@@ -0,0 +1,30 @@
+{% extends "gstudio/nodetype_list.html" %}
+{% load i18n gstudio_tags %}
+
+{% block meta-description %}{% trans "Latest nodetypes" %}{% endblock %}
+
+{% block link %}
+ {{ block.super }}
+ <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}gstudio/css/slider.css" />
+{% endblock %}
+
+{% block script %}
+ {{ block.super }}
+ <script type="text/javascript" src="{{ STATIC_URL }}gstudio/js/jquery.js"></script>
+ <script type="text/javascript" src="{{ STATIC_URL }}gstudio/js/jquery.ui.js"></script>
+ <script type="text/javascript">
+ $(document).ready(function(){
+ $("#slider").tabs({ fx:{ opacity: "toggle"}}).tabs("rotate", 5000, true);
+ $("#slider").hover(
+ function() { $("#slider").tabs("rotate", 0, true); },
+ function() { $("#slider").tabs("rotate", 5000, true); });
+ });
+ </script>
+{% endblock %}
+
+{% block title %}{% trans "Latest nodetypes" %}{% endblock %}
+
+{% block content %}
+{% get_featured_nodetypes 5 "gstudio/tags/slider_nodetypes.html" %}
+{{ block.super }}
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_day.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_day.html
new file mode 100644
index 0000000..d95391f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_day.html
@@ -0,0 +1,23 @@
+{% extends "gstudio/nodetype_list.html" %}
+{% load i18n %}
+
+{% block meta-description %}{% trans "Archives" %} {{ day|date:"DATE_FORMAT" }}{% endblock %}
+
+{% block title %}{% trans "Archives" %} {{ day|date:"DATE_FORMAT" }}{% endblock %}
+
+{% block content %}
+<h1>{% trans "Archives" %} {{ day|date:"DATE_FORMAT" }}</h1>
+
+{{ block.super }}
+
+<!--<ul>
+ <li>
+ <a href="{% url gstudio_nodetype_archive_day previous_day|date:"Y" previous_day|date:"m" previous_day|date:"d" %}" rel="archives">{{ previous_day|date:"DATE_FORMAT" }}</a>
+ </li>
+ {% if next_day %}
+ <li>
+ <a href="{% url gstudio_nodetype_archive_day next_day|date:"Y" next_day|date:"m" next_day|date:"d" %}" rel="archives">{{ next_day|date:"DATE_FORMAT" }}</a>
+ </li>
+ {% endif %}
+</ul>-->
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_month.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_month.html
new file mode 100644
index 0000000..e09d0d7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_month.html
@@ -0,0 +1,31 @@
+{% extends "gstudio/nodetype_list.html" %}
+{% load i18n %}
+
+{% block meta-description %}{% trans "Archives" %} {{ month|date:"YEAR_MONTH_FORMAT" }}{% endblock %}
+
+{% block title %}{% trans "Archives" %} {{ month|date:"YEAR_MONTH_FORMAT" }}{% endblock %}
+
+{% block content %}
+<h1>{% trans "Archives" %} {{ month|date:"YEAR_MONTH_FORMAT" }}</h1>
+
+{{ block.super }}
+
+<h2>{% trans "Daily archives" %}</h2>
+<ul>
+ {% for date in date_list %}
+ <li>
+ <a href="{% url gstudio_nodetype_archive_day date|date:"Y" date|date:"m" date|date:"d" %}" rel="archives">{{ date|date:"DATE_FORMAT" }}</a>
+ </li>
+ {% endfor %}
+</ul>
+<!--<ul>
+ <li>
+ <a href="{% url gstudio_nodetype_archive_month previous_month|date:"Y" previous_month|date:"m" %}" rel="archives">{{ previous_month|date:"YEAR_MONTH_FORMAT" }}</a>
+ </li>
+ {% if next_month %}
+ <li>
+ <a href="{% url gstudio_nodetype_archive_month next_month|date:"Y" next_month|date:"m" %}" rel="archives">{{ next_month|date:"YEAR_MONTH_FORMAT" }}</a>
+ </li>
+ {% endif %}
+</ul>-->
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_year.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_year.html
new file mode 100644
index 0000000..62e3cf9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_archive_year.html
@@ -0,0 +1,21 @@
+{% extends "gstudio/nodetype_list.html" %}
+{% load i18n %}
+
+{% block meta-description %}{% trans "Archives" %} {{ year }}{% endblock %}
+
+{% block title %}{% trans "Archives" %} {{ year }}{% endblock %}
+
+{% block content %}
+<h1>{% trans "Archives" %} {{ year }}</h1>
+
+{{ block.super }}
+
+<h2>{% trans "Monthly archives" %}</h2>
+<ul>
+ {% for date in date_list %}
+ <li>
+ <a href="{% url gstudio_nodetype_archive_month year date|date:"m" %}" rel="archives">{{ date|date:"YEAR_MONTH_FORMAT" }}</a>
+ </li>
+ {% endfor %}
+</ul>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_detail.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_detail.html
new file mode 100644
index 0000000..f5740ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_detail.html
@@ -0,0 +1,364 @@
+{% extends "gstudio/base.html" %}
+{% load i18n comments gstudio_tags %}
+
+{% block title %}{{ object.title }}{% endblock %}
+
+{% block meta-description %}{% if object.excerpt %}{{ object.excerpt|striptags }}{% else %}{{ object.content|striptags|truncatewords:100 }}{% endif %}{% endblock %}
+
+{% block meta-keywords %}{% if object.tags %}{{ object.tags }}{% else %}{{ block.super }}{% endif %}{% endblock %}
+
+
+{% block link %}
+ {{ block.super }}
+ {% with object.previous_nodetype as previous_nodetype %}{% if previous_nodetype %}
+ <link rel="prev" title="{{ previous_nodetype.title }}" href="{{ previous_nodetype.get_absolute_url }}" />
+ {% endif %}{% endwith %}
+ {% with object.next_nodetype as next_nodetype %}{% if next_nodetype %}
+ <link rel="next" title="{{ next_nodetype.title }}" href="{{ next_nodetype.get_absolute_url }}" />
+ {% endif %}{% endwith %}
+ <link rel="shortlink" href="{{ object.short_url }}" />
+ <link rel="canonical" href="{{ object.get_absolute_url }}" />
+ {% with year=object.creation_date|date:"Y" month=object.creation_date|date:"m" day=object.creation_date|date:"d" %}
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of discussions on" %} '{{ object.title }}'"
+ href="{% url gstudio_nodetype_discussion_feed year month day object.slug %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of comments on" %} '{{ object.title }}'"
+ href="{% url gstudio_nodetype_comment_feed year month day object.slug %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of pingbacks on" %} '{{ object.title }}'"
+ href="{% url gstudio_nodetype_pingback_feed year month day object.slug %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of trackbacks on" %} '{{ object.title }}'"
+ href="{% url gstudio_nodetype_trackback_feed year month day object.slug %}" />
+ {% endwith %}
+{% endblock %}
+
+
+{% block content %}
+
+{% block nodetype-content %}
+<h2 class="nodetype-title">
+ <a href="{{ object.get_absolute_url }}" title="{{ object.title }}" rel="bookmark">
+ {{ object.title }}
+ </a>
+ <a href="{{ object.ref.get_edit_url }}" target="_blank" >[edit]</a>
+
+ </h2>
+ {% with object.html_content|safe as object_content %}
+
+
+ <b>Name:<nbsp></b> {{ object.title }} <br/>
+
+ {% if object.get_rendered_nbh.plural %}
+ <b> Plural Name:<nbsp></b>
+ {{object.get_rendered_nbh.plural}} <br/>
+ {% endif %}
+ {% if object.get_rendered_nbh.altnames %}
+ <b> Alternate names:<nbsp></b>
+ {{object.get_rendered_nbh.altnames}} <br/>
+ {% endif %}
+ {% if object.get_rendered_nbh.type_of %}
+ <b> Type of:<nbsp></b>
+ {% for typekey,typevalue in object.get_rendered_nbh.type_of.items %}
+ <a href="{{typevalue}}">{{typekey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+
+
+ {% if object.get_rendered_nbh.member_of_metatypes %}
+
+
+ <b> Member of Metatypes:<nbsp></b>
+ {% for mkey,mvalue in object.get_rendered_nbh.member_of_metatypes.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+
+
+
+ {% if object.get_rendered_nbh.contains_subtypes %}
+ <b> Contains SubTypes:<nbsp></b>
+ {% for stkey,stvalue in object.get_rendered_nbh.contains_subtypes.items %}
+ <a href="{{stvalue}}">{{stkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+
+
+ {% if object.get_rendered_nbh.contains_members %}
+
+
+ <b>Contains Members:<nbsp></b>
+ {% for mkey,mvalue in object.get_rendered_nbh.contains_members.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+
+
+ {% if object.get_rendered_nbh.authors %}
+
+
+
+ <b>Authors: <nbsp> </b>
+
+
+ {% endif %}
+
+ {% for author in object.authors.all %}
+ <span class="vcard author">
+ <a href="{% url gstudio_author_detail author %}" class="fn nickname url" rel="author"
+ title="{% blocktrans with author as author %}Show {{ author }} nodetypes{% endblocktrans %}">{{ author }}</a>
+ </span>{% if not forloop.last %}, {% endif %}
+ {% endfor %} <br/>
+
+ {% if object.get_rendered_nbh.siblings %}
+
+
+ <b>Siblings:<nbsp> </b>
+
+ {% for sibkey,sibvalue in object.get_rendered_nbh.siblings.items %}
+ {{sibkey}};
+ <!--
+ <a href="{{sibvalue}}">{{sibkey}}</a>;
+ -->
+ {% endfor %} <br/>
+ {% endif %}
+
+ {% if object.get_rendered_nbh.priornodes %}
+
+
+ <b>Prior nodes:<nbsp></b>
+ {% for mkey,mvalue in object.get_rendered_nbh.priornodes.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+
+ {% if object.get_rendered_nbh.posteriornodes %}
+
+
+ <b>Posterior nodes:<nbsp></b>
+ {% for mkey,mvalue in object.get_rendered_nbh.posteriornodes.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+
+ {% if object.get_rendered_nbh.relations %}
+
+
+ {% for relkey,relvalue in object.get_rendered_nbh.relations.items %}
+ <b>{{relkey}}:<nbsp></b>
+ {% for relk, relv in relvalue.items %}
+ <a href="{{relv}}">{{relk}}</a>;
+ {% endfor %}<br/>
+ {% endfor %}
+ {% endif %}
+
+ {% if object.get_rendered_nbh.attributes %}
+
+ {% for atkey,atvalue in object.get_rendered_nbh.attributes.items %}
+ {% if atvalue %}
+ <b>{{atkey}}:<nbsp> </b>
+ {% for atr in atvalue %}
+ {{atr}};
+ {% endfor %} <br/>
+ {% endif %}
+ {% endfor %}
+ {% endif %}
+ {% if object.get_rendered_nbh.leftroles %}
+
+
+ <b>Left roles:<nbsp> </b>
+
+ {% for lrkey,lrvalue in object.get_rendered_nbh.leftroles.items %}
+ <a href="{{lrvalue}}">{{lrkey}}</a>;
+ {% endfor %} <br/>
+ {% endif %}
+
+ {% if object.get_rendered_nbh.rightroles %}
+
+ <b>Right roles:<nbsp> </b>
+
+ {% for rrkey,rrvalue in object.get_rendered_nbh.rightroles.items %}
+ <a href="{{rrvalue}}">{{rrkey}}</a>;
+ {% endfor %} <br/>
+ {% endif %}
+
+
+ {% if object.get_rendered_nbh.ats %}
+
+
+ <b>Subjecttype of:<nbsp> </b>
+
+ {% for atkey,atvalue in object.get_rendered_nbh.ats.items %}
+ <a href="{{atvalue}}">{{atkey}}</a>;
+ {% endfor %} <br/>
+ {% endif %}
+
+
+
+
+
+ {% endwith %}
+ {% endblock %}
+
+
+
+{% block nodetype-widgets %}
+<div class="nodetype-widgets span-16 last"> {% with object.next_nodetype as next_nodetype %}
+ {% if object.posteriornodes.all %}
+ <div class="nodetype-next">
+ <h5>{% trans "Posterior node" %}</h5>
+ {% for items in object.posteriornodes.all %}
+ <a href="{{ items.get_absolute_url }}"> {{ items.title }}</a>;
+ {% endfor %}
+ </div>
+ {% endif %}
+ {% endwith %}
+ <!-- {% with object.previous_nodetype as previous_nodetype %} -->
+ {% if object.priornodes.all %}
+ <div class="nodetype-next">
+ <h5>{% trans "Prior node" %}</h5>
+ {% for items in object.priornodes.all %}
+ <a href="{{ items.get_absolute_url }}"> {{ items.title }}</a>;
+ {% endfor %}
+ </div>
+ {% endif %}
+ {% endwith %}
+ {% if object.related_published %}
+ <div class="nodetype-related">
+ <h5>{% trans "Related node types" %}</h5>
+ <ul>
+ {% for nodetype in object.related_published %}
+ <li>
+ <a href="{{ nodetype.get_absolute_url }}" title="{{ nodetype.title }}" rel="bookmark">{{ nodetype.title }}</a>
+ </li>
+ {% endfor %}
+ </ul>
+ </div>
+ {% endif %}
+</div>
+{% endblock %}
+
+{% block nodetype-comments %}
+<div id="comments" class="span-16 last">
+ <h5>{% trans "Comments" %}</h5>
+ {% with object.comments as comment_list %}
+ {% if comment_list.count %}
+ <ol id="comment-list" class="span-15 last">
+ {% for comment in comment_list %}
+ <li id="comment_{{ comment.pk }}" class="comment vcard {% cycle box1,box2 %}{% if comment.user in object.authors.all %} post-author{% endif %} span-15 last">
+ <div class="span-2">
+ <img src="{% get_gravatar comment.email 60 "G" %}" class="gravatar photo" alt="{{ comment.user_name }}"/>
+ </div>
+ <div class="comment-body span-13 last">
+ <div class="comment-author span-13 last">
+ {% if comment.url %}
+ <a href="{{ comment.url }}" class="fn url">{{ comment.user_name }}</a>
+ {% else %}
+ {{ comment.user_name }}
+ {% endif %}
+ {% trans "on" %} {{ comment.submit_date|date:"SHORT_DATETIME_FORMAT" }}
+ </div>
+ <div class="span-13 last">
+ {{ comment.comment|linebreaks }}
+ </div>
+ </div>
+ </li>
+ {% endfor %}
+ </ol>
+ {% if not object.comments_are_open %}
+ <p>{% trans "Comments are closed." %}</p>
+ {% endif %}
+ {% else %}
+ {% if object.comments_are_open %}
+ <p>{% trans "No comments yet." %}</p>
+ {% else %}
+ <p>{% trans "Comments are closed." %}</p>
+ {% endif %}
+ {% endif %}
+ {% endwith %}
+</div>
+{% endblock %}
+
+{% block nodetype-pingbacks %}
+<div id="pingbacks" class="span-16 last">
+ <h5>{% trans "Pingbacks" %}</h5>
+ {% with object.pingbacks as pingback_list %}
+ {% if pingback_list.count %}
+ <ol id="pingback-list" class="span-15 last">
+ {% for pingback in pingback_list %}
+ <li id="pingback_{{ pingback.pk }}" class="pingback {% cycle box1,box2 %} span-15 last">
+ <div class="pingback-body span-15 last">
+ <div class="pingback-author span-15 last">
+ <a href="{{ pingback.url }}">{{ pingback.user_name }}</a>
+ {% trans "on" %} {{ pingback.submit_date|date:"SHORT_DATETIME_FORMAT" }}
+ </div>
+ <div class="span-15 last">
+ <cite>
+ {{ pingback.comment }}
+ </cite>
+ </div>
+ </div>
+ </li>
+ {% endfor %}
+ </ol>
+ {% endif %}
+ {% if object.pingback_enabled %}
+ <p>{% trans "Pingbacks are open." %}</p>
+ {% else %}
+ <p>{% trans "Pingbacks are closed." %}</p>
+ {% endif %}
+ {% endwith %}
+</div>
+{% endblock %}
+
+{% block nodetype-trackbacks %}
+{% with object.trackbacks as trackback_list %}
+{% if trackback_list.count or object.pingback_enabled %}
+<div id="trackbacks" class="span-16 last">
+ <h5>{% trans "Trackbacks" %}</h5>
+ {% if trackback_list.count %}
+ <ol id="trackback-list" class="span-15 last">
+ {% for trackback in trackback_list %}
+ <li id="trackback_{{ trackback.pk }}" class="trackback {% cycle box1,box2 %} span-15 last">
+ <div class="trackback-body span-15 last">
+ <div class="trackback-author span-15 last">
+ <a href="{{ trackback.url }}">{{ trackback.user_name }}</a>
+ {% trans "on" %} {{ trackback.submit_date|date:"SHORT_DATETIME_FORMAT" }}
+ </div>
+ <div class="span-15 last">
+ <cite>
+ {{ trackback.comment }}
+ </cite>
+ </div>
+ </div>
+ </li>
+ {% endfor %}
+ </ol>
+ {% endif %}
+ {% if object.pingback_enabled %}
+ <p>
+ <a href="{% url gstudio_nodetype_trackback object.pk %}" rel="trackback">
+ {% trans "Trackback URL" %}</a>
+ </p>
+ {% endif %}
+</div>
+{% endif %}
+{% endwith %}
+{% endblock %}
+
+{% block nodetype-comments-form %}
+{% if object.comments_are_open %}
+<div class="commentForm span-16 last">
+ {% render_comment_form for object %}
+</div>
+{% endif %}
+{% endblock %}
+
+{% endblock %}
+
+{% block admin_tools %}
+{% if perms.gstudio.change_nodetype %}
+<li>
+ <a href="{% url admin:gstudio_objecttype_change object.pk %}" title="{% trans "Edit the nodetype" %}">
+ {% trans "Edit the node type" %}
+ </a>
+</li>
+{% endif %}
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_list.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_list.html
new file mode 100644
index 0000000..f4f75bd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_list.html
@@ -0,0 +1,143 @@
+{% extends "gstudio/base.html" %}
+{% load i18n gstudio_tags %}
+
+{% block meta-description %}{% trans "Latest nodetypes for" %} {% if metatype %}{% trans "the metatype" %} {{ metatype }}{% if metatype.description %}: {{ metatype.description|striptags|safe }}{% endif %}{% endif %}{% if tag %}{% trans "the tag" %} {{ tag }}{% endif %}{% if author %}{% trans "the author" %} {{ author }}{% endif %}{% if page_obj %}{% ifnotequal page_obj.number 1 %} {% trans "page" %} {{ page_obj.number }}{% endifnotequal %}{% endif %}{% endblock %}
+
+{% block link %}
+ {{ block.super }}
+ {% if metatype %}
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed" %} {{ metatype.title }}" href="{% url gstudio_metatype_feed metatype.tree_path %}" />
+ {% endif %}
+ {% if tag %}
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed" %} {{ tag.name }}" href="{% url gstudio_tag_feed tag.name %}" />
+ {% endif %}
+ {% if author %}
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed" %} {{ author.username }}" href="{% url gstudio_author_feed author.username %}" />
+ {% endif %}
+{% endblock %}
+
+{% block title %}{% trans "Latest nodetypes" %} {% if metatype %}| {% trans "Metatype" %} {{ metatype }}{% endif %}{% if tag %}| {% trans "Tag" %} {{ tag }}{% endif %}{% if author %}| {% trans "Author" %} {{ author }}{% endif %}{% if page_obj %}{% ifnotequal page_obj.number 1 %} | {% trans "Page" %} {{ page_obj.number }}{% endifnotequal %}{% endif %}{% endblock %}
+
+{% block content %}
+{% if metatype %}
+<h3>{{ metatype.title }}</h3>
+<h5>{{ metatype.composed_sentence }}</h5>
+
+ <b>Name: </b> {{ metatype.title }} <br/>
+
+ {% if metatype.altnames %}
+ <b>Alternate names: </b>
+ {% endif %}
+ {{ metatype.altnames }} <br/>
+
+ {% if object.plural %}
+ <b>Plural Name: </b> {{ metatype.plural }} <br/>
+ {% endif %}
+
+ {% if object.parent %}
+ <b>Type of: </b>
+ <a href="{{ metatype.parent.get_absolute_url }}"> {{ metatype.parent.title }}</a> <br/>
+ {% endif %}
+
+ {% if metatype.get_children %}
+ <b>SubTypes: </b>
+ {% for items in metatype.get_children %}
+ <a href="{{ items.get_absolute_url }}"> {{ items.title }}</a>;
+ {% endfor %} <br/>
+ {% endif %}
+
+ {% if metatype.get_siblings %}
+ <b>Siblings: </b>
+ {% for items in metatype.get_siblings %}
+ <a href="{{ items.get_absolute_url }}"> {{ items.title }}</a>;
+ {% endfor %} <br/>
+ {% endif %}
+
+ {% if metatype.metatypes.all %}
+ <b>Member of Metatypes: </b>
+ {% for items in metatype.metatypes.all %}
+ <a href="{{ items.get_absolute_url }}"> {{ items.title }}</a>;
+ {% endfor %} <br/>
+ {% endif %}
+
+ {% if metatype.nodetypes.all %}
+ <b>Contains member node types: </b>
+ {% for items in metatype.nodetypes.all %}
+ <a href="{{ items.get_absolute_url }}"> {{ items.title }}</a>;
+ {% endfor %} <br/>
+ {% endif %}
+
+ {% if metatype.subjecttypeLeft_gbnodetype.all %}
+ <b>Left role of relation types: </b>
+ {% for items in metatype.subjecttypeLeft_gbnodetype.all %}
+ <a href="{{ items.get_absolute_url }}"> {{ items.title }}</a>;
+ {% endfor %} <br/>
+ {% endif %}
+
+ {% if metatype.subjecttypeRight_gbnodetype.all %}
+ <b>Right role of relation types: </b>
+ {% for items in metatype.subjecttypeRight_gbnodetype.all %}
+ <a href="{{ items.get_absolute_url }}"> {{ items.title }}</a>;
+ {% endfor %} <br/>
+ {% endif %}
+
+ {% if metatype.subjecttype_GbnodeType.all %}
+ <b>As domain of attribute types: </b>
+ {% for items in metatype.subjecttype_GbnodeType.all %}
+ <a href="{{ items.get_absolute_url }}"> {{ items.title }}</a>;
+ {% endfor %} <br/>
+ {% endif %}
+
+
+
+
+{% if metatype.description %}
+<p>{{ metatype.description|striptags|safe }}</p>
+{% endif %}
+{% endif %}
+
+{% if tag %}
+<h1>{% trans "Tag" %} : {{ tag }}</h1>
+{% endif %}
+
+{% if author %}
+<h1>{% blocktrans with author.username as author %}Nodetypes by {{ author }}{% endblocktrans %}</h1>
+{% endif %}
+
+{% for object in object_list %}
+ {% with object.html_content|truncatewords_html:100|safe as object_content %}
+ {% include "gstudio/_nodetype_detail.html" %}
+ {% endwith %}
+{% empty %}
+ <p class="notice">{% trans "No nodes in the network yet. Login and construct a network!" %}</p>
+{% endfor %}
+
+{% if is_paginated %}
+ {% gstudio_pagination page_obj %}
+{% endif %}
+{% endblock %}
+
+{% block admin_tools %}
+ {% if metatype and perms.gstudio.change_metatype %}
+ <li>
+ <a href="{% url admin:gstudio_metatype_change metatype.pk %}" title="{% trans "Edit the metatype" %}">
+ {% trans "Edit the metatype" %}
+ </a>
+ </li>
+ {% endif %}
+ {% if tag and perms.tagging.change_tag %}
+ <li>
+ <a href="{% url admin:tagging_tag_change tag.pk %}" title="{% trans "Edit the tag" %}">
+ {% trans "Edit the tag" %}
+ </a>
+ </li>
+ {% endif %}
+ {% if author and perms.auth.change_user %}
+ <li>
+ <a href="{% url admin:auth_user_change author.pk %}" title="{% trans "Edit the author" %}">
+ {% trans "Edit the author" %}
+ </a>
+ </li>
+ {% endif %}
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_search.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_search.html
new file mode 100644
index 0000000..7fbc53d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_search.html
@@ -0,0 +1,49 @@
+{% extends "gstudio/nodetype_list.html" %}
+{% load i18n gstudio_tags %}
+
+{% block title %}{% trans "Search results for" %} {% if pattern %}'{{ pattern }}'{% endif %}{% if page_obj %}{% ifnotequal page_obj.number 1 %} | {% trans "Page" %} {{ page_obj.number }}{% endifnotequal %}{% endif %}{% endblock %}
+
+{% block meta-description %}{% trans "Search results for" %} {% if pattern %}'{{ pattern }}'{% endif %}{% if page_obj %}{% ifnotequal page_obj.number 1 %} {% trans "page" %} {{ page_obj.number }}{% endifnotequal %}{% endif %}{% endblock %}
+
+{% block link %}
+ {{ block.super }}
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of search result of" %} '{{ pattern }}'" href="{% url gstudio_nodetype_search_feed %}?pattern={{ pattern }}" />
+{% endblock %}
+
+{% block content %}
+<h1>{% trans "Search results for" %} {% if pattern %}'{{ pattern }}'{% endif %}</h1>
+
+{% if error %}
+<p class="error">{{ error }}</p>
+{% endif %}
+
+{% if object_list %}
+<p class="success">
+ {% blocktrans count paginator.count as nodetype_count %}{{ nodetype_count }} nodetype found{% plural %}{{ nodetype_count }} nodetypes found{% endblocktrans %}
+</p>
+{% endif %}
+
+{% for object in object_list %}
+ {% with object.html_content|truncatewords_html:100|safe as object_content %}
+ {% include "gstudio/_nodetype_detail.html" %}
+ {% endwith %}
+{% empty %}
+<p class="notice">{% trans "Nothing found." %}</p>
+{% endfor %}
+
+<div class="search">
+ <form method="get" id="main_searchform" action="{% url gstudio_nodetype_search %}">
+ <p>
+ <input type="text" value="{{ pattern }}" name="pattern" id="main_searchbox" />
+ <input type="submit" id="button" value="OK" />
+ <a title="{% trans 'You can use - to exclude words or phrases, &quot;double quotes&quot; for exact phrases and the AND/OR boolean operators combined with parenthesis for complex searchs.' %}">
+ <img src="{{ STATIC_URL }}gstudio/img/help.png" alt="?" width="14" height="14" />
+ </a>
+ </p>
+ </form>
+</div>
+
+{% if is_paginated %}
+ {% gstudio_pagination page_obj %}
+{% endif %}
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_trackback.xml b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_trackback.xml
new file mode 100644
index 0000000..66dbbb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/nodetype_trackback.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<response>
+ {% if not error %}
+ <error>0</error>
+ {% else %}
+ <error>1</error>
+ <message>{{ error }}</message>
+ {% endif %}
+</response>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/opensearch.xml b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/opensearch.xml
new file mode 100644
index 0000000..d0d1af2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/opensearch.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+{% load gstudio_tags %}
+{% get_tags as nodetype_tags %}
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"
+ xmlns:moz="http://www.mozilla.org/2006/browser/search/">
+ <ShortName>{{ site.name }}</ShortName>
+ <LongName>{{ site.name }} - web search</LongName>
+ <Description>Make a search on {{ site.name }}.</Description>
+ <Attribution>{{ copyright }}</Attribution>
+ <Tags>{{ nodetype_tags|slice:":15"|join:" " }}</Tags>
+ <Url type="text/html" template="{{ protocol }}://{{ site.domain }}{% url gstudio_nodetype_search %}?pattern={searchTerms}" />
+ <Url type="application/{{ feeds_format }}+xml" template="{{ protocol }}://{{ site.domain }}{% url gstudio_nodetype_search_feed %}?pattern={searchTerms}" />
+ <Url type="application/opensearchdescription+xml" rel="self" template="{{ protocol }}://{{ site.domain }}{% url gstudio_opensearch %}"/>
+ <Image height="16" width="16" type="image/vnd.microsoft.icon">{{ STATIC_URL }}gstudio/img/favicon.ico</Image>
+ <Query role="example" searchTerms="{{ nodetype_tags.0 }}" />
+ <Developer>gnowgi</Developer>
+ <Contact>nagarjun@gnowledge.org</Contact>
+ <SyndicationRight>open</SyndicationRight>
+ <AdultContent>false</AdultContent>
+ <Language>{{ LANGUAGE_CODE }}</Language>
+ <OutputEncoding>UTF-8</OutputEncoding>
+ <InputEncoding>UTF-8</InputEncoding>
+ <moz:SearchForm>{{ protocol }}://{{ site.domain }}/</moz:SearchForm>
+</OpenSearchDescription>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/password.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/password.html
new file mode 100644
index 0000000..a5d0d82
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/password.html
@@ -0,0 +1,35 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block title %}{% trans "Password required" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Password required" %}</h2>
+
+<div class="nodetype_password">
+ {% if error %}
+ <p class="error">
+ {% trans "The password provided is not valid. Please try again." %}
+ </p>
+ {% endif %}
+ <p>
+ {% trans "You need to provide a password to view this nodetype." %}
+ </p>
+
+ <form method="post" action=".">
+ {% csrf_token %}
+ <table>
+ <tr>
+ <td><label for="id_password">{% trans "Password" %}</label></td>
+ <td><input name="password" id="id_password" type="password" /></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input type="submit" value="{% trans "Valid" %}" />
+ </td>
+ </tr>
+ </table>
+ </form>
+</div>
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/rsd.xml b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/rsd.xml
new file mode 100644
index 0000000..a2df0dd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/rsd.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" ?>
+<rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd">
+ <service>
+ <engineName>Django Blog Gstudio {{ GSTUDIO_VERSION }}</engineName>
+ <engineLink>http://github.com/gnowgi/django-gstudio</engineLink>
+ <homePageLink>{{ protocol }}://{{ site.domain }}/</homePageLink>
+ <apis>
+ <api name="MetaWeblog" preferred="true" apiLink="{{ protocol }}://{{ site.domain }}/xmlrpc/" blogID="{{ site.id }}">
+ <settings>
+ <docs>http://www.xmlrpc.com/metaWeblogApi</docs>
+ <notes>MetaWeblog API support + Blogger API partial support</notes>
+ </settings>
+ </api>
+ </apis>
+ </service>
+</rsd>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/sitemap.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/sitemap.html
new file mode 100644
index 0000000..05edac9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/sitemap.html
@@ -0,0 +1,70 @@
+{% extends "gstudio/base.html" %}
+{% load i18n gstudio_tags mptt_tags %}
+
+{% block title %}{% trans "Sitemap" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Sitemap" %}</h2>
+
+<div class="nodetypesbymetatypes">
+ <h3>{% trans "Nodetypes per metatypes" %}</h3>
+ {% for metatype in metatypes %}
+ <h4>{{ metatype }}</h4>
+ <ul>
+ {% for nodetype in metatype.nodetypes_published.all %}
+ <li>
+ <a href="{{ nodetype.get_absolute_url }}" title="{{ nodetype.title }}" rel="bookmark">{{ nodetype.title }}</a>
+ {% with nodetype.comments.count as comment_count %}
+ - {{ comment_count }} {% trans "comment" %}{{ comment_count|pluralize }}
+ {% endwith %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No nodetypes yet." %}
+ </li>
+ {% endfor %}
+ </ul>
+ {% endfor %}
+</div>
+
+<div class="allnodetypes">
+ <h3>{% trans "All the nodetypes" %}</h3>
+ <ul>
+ {% for nodetype in nodetypes %}
+ <li>
+ <a href="{{ nodetype.get_absolute_url }}" title="{{ nodetype.title }}" rel="bookmark">{{ nodetype.title }}</a>
+ - {{ nodetype.creation_date|date:"SHORT_DATE_FORMAT" }}
+ {% with nodetype.comments.count as comment_count %}
+ - {{ comment_count }} {% trans "comment" %}{{ comment_count|pluralize }}
+ {% endwith %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No nodetypes yet." %}
+ </li>
+ {% endfor %}
+ </ul>
+</div>
+
+<div class="metatypes">
+ <h3>{% trans "Metatypes" %}</h3>
+ {% for metatype, structure in metatypes|tree_info %}
+ {% if structure.new_level %}<ul><li>{% else %}</li><li>{% endif %}
+ <a href="{{ metatype.get_absolute_url }}" title="{{ metatype.title }}">{{ metatype.title }}</a>
+ -
+ {% blocktrans count metatype.nodetypes_published.count as nodetype_count %}{{ nodetype_count }} nodetype{% plural %}{{ nodetype_count }} nodetypes{% endblocktrans %}
+ {% for level in structure.closed_levels %}</li></ul>{% endfor %}
+ {% empty %}
+ <ul>
+ <li>
+ {% trans "No metatypes yet." %}
+ </li>
+ </ul>
+ {% endfor %}
+</div>
+
+<div class="montharchives">
+ <h3>{% trans "Monthly archives" %}</h3>
+ {% get_archives_nodetypes %}
+</div>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/skeleton.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/skeleton.html
new file mode 100644
index 0000000..cb25a87
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/skeleton.html
@@ -0,0 +1,507 @@
+{% load gstudio_tags i18n %}
+{% get_tags as nodetype_tags %}
+{% load adminmedia grp_tags %}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xml:lang="{{ LANGUAGE_CODE }}" lang="{{ LANGUAGE_CODE }}" version="-//W3C//DTD XHTML 1.1//EN" xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <style type="text/css">
+ .link {
+ stroke: #ccc;
+ }
+ .nodetext {
+ #pointer-events: none;
+ font: 10px Serif;
+ font-style:italic;
+ }
+ .mainnode{
+
+ font: 15px sans-serif;
+ fill:"red";
+ border-width: 1px;
+ font-weight:bold;
+ border-color: gray;
+
+ }
+ .relnode {
+ font: 10px sans-serif;
+ font-weight:bold;
+ fill:#000;
+ }
+
+
+ .node {
+ border-width: 1px;
+ border-color: gray;
+ fill:"green";
+ font: 10px sans-serif;
+ }
+ body {
+ background-color: white;
+ }
+ #chart {
+ height: 90%;
+ margin: 0 auto;
+ width: 90%;
+ display: block;
+ }
+ svg {
+ margin-left: 10%;
+ margin-right: 10%;
+ display: block;
+ position: absolute;
+ }
+
+ </style>
+ <!-- the header lines from grappelli -->
+ {% block blockbots %}
+ <meta name="robots" content="NONE,NOARCHIVE" />
+ {% endblock %} <!-- STYLESHEETS -->
+ {% block stylesheets %}
+ <link href="{% admin_media_prefix %}css/base.css" rel="stylesheet" type="text/css" />
+ {% if LANGUAGE_BIDI %}
+ <link href="{% block stylesheet_rtl %}{% admin_media_prefix %}css/rtl.css{% endblock %}" rel="stylesheet" type="text/css" />
+ {% endif %}
+ <link href="{% admin_media_prefix %}jquery/ui/css/custom-theme/jquery-ui-1.8.custom.css" rel="stylesheet" type="text/css" media="screen" title="no title" charset="utf-8" />
+ <link href="{% admin_media_prefix %}css/jquery-ui-grappelli-extensions.css" rel="stylesheet" type="text/css" />
+ {% endblock %} <!-- EXTRASTYLES -->
+ {% block extrastyle %}{% endblock %} <!-- JAVASCRIPTS -->
+ {% block javascripts %}
+ <script type="text/javascript">
+ // GLOBALS
+ var grappelli = {},
+ // TODO: klemens: drop ADMIN_URL
+ ADMIN_URL = "{% url admin:index %}",
+ MODEL_URL_ARRAY = {% get_content_types %}, DATE_FORMAT = "{% get_date_format %}", TIME_FORMAT = "{% get_time_format %}", DATETIME_FORMAT = "{% get_datetime_format %}";
+ </script>
+ <!-- jQuery, jQuery-UI -->
+ <script src="{% admin_media_prefix %}jquery/jquery-1.6.2.min.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}jquery/ui/js/jquery-ui-1.8.15.custom.min.js" type="text/javascript"></script>
+ <!-- Grappelli Main JS -->
+ <script src="{% admin_media_prefix %}js/grappelli/grappelli.js" type="text/javascript"></script>
+ <!-- Grappelli jQuery Plugins, Widgets -->
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_collapsible.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_collapsible_group.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_timepicker.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_related_fk.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_related_m2m.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_related_generic.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_autocomplete_fk.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_autocomplete_m2m.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_autocomplete_generic.js" type="text/javascript"></script>
+ <script type="text/javascript" src="{{STATIC_URL}}gstudio/js/jquery-ui-timepicker-0.2.9/include/jquery-1.5.1.min.js"></script>
+ <script type="text/javascript" src="{{STATIC_URL}}gstudio/js/jquery-ui-timepicker-0.2.9/include/jquery.ui.core.min.js"></script>
+ <script type="text/javascript" src="{{STATIC_URL}}gstudio/js/jquery-ui-timepicker-0.2.9/include/jquery.ui.widget.min.js"></script>
+ <script type="text/javascript" src="{{STATIC_URL}}gstudio/js/jquery-ui-timepicker-0.2.9/include/jquery.ui.tabs.min.js"></script>
+ <script type="text/javascript" src="{{STATIC_URL}}gstudio/js/jquery-ui-timepicker-0.2.9/include/jquery.ui.position.min.js"></script>
+
+ <script type="text/javascript" src="{{STATIC_URL}}gstudio/js/jquery.ui.timepicker.js"></script>
+
+ <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
+ <script src="{{STATIC_URL}}gstudio/js/gstudio.js" type="text/javascript"></script>
+ <!-- EXTRAHEAD -->
+ {% block extrahead %}{% endblock %}
+
+ {% endblock %} <!-- the header lines from gstudio -->
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <meta http-equiv="cache-control" content="public" />
+ <meta name="robots" content="follow, all" />
+ <meta name="language" content="{{ LANGUAGE_CODE }}" />
+ <meta name="description" content="{% block meta-description %}Demonstration of the Gstudio Blog application.{% endblock %}" />
+ <meta name="keywords" content="{% block meta-keywords %}django, blog, gstudio, {{ nodetype_tags|join:", "}}{% endblock %}" />
+ <meta name="author" content="gnowgi" />
+ {% block meta %}{% endblock %}
+ <link rel="pingback" href="/xmlrpc/" />
+ <link rel="shortcut icon" href="{{ STATIC_URL }}gstudio/img/favicon.ico" />
+ <link rel="home" href="{% url gstudio_nodetype_archive_index %}" />
+ <link rel="stylesheet" type="text/css" media="screen, projection" href="{{ STATIC_URL }}gstudio/css/grappelli_skin_default.css" />
+ <link rel="stylesheet" type="text/css" media="screen, projection" href="{{ STATIC_URL }}gstudio/css/screen.css" />
+ <link rel="stylesheet" type="text/css" media="screen, projection" href="{{ STATIC_URL }}gstudio/css/screen_gstudio.css" />
+ <link rel="stylesheet" type="text/css" media="print" href="{{ STATIC_URL }}gstudio/css/print.css" />
+ <!--[if lt IE 8]>
+ <link rel="stylesheet" type="text/css" media="screen, projection" href="{{ STATIC_URL }}gstudio/css/ie.css" />
+ <![endif]-->
+ {% block link %}{% endblock %}
+ {% block script %}{% endblock %} <title>Gnowledge Studio - {% block title %}{% endblock %}</title>
+ </head>
+ <body id="gstudio">
+ <div class="body" >
+ <div class="content">
+ <!--
+ <div id="relation_type" class="ui-buttonset">
+ <span>Relation type:</span>
+ <input checked="checked" value="follows" type="radio" id="follows" name="radio" class="ui-helper-hidden-accessible"><label for="follows" class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-left" aria-pressed="false" role="button" aria-disabled="false"><span class="ui-button-text">Followers</span></label>
+ <input value="mentions" type="radio" id="mentions" name="radio" class="ui-helper-hidden-accessible"><label for="mentions" aria-pressed="true" class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-right ui-state-active" role="button" aria-disabled="false"><span class="ui-button-text">Mentions</span></label>
+ <input value="hashtags" type="radio" id="hashtags" name="radio"/><label for="hashtags">Shared interests</label>
+ </div>
+ -->
+ <div id="chart">
+ <svg width="960" height="700" style="opacity: 1; ">
+ </div>
+ <script type="text/javascript" src="/static/gstudio/js/jquery.min.js" ></script>
+ <script type="text/javascript" src="/static/gstudio/js/jquery-ui.js" ></script>
+ <script type="text/javascript" src="/static/gstudio/js/underscore.js" ></script>
+ <script type="text/javascript" src="/static/gstudio/js/d3.js"></script>
+ <script type="text/javascript" src="/static/gstudio/js/d3.layout.js"></script>
+ <script type="text/javascript" src="/static/gstudio/js/d3.geom.js"></script>
+ <!-- <script type="text/javascript" src="/static/gstudio/js/force.js"></script>
+
+ Javascript for Object type force graph
+ -->
+ <script type="text/javascript" >
+
+ var w = 700,
+ h = 300,
+ fill = d3.scale.category20();
+
+ var vis = d3.select("#chart")
+ .append("svg:svg")
+ .attr("width", w)
+ .attr("height", h);
+
+ vis.append("svg:g").attr("class", "edges");
+ vis.append("svg:g").attr("class", "nodes");
+
+$(function() {
+ $.ajax({
+ url: '/nodetypes/graphs/graph_json/{{ object.id }}',
+ //crossDomain: true,
+ dataType: 'json',
+ success : function(json) {
+
+ //var node = NID.objects.get(slug='{{ slug }}');
+ var force;
+
+ // this contains all the nodes as a dict with _id as the key
+
+ var nodes_by_id = _.reduce(json.node_metadata, function(acc, n) {
+ acc[n._id] = n;
+ return acc;
+ }, {});
+
+ var member_of = _(json.member_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'member_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var contains_subtypes = _(json.contains_subtypes).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'contains_subtypes';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var contains_members = _(json.contains_members).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'contains_members';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var left_subjecttype_of = _(json.left_subjecttype_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'left_subjecttype_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var subjecttype_of = _(json.subjecttype_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'subjecttype_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var plural = _(json.plural).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'plural';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var altnames = _(json.altnames).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'altnames';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var content = _(json.content).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'content';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var contains_members = _(json.contains_members).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'contains_members';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+
+ var type_of = _(json.type_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'type_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var right_subjecttype_of = _(json.right_subjecttype_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'right_subjecttype_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var follows_edges = _(json.is_followed_by).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'follows_edges';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+
+ var prior_nodes = _(json.prior_nodes).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'prior_node';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var posterior_nodes = _(json.posterior_nodes).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'posterior_node';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var mentions_edges = _(json.is_mentioned_by).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'mentions_edges';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ nodes_by_id[{{ object.id }}].x = w/2.0;
+ nodes_by_id[{{ object.id }}].y = h/2.0;
+
+ all_edges = new Array();
+ all_edges = all_edges.concat(follows_edges, member_of, contains_members, contains_subtypes, mentions_edges, right_subjecttype_of, left_subjecttype_of, subjecttype_of, type_of,plural,altnames,contains_members,content, prior_nodes, posterior_nodes);
+ /* all_edges.concat(follows_edges);
+ all_edges.concat(member_of_metatype);
+ all_edges.concat(contains_members);
+ all_edges.concat(contains_subtypes);
+ all_edges.concat(mentions_edges);
+
+
+ document.getElementById('debugbox1').value= follows_edges; //member_of_metatype
+ document.getElementById('debugbox2').value= mentions_edges;
+ //document.getElementById('debugbox2').value= member_of_metatype;
+ document.getElementById('debugbox3').value= all_edges;
+ */
+ var force = d3.layout.force()
+ .linkStrength(0.5)
+ .charge(-2000)
+ .friction(0.7)
+ .gravity(0.7)
+ .linkDistance(13)
+ .nodes([])
+ .links([])
+ .size([w, h])
+ .start();
+
+ function update(edges){
+ // for each func
+ _.each(nodes_by_id, function(n){n.added = false});
+ // reduce the nodes list to have only those nodes for a given rel.
+ nodes = _.reduce(edges, function(acc, e) {
+ if(nodes_by_id[e.from] && !nodes_by_id[e.from].added){
+ nodes_by_id[e.from].added = true;
+ acc.push(nodes_by_id[e.from]);
+ }
+ if(nodes_by_id[e.to] && !nodes_by_id[e.to].added){
+ nodes_by_id[e.to].added = true;
+ acc.push(nodes_by_id[e.to]);
+ }
+ return acc;
+ }, []);
+
+ force.nodes(nodes);
+ force.links(edges);
+ force.start();
+
+ link = d3.select("#chart g.edges").selectAll("line.link")
+ .data(edges, function(e){return e.from + "-" + e.to + "-" + e.type});
+
+ link.enter().append("svg:line")
+ .attr("class", "link")
+ .style("stroke-width", 2 /* function(d) {
+ return Math.sqrt(d.value);
+ } */ )
+ .attr("x1", function(d) {
+ return d.source.x;
+ })
+ .attr("y1", function(d) {
+ return d.source.y;
+ })
+ .attr("x2", function(d) {
+ return d.target.x;
+ })
+ .attr("y2", function(d) {
+ return d.target.y;
+ })
+ .attr("text", function(d) {
+ return d.type;
+ })
+
+ .append("a")
+ .text(function(d) { return d.type; });
+
+
+ var node = d3.select("#chart g.nodes").selectAll("g.node").data(nodes);
+
+ var new_g = node.enter().append("svg:a")
+ .attr("class", function(d) { if (d._id=={{ object.id }}) return "mainnode"; else if (isNaN(d._id)) return "relnode"; else if ((d._id)<0) return "nodetext"; else return "node"; })
+ .attr("xlink:href",function(d){return d.url;})
+ .call(force.drag);
+
+
+
+
+ new_g.append("svg:circle")
+ .attr("cx", function(d) { return d.x - w/2.0 + 15; })
+ .attr("cy", function(d) { return d.y - h/2.0 + 15; })
+ .attr("r", function(d) { if (d._id=={{ object.id }}) return 8; else if (isNaN(d._id) || (d._id)<0) return 1; else return 7 })
+ .style("fill", function color(d) { if (d._id=={{ object.id }}) return "red"; else if (isNaN(d._id) || (d._id)<0) return "white" ; else return "green"});
+
+
+ new_g.append("svg:text")
+ .attr("class",function(d) { if (d._id=={{ object.id }}) return "mainnode"; else if (isNaN(d._id)) return "relnode"; else if ((d._id)<0) return "nodetext"; else return "node"; })
+ .attr("dy", 20)
+ .attr("dx", 25)
+ .attr("text-anchor",function text(d) { if (isNaN(d._id) || (d._id)<0) return "middle" ; else return "left"})
+
+// .attr("style",function text(d) { if (isNaN(d._id)) return "font-size:9.00pt;fill:#333;" ; else return "font-size:9.00pt;fill:black;"})
+
+ .text(function(d) {
+ return d.screen_name;
+ });
+
+ node.exit().remove();
+
+
+
+ force.on("tick", function() {
+
+ var x_center = $("#chart").width() / 2;
+ var y_center = $("#chart").height() / 2;
+
+ link.attr("x1", function(d) { return d.source.x; })
+ .attr("y1", function(d) { return d.source.y; })
+ .attr("x2", function(d) { return d.target.x; })
+ .attr("y2", function(d) { return d.target.y; });
+
+ node.attr("transform", function(d) { return "translate(" + (d.x-16) + "," + (d.y-16) + ")"; });
+
+ });
+ }
+
+ update(all_edges);
+ vis.style("opacity", 1e-6)
+ .transition()
+ .duration(1000)
+ .style("opacity", 1);
+
+ /* $('input#follows').change(function(){
+ update(all_edges);
+ });
+ */
+
+ /* $('input#mentions').change(function(){
+ update(all_edges);
+ }); */
+ }
+ });
+
+// $("#relation_type").buttonset();
+
+// $('input#mentions').change(function(){console.log(this)});
+// $('input#follows').change(function(){console.log(this)});
+});
+
+
+</script>
+ </div>
+ </div>
+ <div>
+ {% include "gstudio/_header.html" %}
+ <div id="breadcrumbs" class="span-24 last">
+ / {% block breadcrumbs %}{% endblock %}
+ </div>
+ <div id="body" class="span-24 last">
+ <div id="content" class="hfeed span-16 border">
+ {% block content %} <h3>The content block need to be overrided!</h3>
+ {% endblock %}
+ </div>
+ <div id="sidebar">
+ {% block sidebar %}
+ {% endblock %}
+ </div>
+
+ <div id="footer" class="span-24 last">
+ <p>
+ <a rel="license"
+ href="http://creativecommons.org/licenses/by-sa/3.0/"><img alt="Creative
+ Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png"/></a> All material is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike 3.0 Unported License</a> unless mentioned otherwise.
+ <br/>
+ Powered by <a href="http://www.djangoproject.com">Django</a>
+ and <a href="http://github.com/gnowgi/django-gstudio">Gstudio
+ {{ GSTUDIO_VERSION }}</a>.
+ </p>
+ </div>
+
+ </body>
+</html>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tag/nodetype_list.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tag/nodetype_list.html
new file mode 100644
index 0000000..54b8914
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tag/nodetype_list.html
@@ -0,0 +1 @@
+{% extends "gstudio/nodetype_list.html" %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tag_list.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tag_list.html
new file mode 100644
index 0000000..eeac3ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tag_list.html
@@ -0,0 +1,24 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block meta-description %}{% trans "Tag list" %}{% endblock %}
+
+{% block title %}{% trans "Tags" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Tag list" %}</h2>
+<div>
+ <ul>
+ {% for object in object_list %}
+ <li>
+ <a href="{% url gstudio_tag_detail object %}" title="{{ object }}">{{ object }}</a>
+ {% blocktrans count object.count as nodetype_count %}{{ nodetype_count }} nodetype{% plural %}{{ nodetype_count }} nodetypes{% endblocktrans %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No tags yet." %}
+ </li>
+ {% endfor %}
+ </ul>
+</div>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes.html
new file mode 100644
index 0000000..2863693
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes.html
@@ -0,0 +1,15 @@
+{% load i18n %}
+<ul>
+ {% for date in archives %}
+ <li>
+ <a title="{% trans "Archives" %} {{ date|date:"YEAR_MONTH_FORMAT" }}" rel="archives"
+ href="{% url gstudio_nodetype_archive_month date|date:"Y" date|date:"m" %}">
+ {{ date|date:"YEAR_MONTH_FORMAT" }}
+ </a>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No archives yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes_link.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes_link.html
new file mode 100644
index 0000000..f82ec8e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes_link.html
@@ -0,0 +1,3 @@
+{% load i18n %}
+{% for date in archives %}<link rel="archives" title="{% trans "Archives" %} {{ date|date:"YEAR_MONTH_FORMAT" }}" href="{% url gstudio_nodetype_archive_month date|date:"Y" date|date:"m" %}" />
+{% endfor %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes_tree.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes_tree.html
new file mode 100644
index 0000000..a1eee55
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/archives_nodetypes_tree.html
@@ -0,0 +1,43 @@
+{% load i18n %}
+
+{% regroup archives by year as year_list %}
+<ul>
+ {% for year in year_list %}
+ <li>
+ <a title="{% trans "Archives" %} {{ year.grouper }}" rel="archives"
+ href="{% url gstudio_nodetype_archive_year year.grouper %}">{{ year.grouper }}</a>
+ {% regroup year.list by month as month_list %}
+ <ul>
+ {% for month in month_list %}
+ <li>
+ {% with month.list.0 as month_date %}
+ <a title="{% trans "Archives" %} {{ month_date|date:"YEAR_MONTH_FORMAT" }}" rel="archives"
+ href="{% url gstudio_nodetype_archive_month month_date|date:"Y" month_date|date:"m" %}">
+ {{ month_date|date:"F" }}
+ </a>
+ {% endwith %}
+ {% regroup month.list by day as day_list %}
+ <ul>
+ {% for day in day_list %}
+ <li>
+ {% with day.list.0 as day_date %}
+ <a title="{% trans "Archives" %} {{ day_date|date:"DATE_FORMAT" }}" rel="archives"
+ href="{% url gstudio_nodetype_archive_day day_date|date:"Y" day_date|date:"m" day_date|date:"d" %}">
+ {{ day_date|date:"MONTH_DAY_FORMAT" }}
+ </a>
+ {% endwith %}
+ </li>
+ {% endfor %}
+ </ul>
+ </li>
+ {% endfor %}
+ </ul>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No archives yet." %}
+ </li>
+ {% endfor %}
+</ul>
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/authors.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/authors.html
new file mode 100644
index 0000000..1ce1af2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/authors.html
@@ -0,0 +1,15 @@
+{% load i18n %}
+
+<ul>
+ {% for author in authors %}
+ <li class="vcard">
+ <a href="{% url gstudio_author_detail author.username %}"
+ title="{{ author.username }}" class="fn nickname url">{{ author.username }}</a>
+ {% blocktrans count author.nodetypes_published.count as nodetype_count %}{{ nodetype_count }} nodetype{% plural %}{{ nodetype_count }} nodetypes{% endblocktrans %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No authors yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/breadcrumbs.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/breadcrumbs.html
new file mode 100644
index 0000000..57f9ad9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/breadcrumbs.html
@@ -0,0 +1,9 @@
+{% for crumb in breadcrumbs %}
+{% if not forloop.last %}
+{% if crumb.name %}
+<a href="{{ crumb.url }}" title="{{ crumb.name }}">{{ crumb.name }}</a> {{ separator }}
+{% endif %}
+{% else %}
+ {{ crumb.name }}
+{% endif %}
+{% endfor %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/calendar.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/calendar.html
new file mode 100644
index 0000000..bf6e999
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/calendar.html
@@ -0,0 +1,17 @@
+{{ calendar|safe }}
+<div class="month-navigation">
+ <div class="month-previous">
+ {% if previous_month %}
+ <a href="{% url gstudio_nodetype_archive_month previous_month|date:"Y" previous_month|date:"m" %}">
+ &lt;&lt; {{ previous_month|date:"YEAR_MONTH_FORMAT" }}
+ </a>
+ {% endif %}
+ </div>
+ <div class="month-next">
+ {% if next_month %}
+ <a href="{% url gstudio_nodetype_archive_month next_month|date:"Y" next_month|date:"m" %}">
+ {{ next_month|date:"YEAR_MONTH_FORMAT" }} &gt;&gt;
+ </a>
+ {% endif %}
+ </div>
+</div>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/dummy.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/dummy.html
new file mode 100644
index 0000000..f04fcf5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/dummy.html
@@ -0,0 +1 @@
+{% extends template %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/featured_nodetypes.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/featured_nodetypes.html
new file mode 100644
index 0000000..5b7806b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/featured_nodetypes.html
@@ -0,0 +1,12 @@
+{% load i18n %}
+<ul>
+ {% for nodetype in nodetypes %}
+ <li>
+ <a href="{{ nodetype.get_absolute_url }}" title="{{ nodetype.title }}" rel="bookmark">{{ nodetype.title }}</a>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No nodetypes yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/metatypes.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/metatypes.html
new file mode 100644
index 0000000..745dce0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/metatypes.html
@@ -0,0 +1,16 @@
+{% load i18n mptt_tags %}
+
+{% for metatype, structure in metatypes|tree_info %}
+ {% if structure.new_level %}<ul><li>{% else %}</li><li>{% endif %}
+ <a href="{{ metatype.get_absolute_url }}" title="{{ metatype.title }}">{{ metatype.title }}</a>
+ {% blocktrans count metatype.nodetypes_published.count as nodetype_count %}{{ nodetype_count }} nodetype{% plural %}{{ nodetype_count }} nodetypes{% endblocktrans %}
+ {% for level in structure.closed_levels %}</li></ul>{% endfor %}
+ {% empty %}
+<ul>
+ <li>
+ {% trans "No metatypes yet." %}
+ </li>
+</ul>
+{% endfor %}
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/nodetypes.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/nodetypes.html
new file mode 100644
index 0000000..722c201
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/nodetypes.html
@@ -0,0 +1,16 @@
+{% load i18n mptt_tags %}
+
+{% for nodetype, structure in nodetypes|tree_info %}
+ {% if structure.new_level %}<ul><li>{% else %}</li><li>{% endif %}
+ <a href="{{ nodetype.get_absolute_url }}" title="{{ nodetype.title }}">{{ nodetype.title }}</a>
+ {% blocktrans count nodetypes.gbobjects_published.count as gbobjects_count %}{{ gbobjects_count }} gbobject{% plural %}{{ gbobjects_count }} gbobjects{% endblocktrans %}
+
+ {% empty %}
+<ul>
+ <li>
+ {% trans "No subtypes yet." %}
+ </li>
+</ul>
+{% endfor %}
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/pagination.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/pagination.html
new file mode 100644
index 0000000..ac54a75
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/pagination.html
@@ -0,0 +1,59 @@
+{% load i18n %}
+<div class="paginator span-16 last">
+ <span class="index">
+ {% blocktrans with page.number as current_page and page.paginator.num_pages as total_page %}Page {{ current_page }} of {{ total_page }}{% endblocktrans %}
+ </span>
+
+ {% if page.has_previous %}
+ <span class="previous">
+ <a href="?page={{ page.previous_page_number }}{{ GET_string }}"
+ title="{% trans "More recent node types" %}">&laquo;</a>
+ </span>
+ {% endif %}
+
+ {% for page_number in begin %}
+ <span class="page {% ifequal page.number page_number %}current{% endifequal %}">
+ {% ifequal page.number page_number %}
+ <strong>{{ page_number }}</strong>
+ {% else %}
+ <a href="?page={{ page_number }}{{ GET_string }}"
+ title="{% trans "Nodetypes page" %} {{ page_number }}">{{ page_number }}</a>
+ {% endifequal%}
+ </span>
+ {% endfor %}
+
+ {% if middle %}
+ <span class="ellipsis">&hellip;</span>
+ {% for page_number in middle %}
+ <span class="page {% ifequal page.number page_number %}current{% endifequal %}">
+ {% ifequal page.number page_number %}
+ <strong>{{ page_number }}</strong>
+ {% else %}
+ <a href="?page={{ page_number }}{{ GET_string }}"
+ title="{% trans "Nodetypes page" %} {{ page_number }}">{{ page_number }}</a>
+ {% endifequal%}
+ </span>
+ {% endfor %}
+ {% endif %}
+
+ {% if end %}
+ <span class="ellipsis">&hellip;</span>
+ {% for page_number in end %}
+ <span class="page {% ifequal page.number page_number %}current{% endifequal %}">
+ {% ifequal page.number page_number %}
+ <strong>{{ page_number }}</strong>
+ {% else %}
+ <a href="?page={{ page_number }}{{ GET_string }}"
+ title="{% trans "Nodetypes page" %} {{ page_number }}">{{ page_number }}</a>
+ {% endifequal%}
+ </span>
+ {% endfor %}
+ {% endif %}
+
+ {% if page.has_next %}
+ <span class="next">
+ <a href="?page={{ page.next_page_number }}{{ GET_string }}"
+ title="{% trans "More old nodetypes" %}">&raquo;</a>
+ </span>
+ {% endif %}
+</div>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/popular_nodetypes.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/popular_nodetypes.html
new file mode 100644
index 0000000..2b3112b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/popular_nodetypes.html
@@ -0,0 +1,16 @@
+{% load i18n %}
+<ul>
+ {% for nodetype in nodetypes %}
+ <li>
+ <a href="{{ nodetype.get_absolute_url }}" title="{{ nodetype.title }}" rel="bookmark">{{ nodetype.title }}</a>
+ <br />
+ {% with nodetype.comments.count as comment_count %}
+ <a href="{{ nodetype.get_absolute_url }}#comments" title="{{ nodetype.title }}">{{ comment_count }} {% trans "comment" %}{{ comment_count|pluralize }}</a>
+ {% endwith %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No nodetypes yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/random_nodetypes.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/random_nodetypes.html
new file mode 100644
index 0000000..5b7806b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/random_nodetypes.html
@@ -0,0 +1,12 @@
+{% load i18n %}
+<ul>
+ {% for nodetype in nodetypes %}
+ <li>
+ <a href="{{ nodetype.get_absolute_url }}" title="{{ nodetype.title }}" rel="bookmark">{{ nodetype.title }}</a>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No nodetypes yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_comments.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_comments.html
new file mode 100644
index 0000000..9e87c6f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_comments.html
@@ -0,0 +1,20 @@
+{% load i18n %}
+
+<ul>
+ {% for comment in comments %}
+ <li>
+ {% with comment.content_object as nodetype %}
+ {{ comment.user_name }} {% trans "on" %}
+ <a href="{{ nodetype.get_absolute_url }}#comment_{{ comment.pk }}"
+ title="{% trans "Comment on" %} {{ nodetype.title }}">
+ {{ nodetype.title }}
+ </a>
+ {% endwith %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No comments yet." %}
+ </li>
+ {% endfor %}
+</ul>
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_linkbacks.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_linkbacks.html
new file mode 100644
index 0000000..382e53c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_linkbacks.html
@@ -0,0 +1,21 @@
+{% load i18n %}
+
+<ul>
+ {% for linkback in linkbacks %}
+ <li>
+ {% with linkback.content_object as nodetype %}
+ <a href="{{ linkback.url }}">{{ linkback.user_name }}</a>
+ {% trans "in" %}
+ <a href="{{ nodetype.get_absolute_url }}#{{ linkback.flags.all.0.flag }}_{{ linkback.pk }}"
+ title="{% trans "Linkback on" %} {{ nodetype.title }}">
+ {{ nodetype.title }}
+ </a>
+ {% endwith %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No linkbacks yet." %}
+ </li>
+ {% endfor %}
+</ul>
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_nodetypes.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_nodetypes.html
new file mode 100644
index 0000000..0b1bb0a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/recent_nodetypes.html
@@ -0,0 +1,20 @@
+
+{% load i18n mptt_tags %}
+
+{% for nodetype, structure in nodetypes|tree_info %}
+{% if structure.new_level %}
+<ul>
+ <li>{% else %}</li>
+ <li>{% endif %}
+ <a href="{{ nodetype.get_absolute_url }}" title="{{ nodetype.title }}">{{ nodetype.title }}</a>
+ {% for level in structure.closed_levels %}
+ </li>
+</ul>{% endfor %}
+{% empty %}
+<ul>
+ <li>
+ {% trans "No subtypes yet." %}
+ </li>
+</ul>
+{% endfor %}
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/similar_nodetypes.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/similar_nodetypes.html
new file mode 100644
index 0000000..7e933e0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/similar_nodetypes.html
@@ -0,0 +1,12 @@
+{% load i18n %}
+<ul>
+ {% for nodetype in nodetypes %}
+ <li>
+ <a href="{{ nodetype.get_absolute_url }}" title="{{ nodetype.title }}" rel="bookmark">{{ nodetype.title }}</a>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No similar nodetypes." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/slider_nodetypes.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/slider_nodetypes.html
new file mode 100644
index 0000000..ccc161a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/slider_nodetypes.html
@@ -0,0 +1,27 @@
+{% if nodetypes %}
+<div id="slider">
+ <ul class="ui-tabs-nav">
+ {% for nodetype in nodetypes %}
+ <li class="ui-tabs-nav-item{% if forloop.first %} ui-tabs-selected{% endif %}"
+ id="nav-slider-{{ forloop.counter }}">
+ <a href="#nodetype-slider-{{ forloop.counter }}">
+ <img src="{% if nodetype.image %}{{ nodetype.image.url }}{% endif %}" alt="{{ nodetype.title }}" />
+ <span>{{ nodetype.title }}</span>
+ </a>
+ </li>
+ {% endfor %}
+ </ul>
+
+ {% for nodetype in nodetypes %}
+ <div id="nodetype-slider-{{ forloop.counter }}" class="ui-tabs-panel">
+ <img src="{% if nodetype.image %}{{ nodetype.image.url }}{% endif %}" alt="{{ nodetype.title }}" />
+ <div class="panel_info">
+ <h2>
+ <a href="{{ nodetype.get_absolute_url }}" rel="bookmark">{{ nodetype.title }}</a>
+ </h2>
+ {{ nodetype.excerpt|linebreaks|truncatewords_html:20 }}
+ </div>
+ </div>
+ {% endfor %}
+</div>
+{% endif %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/tag_cloud.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/tag_cloud.html
new file mode 100644
index 0000000..a18a004
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/tags/tag_cloud.html
@@ -0,0 +1,13 @@
+{% load i18n %}
+
+<div>
+ <ul>
+ {% for tag in tags %}
+ <li>
+ <a href="{% url gstudio_tag_detail tag.name %}"
+ title="{% blocktrans count tag.count as nodetype_count %}{{ nodetype_count }} nodetype{% plural %}{{ nodetype_count }} nodetypes{% endblocktrans %}"
+ class="tag_{{ tag.font_size }}">{{ tag }}</a>
+ </li>
+ {% endfor %}
+ </ul>
+</div>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/wlwmanifest.xml b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/wlwmanifest.xml
new file mode 100644
index 0000000..73fd1c2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/wlwmanifest.xml
@@ -0,0 +1,63 @@
+{% load i18n %}<?xml version="1.0" encoding="utf-8" ?>
+<manifest xmlns="http://schemas.microsoft.com/wlw/manifest/weblog">
+ <options>
+ <!-- http://msdn.microsoft.com/en-us/library/bb463260.aspx -->
+ <clientType>Metaweblog</clientType>
+ <supportsPostAsDraft>Yes</supportsPostAsDraft>
+ <supportsFileUpload>Yes</supportsFileUpload>
+ <supportsExtendedNodetypes>No</supportsExtendedNodetypes>
+ <supportsCustomDate>Yes</supportsCustomDate>
+ <supportsMetatypes>Yes</supportsMetatypes>
+ <supportsMetatypesInline>Yes</supportsMetatypesInline>
+ <supportsMultipleMetatypes>Yes</supportsMultipleMetatypes>
+ <supportsHierarchicalMetatypes>Yes</supportsHierarchicalMetatypes>
+ <supportsNewMetatypes>Yes</supportsNewMetatypes>
+ <supportsNewMetatypesInline>Yes</supportsNewMetatypesInline>
+ <supportsKeywords>Yes</supportsKeywords>
+ <supportsCommentPolicy>Yes</supportsCommentPolicy>
+ <supportsPingPolicy>Yes</supportsPingPolicy>
+ <supportsAuthor>Yes</supportsAuthor>
+ <supportsSlug>Yes</supportsSlug>
+ <supportsPassword>Yes</supportsPassword>
+ <supportsExcerpt>Yes</supportsExcerpt>
+ <supportsTrackbacks>No</supportsTrackbacks>
+ <supportsPages>No</supportsPages>
+ <supportsPageParent>No</supportsPageParent>
+ <supportsPageOrder>No</supportsPageOrder>
+ <supportsEmptyTitles>No</supportsEmptyTitles>
+ <requiresHtmlTitles>No</requiresHtmlTitles>
+ <requiresXHTML>No</requiresXHTML>
+ <supportsScripts>Yes</supportsScripts>
+ <supportsEmbeds>Yes</supportsEmbeds>
+ <characterSet>UTF-8</characterSet>
+ <maxMetatypeNameLength>50</maxMetatypeNameLength>
+ </options>
+
+ <weblog>
+ <serviceName>{{ site.name }} Blog</serviceName>
+ <imageUrl>{{ STATIC_URL }}gstudio/img/wlw/gstudio.png</imageUrl>
+ <watermarkImageUrl>{{ STATIC_URL }}gstudio/img/wlw/watermark.png</watermarkImageUrl>
+ <homepageLinkText>{% trans "View site" %}</homepageLinkText>
+ <adminLinkText>{% trans "Admin. site" %}</adminLinkText>
+ <adminUrl><![CDATA[
+ {blog-homepage-url}{% url admin:index %}
+ ]]></adminUrl>
+ <postEditingUrl><![CDATA[
+ {blog-homepage-url}{% url admin:gstudio_nodetype_changelist %}{post-id}/
+ ]]></postEditingUrl>
+ </weblog>
+
+ <buttons>
+ <button>
+ <id>0</id>
+ <text>{% trans "Manage comments" %}</text>
+ <imageUrl>{{ STATIC_URL }}gstudio/img/wlw/comments.png</imageUrl>
+ <clickUrl><![CDATA[
+ {blog-homepage-url}{% url admin:comments_comment_changelist %}
+ ]]></clickUrl>
+ </button>
+ </buttons>-->
+
+ <!-- Add views section -->
+</manifest>
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudio/wxr.xml b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/wxr.xml
new file mode 100644
index 0000000..557eb0d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudio/wxr.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+{% load tagging_tags %}
+<!-- This is a WordPress eXtended RSS file generated by Gstudio {{ version }} as an export of your blog. -->
+<!-- It contains information about your blog's posts, comments, and metatypes. -->
+<!-- You may use this file to transfer that content from one site to another. -->
+<!-- This file is not intended to serve as a complete backup of your blog. -->
+
+<!-- generator="Gstudio/{{ version }}" created="{% now "Y-m-d H:i" %}"-->
+<rss version="2.0"
+ xmlns:excerpt="http://wordpress.org/export/1.0/excerpt/"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
+ xmlns:wfw="http://wellformedweb.org/CommentAPI/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:wp="http://wordpress.org/export/1.0/">
+ <channel>
+ <title>{{ site.name }}</title>
+ <link>{{ site_url }}</link>
+ <description>{{ description }}</description>
+ <pubDate>{% now "r" %}</pubDate>
+ <generator>Gstudio {{ version }}</generator>
+ <language>{{ language }}</language>
+ <wp:wxr_version>1.0</wp:wxr_version>
+ <wp:base_site_url>{{ site_url }}</wp:base_site_url>
+ <wp:base_blog_url>{{ site_url }}{% url gstudio_nodetype_archive_index %}</wp:base_blog_url>
+ {% for metatype in metatypes %}
+ <wp:metatype>
+ <wp:metatype_nicename>{{ metatype.slug }}</wp:metatype_nicename>
+ <wp:metatype_parent>{{ metatype.parent.title }}</wp:metatype_parent>
+ <wp:cat_name><![CDATA[{{ metatype.title }}]]></wp:cat_name>
+ <wp:metatype_description><![CDATA[{{ metatype.description }}]]></wp:metatype_description>
+ </wp:metatype>
+ {% endfor %}{% for tag in tags %}
+ <wp:tag>
+ <wp:tag_slug>{{ tag.name }}</wp:tag_slug>
+ <wp:tag_name><![CDATA[{{ tag.name }}]]></wp:tag_name>
+ </wp:tag>
+ {% endfor %}{% for nodetype in nodetypes %}
+ <item>
+ <title>{{ nodetype.title }}</title>
+ <link>{{ site_url }}{{ nodetype.get_absolute_url }}</link>
+ <pubDate>{{ nodetype.publication_date|date:"r" }}</pubDate>
+ <dc:creator><![CDATA[{{ nodetype.authors.all.0 }}]]></dc:creator>
+ {% for metatype in nodetype.metatypes.all %}
+ <metatype domain="metatype" nicename="{{ metatype.slug }}"><![CDATA[{{ metatype.title }}]]></metatype>
+ {% endfor %}{% tags_for_object nodetype as tag_list %}{% for tag in tag_list %}
+ <metatype domain="tag" nicename="{{ tag }}"><![CDATA[{{ tag }}]]></metatype>
+ {% endfor %}
+ <guid isPermaLink="true">{{ site_url }}{{ nodetype.get_absolute_url }}</guid>
+ <description></description>
+ <content:encoded><![CDATA[{{ nodetype.html_content|safe }}]]></content:encoded>
+ <excerpt:encoded><![CDATA[{{ nodetype.excerpt }}]]></excerpt:encoded>
+ <wp:post_id>{{ nodetype.pk }}</wp:post_id>
+ <wp:post_date>{{ nodetype.publication_date|date:"Y-m-d H:i:s"}}</wp:post_date>
+ <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>
+ <wp:comment_status>{% if nodetype.comment_enabled %}open{% else %}closed{% endif %}</wp:comment_status>
+ <wp:ping_status>{% if nodetype.pingback_enabled %}open{% else %}closed{% endif %}</wp:ping_status>
+ <wp:post_name>{{ nodetype.slug }}</wp:post_name>
+ <wp:status>{% if nodetype.is_visible %}{% if nodetype.login_required %}private{% else %}publish{% endif %}{% else %}draft{% endif %}</wp:status>
+ <wp:post_parent>0</wp:post_parent>
+ <wp:menu_order>0</wp:menu_order>
+ <wp:post_type>post</wp:post_type>
+ <wp:post_password>{{ nodetype.password }}</wp:post_password>
+ <wp:is_sticky>{{ nodetype.featured|yesno:"1,0" }}</wp:is_sticky>
+ <wp:postmeta>
+ <wp:meta_key>_last_update</wp:meta_key>
+ <wp:meta_value><![CDATA[{{ nodetype.last_update|date:"c"}}]]></wp:meta_value>
+ </wp:postmeta>
+ <wp:postmeta>
+ <wp:meta_key>_start_publication</wp:meta_key>
+ <wp:meta_value><![CDATA[{{ nodetype.start_publication|date:"c"}}]]></wp:meta_value>
+ </wp:postmeta>
+ <wp:postmeta>
+ <wp:meta_key>_end_publication</wp:meta_key>
+ <wp:meta_value><![CDATA[{{ nodetype.end_publication|date:"c"}}]]></wp:meta_value>
+ </wp:postmeta>
+ {% for comment in nodetype.comments %}
+ <wp:comment>
+ <wp:comment_id>{{ comment.id }}</wp:comment_id>
+ <wp:comment_author><![CDATA[{{ comment.userinfo.name }}]]></wp:comment_author>
+ <wp:comment_author_email>{{ comment.userinfo.email }}</wp:comment_author_email>
+ <wp:comment_author_url>{{ comment.userinfo.url }}</wp:comment_author_url>
+ <wp:comment_author_IP>{{ comment.ip_address }}</wp:comment_author_IP>
+ <wp:comment_date>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date>
+ <wp:comment_date_gmt>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date_gmt>
+ <wp:comment_content><![CDATA[{{ comment.comment }}]]></wp:comment_content>
+ <wp:comment_approved>1</wp:comment_approved>
+ <wp:comment_type></wp:comment_type>
+ <wp:comment_parent>0</wp:comment_parent>
+ <wp:comment_user_id>0</wp:comment_user_id>
+ </wp:comment>
+ {% endfor %}{% for comment in nodetype.pingbacks %}
+ <wp:comment>
+ <wp:comment_id>{{ comment.id }}</wp:comment_id>
+ <wp:comment_author><![CDATA[{{ comment.userinfo.name }}]]></wp:comment_author>
+ <wp:comment_author_email>{{ comment.userinfo.email }}</wp:comment_author_email>
+ <wp:comment_author_url>{{ comment.userinfo.url }}</wp:comment_author_url>
+ <wp:comment_author_IP>{{ comment.ip_address }}</wp:comment_author_IP>
+ <wp:comment_date>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date>
+ <wp:comment_date_gmt>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date_gmt>
+ <wp:comment_content><![CDATA[{{ comment.comment }}]]></wp:comment_content>
+ <wp:comment_approved>1</wp:comment_approved>
+ <wp:comment_type>pingback</wp:comment_type>
+ <wp:comment_parent>0</wp:comment_parent>
+ <wp:comment_user_id>0</wp:comment_user_id>
+ </wp:comment>
+ {% endfor %}{% for comment in nodetype.trackbacks %}
+ <wp:comment>
+ <wp:comment_id>{{ comment.id }}</wp:comment_id>
+ <wp:comment_author><![CDATA[{{ comment.userinfo.name }}]]></wp:comment_author>
+ <wp:comment_author_email>{{ comment.userinfo.email }}</wp:comment_author_email>
+ <wp:comment_author_url>{{ comment.userinfo.url }}</wp:comment_author_url>
+ <wp:comment_author_IP>{{ comment.ip_address }}</wp:comment_author_IP>
+ <wp:comment_date>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date>
+ <wp:comment_date_gmt>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date_gmt>
+ <wp:comment_content><![CDATA[{{ comment.comment }}]]></wp:comment_content>
+ <wp:comment_approved>1</wp:comment_approved>
+ <wp:comment_type>trackback</wp:comment_type>
+ <wp:comment_parent>0</wp:comment_parent>
+ <wp:comment_user_id>0</wp:comment_user_id>
+ </wp:comment>
+ {% endfor %}
+ </item>
+ {% endfor %}
+ </channel>
+</rss>
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudiodashboard/dashboard.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudiodashboard/dashboard.html
new file mode 100644
index 0000000..43ea1ed
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudiodashboard/dashboard.html
@@ -0,0 +1,40 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+ {% if user.is_authenticated %}
+ <h1>Welcome {% firstof user.first_name user.username %}</h1>
+ <h2>Gstudio</h2>
+ <ul>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/metatype">{% trans 'Add Metatype' %}</a></li>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/metatype">{% trans 'Add Metatype' %}</a></li>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/objecttype">{% trans 'Add Object type' %}</a></li>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/relationtype">{% trans 'Add Relation type' %}</a></li>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/attributetype">{% trans 'Add Attribute Type' %}</a></li>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/systemtype">{% trans 'Add System Type' %}</li>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/processtype">{% trans 'Add Process Type' %}</li>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/attribute">{% trans 'Add Attribute' %}</li>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/relation">{% trans 'Add Relation' %}</li>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/complement">{% trans 'Add Complement' %}</li>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/intersection">{% trans 'Add Intersection' %}</li>
+ <li><a href="{{get_absoulute_url}}/nodetypes/add/union">{% trans 'Add Union' %}</li>
+ </ul>
+ <h2>Objects</h2>
+ <ul>
+ <li><a href="{{get_absoulute_url}}/objects/add/gbobject">{% trans 'Add Object' %}</a></li>
+ <li><a href="{{get_absoulute_url}}/objects/add/system">{% trans 'Add System' %}</a></li>
+ <li><a href="{{get_absoulute_url}}/objects/add/process">{% trans 'Add Process' %}</a></li>
+ </ul>
+
+
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+
+
+
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioattributeform.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioattributeform.html
new file mode 100644
index 0000000..38e85fa
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioattributeform.html
@@ -0,0 +1,30 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %}
+{% if user.is_authenticated %}
+<h2>Form to add attributes</h2>
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+
+{% endfor %}
+
+
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+</form>
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioattributetypeform.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioattributetypeform.html
new file mode 100644
index 0000000..2a04811
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioattributetypeform.html
@@ -0,0 +1,28 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %}
+{% if user.is_authenticated %}
+<h2>Form to add Attributetypes</h2>
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiocomplementform.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiocomplementform.html
new file mode 100644
index 0000000..7066541
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiocomplementform.html
@@ -0,0 +1,28 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %}
+{% if user.is_authenticated %}
+<h2>Form to add Complements</h2>
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiointersectionform.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiointersectionform.html
new file mode 100644
index 0000000..13cbecc
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiointersectionform.html
@@ -0,0 +1,28 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %}
+{% if user.is_authenticated %}
+<h2>Form to add Intersection</h2>
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiometatypeform.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiometatypeform.html
new file mode 100644
index 0000000..bdb9116
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiometatypeform.html
@@ -0,0 +1,29 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %}
+{% if user.is_authenticated %}
+<h2>Form to add Metatypes</h2>
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+{% endfor %}
+
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioobjecttypeform.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioobjecttypeform.html
new file mode 100644
index 0000000..2fc2fba
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioobjecttypeform.html
@@ -0,0 +1,28 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %}
+{% if user.is_authenticated %}
+<h2>Form to add Objecttypes</h2>
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioprocesstypeform.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioprocesstypeform.html
new file mode 100644
index 0000000..0ecfbc0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudioprocesstypeform.html
@@ -0,0 +1,26 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %}
+{% if user.is_authenticated %}
+<h2>Form to add Processtypes</h2>
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiorelationform.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiorelationform.html
new file mode 100644
index 0000000..79c5ba7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiorelationform.html
@@ -0,0 +1,27 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% if user.is_authenticated %}
+{% csrf_token %}
+<h2>Form to add Relations</h2>
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiorelationtypeform.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiorelationtypeform.html
new file mode 100644
index 0000000..48531b9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiorelationtypeform.html
@@ -0,0 +1,28 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% if user.is_authenticated %}
+
+{% csrf_token %}
+<h2>Form to add Relationtypes</h2>
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiosystemtypeform.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiosystemtypeform.html
new file mode 100644
index 0000000..780a38e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiosystemtypeform.html
@@ -0,0 +1,28 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% if user.is_authenticated %}
+{% csrf_token %}
+<h2>Form to add Systemtypes</h2>
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiounionform.html b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiounionform.html
new file mode 100644
index 0000000..e931013
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/gstudioforms/gstudiounionform.html
@@ -0,0 +1,27 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% if user.is_authenticated %}
+{% csrf_token %}
+<h2>Form to add unions</h2>
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+x
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/index.html b/build/lib.linux-i686-2.6/gstudio/templates/index.html
new file mode 100644
index 0000000..9a13184
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/index.html
@@ -0,0 +1,6 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block content %}
+Index page
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/activate.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/activate.html
new file mode 100644
index 0000000..45df694
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/activate.html
@@ -0,0 +1,18 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+
+{% if account %}
+
+<p>{% trans "Account successfully activated" %}</p>
+
+<p><a href="{% url auth_login %}">{% trans "Log in" %}</a></p>
+
+{% else %}
+
+<p>{% trans "Account activation failed" %}</p>
+
+{% endif %}
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/activation_email.txt b/build/lib.linux-i686-2.6/gstudio/templates/registration/activation_email.txt
new file mode 100644
index 0000000..b300359
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/activation_email.txt
@@ -0,0 +1,6 @@
+{% load i18n %}
+{% trans "Activate account at" %} {{ site.name }}:
+
+http://{{ site.domain }}{% url registration_activate activation_key %}
+
+{% blocktrans %}Link is valid for {{ expiration_days }} days.{% endblocktrans %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/activation_email_subject.txt b/build/lib.linux-i686-2.6/gstudio/templates/registration/activation_email_subject.txt
new file mode 100644
index 0000000..24f477c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/activation_email_subject.txt
@@ -0,0 +1 @@
+{% load i18n %}{% trans "Account activation on" %} {{ site.name }}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/login.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/login.html
new file mode 100644
index 0000000..222505c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/login.html
@@ -0,0 +1,14 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %} {{ form.as_p }}
+
+ <input type="submit" value="{% trans 'Log in' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+
+<p>{% trans "Forgot password" %}? <a href="{% url auth_password_reset %}">{% trans "Reset it" %}</a>!</p>
+<p>{% trans "Not member" %}? <a href="{% url registration_register %}">{% trans "Register" %}</a>!</p>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/logout.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/logout.html
new file mode 100644
index 0000000..8749565
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/logout.html
@@ -0,0 +1,7 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<p>{% trans "Logged out" %}</p>
+ <a href="{{get_absoulute_url}}/accounts/login/">{% trans 'Login again' %}</a>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/password_change_done.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_change_done.html
new file mode 100644
index 0000000..b0f6f28
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_change_done.html
@@ -0,0 +1,6 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<p>{% trans "Password changed" %}</p>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/password_change_form.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_change_form.html
new file mode 100644
index 0000000..71d84df
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_change_form.html
@@ -0,0 +1,10 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %} {{ form.as_p }}
+
+ <input type="submit" value="{% trans 'Submit' %}" />
+</form>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_complete.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_complete.html
new file mode 100644
index 0000000..d0a6df9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_complete.html
@@ -0,0 +1,10 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+
+<p>{% trans "Password reset successfully" %}</p>
+
+<p><a href="{% url auth_login %}">{% trans "Log in" %}</a></p>
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_confirm.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_confirm.html
new file mode 100644
index 0000000..38b04f9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_confirm.html
@@ -0,0 +1,20 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+
+{% if validlink %}
+
+<form method="post" action=".">
+{% csrf_token %} {{ form.as_p }}
+
+ <input type="submit" value="{% trans 'Submit' %}" />
+</form>
+
+{% else %}
+
+<p>{% trans "Password reset failed" %}</p>
+
+{% endif %}
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_done.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_done.html
new file mode 100644
index 0000000..344c088
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_done.html
@@ -0,0 +1,6 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<p>{% trans "Email with password reset instructions has been sent." %}</p>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_email.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_email.html
new file mode 100644
index 0000000..a55c869
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_email.html
@@ -0,0 +1,5 @@
+{% load i18n %}
+{% blocktrans %}Reset password at {{ site_name }}{% endblocktrans %}:
+{% block reset_link %}
+{{ protocol }}://{{ domain }}{% url auth_password_reset_confirm uidb36=uid, token=token %}
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_form.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_form.html
new file mode 100644
index 0000000..71d84df
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/password_reset_form.html
@@ -0,0 +1,10 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %} {{ form.as_p }}
+
+ <input type="submit" value="{% trans 'Submit' %}" />
+</form>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/registration_complete.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/registration_complete.html
new file mode 100644
index 0000000..a86f977
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/registration_complete.html
@@ -0,0 +1,6 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<p>{% trans "You are now registered. Activation email sent." %}</p>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/registration/registration_form.html b/build/lib.linux-i686-2.6/gstudio/templates/registration/registration_form.html
new file mode 100644
index 0000000..71d84df
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/registration/registration_form.html
@@ -0,0 +1,10 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %} {{ form.as_p }}
+
+ <input type="submit" value="{% trans 'Submit' %}" />
+</form>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/gstudio/templates/skeleton.html b/build/lib.linux-i686-2.6/gstudio/templates/skeleton.html
new file mode 100644
index 0000000..8261123
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templates/skeleton.html
@@ -0,0 +1,73 @@
+{% load gstudio_tags i18n %}
+{% get_tags as objecttype_tags %}
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xml:lang="{{ LANGUAGE_CODE }}" lang="{{ LANGUAGE_CODE }}" version="-//W3C//DTD XHTML 1.1//EN" xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <meta http-equiv="cache-control" content="public" />
+ <meta name="robots" content="follow, all" />
+ <meta name="language" content="{{ LANGUAGE_CODE }}" />
+ <meta name="description" content="{% block meta-description %}Demonstration of the Gstudio Blog application.{% endblock %}" />
+ <meta name="keywords" content="{% block meta-keywords %}django, blog, gstudio, {{ objecttype_tags|join:", "}}{% endblock %}" />
+ <meta name="author" content="gnowgi" />
+ {% block meta %}{% endblock %}
+ <link rel="pingback" href="/xmlrpc/" />
+ <link rel="shortcut icon" href="{{ STATIC_URL }}gstudio/img/favicon.ico" />
+ <link rel="home" href="{% url gstudio_objecttype_archive_index %}" />
+ <link rel="stylesheet" type="text/css" media="screen, projection" href="{{ STATIC_URL }}gstudio/css/screen.css" />
+ <link rel="stylesheet" type="text/css" media="print" href="{{ STATIC_URL }}gstudio/css/print.css" />
+ <!--[if lt IE 8]>
+ <link rel="stylesheet" type="text/css" media="screen, projection" href="{{ STATIC_URL }}gstudio/css/ie.css" />
+ <![endif]-->
+ {% block link %}{% endblock %}
+ {% block script %}{% endblock %}
+
+ <title>Gnowledge Studio - {% block title %}{% endblock %}</title>
+ </head>
+ <body id="gstudio">
+ <div class="container">
+
+ <blockquote>
+ <h3>A workspace for constructing and publishing knowledge networks.</h3>
+ </blockquote>
+ <div id="breadcrumbs" class="span-24 last">
+ / {% block breadcrumbs %}{% endblock %}
+ </div>
+ </div>
+ <div id="body" class="span-24 last">
+ <div id="content" class="hfeed span-16 border">
+ {% block content %}
+ <h3>The content block need to be overrided!</h3>
+ {% endblock %}
+ </div>
+ <div id="sidebar" class="span-8 last">
+ <div class="welcome">
+ <h3>Welcome!</h3>
+ <p>
+ This application is an attempt to collaborative
+ framework for online construction and publication of
+ knowledge networks and ontologies.
+ </p>
+ <p>
+ Currently gnowledge studio provides support for
+ Metatypes, Objecttypes, Objects, Relationtypes,
+ Relations, Attributetypes, Attributes, Systemtypes,
+ Systems, Processtypes, and Processes.
+
+ <a href="http://sbox.gnowledge.org/accounts/register">Register</a>
+ at this sandbox site to see the gnowledge studio.
+ </p>
+ </div>
+ {% block sidebar %}
+ {% endblock %}
+ </div>
+ </div>
+ <div id="footer" class="span-24 last">
+ <p>Powered by <a href="http://www.djangoproject.com">Django</a> and <a href="http://github.com/gnowgi/django-gstudio">Gstudio {{ GSTUDIO_VERSION }}</a>.</p>
+ </div>
+ </div>
+ </body>
+</html>
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/templatetags/__init__.py b/build/lib.linux-i686-2.6/gstudio/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templatetags/__init__.py
diff --git a/build/lib.linux-i686-2.6/gstudio/templatetags/gstudio_admin_tags.py b/build/lib.linux-i686-2.6/gstudio/templatetags/gstudio_admin_tags.py
new file mode 100644
index 0000000..a341b3f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templatetags/gstudio_admin_tags.py
@@ -0,0 +1,59 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Template tags and filters for Gstudio's admin"""
+from django.template import Library
+from django.contrib import comments
+from django.contrib.contenttypes.models import ContentType
+
+from gstudio.models import Nodetype
+from gstudio.models import Author
+from gstudio.models import Metatype
+from gstudio.managers import DRAFT
+from gstudio.managers import tags_published
+
+register = Library()
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_draft_nodetypes(
+ number=5, template='admin/gstudio/widgets/_draft_nodetypes.html'):
+ """Return the latest draft nodetypes"""
+ return {'template': template,
+ 'nodetypes': Nodetype.objects.filter(status=DRAFT)[:number]}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_content_stats(
+ template='admin/gstudio/widgets/_content_stats.html'):
+ """Return statistics of the contents"""
+ content_type = ContentType.objects.get_for_model(Nodetype)
+
+ discussions = comments.get_model().objects.filter(
+ is_public=True, content_type=content_type)
+
+ return {'template': template,
+ 'nodetypes': Nodetype.published.count(),
+ 'metatypes': Metatype.objects.count(),
+ 'tags': tags_published().count(),
+ 'authors': Author.published.count(),
+ 'comments': discussions.filter(flags=None).count(),
+ 'pingbacks': discussions.filter(flags__flag='pingback').count(),
+ 'trackbacks': discussions.filter(flags__flag='trackback').count(),
+ 'rejects': comments.get_model().objects.filter(
+ is_public=False, content_type=content_type).count(),
+ }
diff --git a/build/lib.linux-i686-2.6/gstudio/templatetags/gstudio_tags.py b/build/lib.linux-i686-2.6/gstudio/templatetags/gstudio_tags.py
new file mode 100644
index 0000000..a22715e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templatetags/gstudio_tags.py
@@ -0,0 +1,352 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Template tags and filters for Gstudio"""
+from hashlib import md5
+from random import sample
+from urllib import urlencode
+from datetime import datetime
+
+from django.db.models import Q
+from django.db import connection
+from django.template import Node
+from django.template import Library
+from django.template import TemplateSyntaxError
+from django.contrib.comments.models import CommentFlag
+from django.contrib.contenttypes.models import ContentType
+from django.utils.encoding import smart_unicode
+from django.contrib.comments import get_model as get_comment_model
+
+from tagging.models import Tag
+from tagging.utils import calculate_cloud
+
+from gstudio.models import Nodetype
+from gstudio.models import Author
+from gstudio.models import Metatype
+
+from gstudio.gnowql import get_node
+
+from gstudio.managers import tags_published
+from gstudio.comparison import VectorBuilder
+from gstudio.comparison import pearson_score
+from gstudio.templatetags.zcalendar import GstudioCalendar
+from gstudio.templatetags.zbreadcrumbs import retrieve_breadcrumbs
+
+register = Library()
+
+VECTORS = None
+VECTORS_FACTORY = lambda: VectorBuilder(Nodetype.published.all(),
+ ['title', 'excerpt', 'content'])
+CACHE_NODETYPES_RELATED = {}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_metatypes(template='gstudio/tags/metatypes.html'):
+ """Return the metatypes"""
+ return {'template': template,
+ 'metatypes': Metatype.tree.all()}
+
+#@register.inclusion_tag('gstudio/tags/dummy.html')
+#def get_subtypes(template='gstudio/tags/nodetypes.html'):
+# """Return the subtypes"""
+# return {'template': template,
+# 'subtypes': Nodetype.tree.all()}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_authors(template='gstudio/tags/authors.html'):
+ """Return the published authors"""
+ return {'template': template,
+ 'authors': Author.published.all()}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_recent_nodetypes(number=5, template='gstudio/tags/recent_nodetypes.html'):
+ """Return the most recent nodetypes"""
+ return {'template': template,
+ 'nodetypes': Nodetype.published.all()[:number]}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_featured_nodetypes(number=5,
+ template='gstudio/tags/featured_nodetypes.html'):
+ """Return the featured nodetypes"""
+ return {'template': template,
+ 'nodetypes': Nodetype.published.filter(featured=True)[:number]}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_random_nodetypes(number=5, template='gstudio/tags/random_nodetypes.html'):
+ """Return random nodetypes"""
+ nodetypes = Nodetype.published.all()
+ if number > len(nodetypes):
+ number = len(nodetypes)
+ return {'template': template,
+ 'nodetypes': sample(nodetypes, number)}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_popular_nodetypes(number=5, template='gstudio/tags/popular_nodetypes.html'):
+ """Return popular nodetypes"""
+ ctype = ContentType.objects.get_for_model(Nodetype)
+ query = """SELECT object_pk, COUNT(*) AS score
+ FROM %s
+ WHERE content_type_id = %%s
+ AND is_public = '1'
+ GROUP BY object_pk
+ ORDER BY score DESC""" % get_comment_model()._meta.db_table
+
+ cursor = connection.cursor()
+ cursor.execute(query, [ctype.id])
+ object_ids = [int(row[0]) for row in cursor.fetchall()]
+
+ # Use ``in_bulk`` here instead of an ``id__in`` filter, because ``id__in``
+ # would clobber the ordering.
+ object_dict = Nodetype.published.in_bulk(object_ids)
+
+ return {'template': template,
+ 'nodetypes': [object_dict[object_id]
+ for object_id in object_ids
+ if object_id in object_dict][:number]}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html', takes_context=True)
+def get_similar_nodetypes(context, number=5,
+ template='gstudio/tags/similar_nodetypes.html',
+ flush=False):
+ """Return similar nodetypes"""
+ global VECTORS
+ global CACHE_NODETYPES_RELATED
+
+ if VECTORS is None or flush:
+ VECTORS = VECTORS_FACTORY()
+ CACHE_NODETYPES_RELATED = {}
+
+ def compute_related(object_id, dataset):
+ """Compute related nodetypes to a nodetype with a dataset"""
+ object_vector = None
+ for nodetype, e_vector in dataset.items():
+ if nodetype.pk == object_id:
+ object_vector = e_vector
+
+ if not object_vector:
+ return []
+
+ nodetype_related = {}
+ for nodetype, e_vector in dataset.items():
+ if nodetype.pk != object_id:
+ score = pearson_score(object_vector, e_vector)
+ if score:
+ nodetype_related[nodetype] = score
+
+ related = sorted(nodetype_related.items(), key=lambda(k, v): (v, k))
+ return [rel[0] for rel in related]
+
+ object_id = context['object'].pk
+ columns, dataset = VECTORS()
+ key = '%s-%s' % (object_id, VECTORS.key)
+ if not key in CACHE_NODETYPES_RELATED.keys():
+ CACHE_NODETYPES_RELATED[key] = compute_related(object_id, dataset)
+
+ nodetypes = CACHE_NODETYPES_RELATED[key][:number]
+ return {'template': template,
+ 'nodetypes': nodetypes}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_archives_nodetypes(template='gstudio/tags/archives_nodetypes.html'):
+ """Return archives nodetypes"""
+ return {'template': template,
+ 'archives': Nodetype.published.dates('creation_date', 'month',
+ order='DESC')}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_archives_nodetypes_tree(
+ template='gstudio/tags/archives_nodetypes_tree.html'):
+ """Return archives nodetypes as a Tree"""
+ return {'template': template,
+ 'archives': Nodetype.published.dates('creation_date', 'day',
+ order='ASC')}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html', takes_context=True)
+def get_calendar_nodetypes(context, year=None, month=None,
+ template='gstudio/tags/calendar.html'):
+ """Return an HTML calendar of nodetypes"""
+ if not year or not month:
+ date_month = context.get('month') or context.get('day') or \
+ getattr(context.get('object'), 'creation_date', None) or \
+ datetime.today()
+ year, month = date_month.timetuple()[:2]
+
+ calendar = GstudioCalendar()
+ current_month = datetime(year, month, 1)
+
+ dates = list(Nodetype.published.dates('creation_date', 'month'))
+
+ if not current_month in dates:
+ dates.append(current_month)
+ dates.sort()
+ index = dates.index(current_month)
+
+ previous_month = index > 0 and dates[index - 1] or None
+ next_month = index != len(dates) - 1 and dates[index + 1] or None
+
+ return {'template': template,
+ 'next_month': next_month,
+ 'previous_month': previous_month,
+ 'calendar': calendar.formatmonth(year, month)}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_recent_comments(number=5, template='gstudio/tags/recent_comments.html'):
+ """Return the most recent comments"""
+ # Using map(smart_unicode... fix bug related to issue #8554
+ nodetype_published_pks = map(smart_unicode,
+ Nodetype.published.values_list('id', flat=True))
+ content_type = ContentType.objects.get_for_model(Nodetype)
+
+ comments = get_comment_model().objects.filter(
+ Q(flags=None) | Q(flags__flag=CommentFlag.MODERATOR_APPROVAL),
+ content_type=content_type, object_pk__in=nodetype_published_pks,
+ is_public=True).order_by('-submit_date')[:number]
+
+ return {'template': template,
+ 'comments': comments}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_recent_linkbacks(number=5,
+ template='gstudio/tags/recent_linkbacks.html'):
+ """Return the most recent linkbacks"""
+ nodetype_published_pks = map(smart_unicode,
+ Nodetype.published.values_list('id', flat=True))
+ content_type = ContentType.objects.get_for_model(Nodetype)
+
+ linkbacks = get_comment_model().objects.filter(
+ content_type=content_type,
+ object_pk__in=nodetype_published_pks,
+ flags__flag__in=['pingback', 'trackback'],
+ is_public=True).order_by(
+ '-submit_date')[:number]
+
+ return {'template': template,
+ 'linkbacks': linkbacks}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html', takes_context=True)
+def gstudio_pagination(context, page, begin_pages=3, end_pages=3,
+ before_pages=2, after_pages=2,
+ template='gstudio/tags/pagination.html'):
+ """Return a Digg-like pagination, by splitting long list of page
+ into 3 blocks of pages"""
+ GET_string = ''
+ for key, value in context['request'].GET.items():
+ if key != 'page':
+ GET_string += '&%s=%s' % (key, value)
+
+ begin = page.paginator.page_range[:begin_pages]
+ end = page.paginator.page_range[-end_pages:]
+ middle = page.paginator.page_range[max(page.number - before_pages - 1, 0):
+ page.number + after_pages]
+
+ if set(begin) & set(end): # [1, 2, 3], [...], [2, 3, 4]
+ begin = sorted(set(begin + end)) # [1, 2, 3, 4]
+ middle, end = [], []
+ elif begin[-1] + 1 == end[0]: # [1, 2, 3], [...], [4, 5, 6]
+ begin += end # [1, 2, 3, 4, 5, 6]
+ middle, end = [], []
+ elif set(begin) & set(middle): # [1, 2, 3], [2, 3, 4], [...]
+ begin = sorted(set(begin + middle)) # [1, 2, 3, 4]
+ middle = []
+ elif begin[-1] + 1 == middle[0]: # [1, 2, 3], [4, 5, 6], [...]
+ begin += middle # [1, 2, 3, 4, 5, 6]
+ middle = []
+ elif middle[-1] + 1 == end[0]: # [...], [15, 16, 17], [18, 19, 20]
+ end = middle + end # [15, 16, 17, 18, 19, 20]
+ middle = []
+ elif set(middle) & set(end): # [...], [17, 18, 19], [18, 19, 20]
+ end = sorted(set(middle + end)) # [17, 18, 19, 20]
+ middle = []
+
+ return {'template': template, 'page': page, 'GET_string': GET_string,
+ 'begin': begin, 'middle': middle, 'end': end}
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html', takes_context=True)
+def gstudio_breadcrumbs(context, separator='/', root_name='Nodetype',
+ template='gstudio/tags/breadcrumbs.html',):
+ """Return a breadcrumb for the application"""
+ path = context['request'].path
+ page_object = context.get('object') or context.get('metatype') or \
+ context.get('tag') or context.get('author')
+ breadcrumbs = retrieve_breadcrumbs(path, page_object, root_name)
+
+ return {'template': template,
+ 'separator': separator,
+ 'breadcrumbs': breadcrumbs}
+
+@register.simple_tag
+def get_gravatar(email, size=80, rating='g', default=None):
+ """Return url for a Gravatar"""
+ url = 'http://www.gravatar.com/avatar/%s.jpg' % \
+ md5(email.strip().lower()).hexdigest()
+ options = {'s': size, 'r': rating}
+ if default:
+ options['d'] = default
+
+ url = '%s?%s' % (url, urlencode(options))
+ return url.replace('&', '&amp;')
+
+@register.simple_tag
+def get_type(name):
+
+ """Return the type of node"""
+ return get_node(name)
+
+
+class TagsNode(Node):
+ def __init__(self, context_var):
+ self.context_var = context_var
+
+ def render(self, context):
+ context[self.context_var] = tags_published()
+ return ''
+
+
+@register.tag
+def get_tags(parser, token):
+ """{% get_tags as var %}"""
+ bits = token.split_contents()
+
+ if len(bits) != 3:
+ raise TemplateSyntaxError(
+ 'get_tags tag takes exactly two arguments')
+ if bits[1] != 'as':
+ raise TemplateSyntaxError(
+ "first argument to get_tags tag must be 'as'")
+ return TagsNode(bits[2])
+
+
+@register.inclusion_tag('gstudio/tags/dummy.html')
+def get_tag_cloud(steps=6, template='gstudio/tags/tag_cloud.html'):
+ """Return a cloud of published tags"""
+ tags = Tag.objects.usage_for_queryset(
+ Nodetype.published.all(), counts=True)
+ return {'template': template,
+ 'tags': calculate_cloud(tags, steps)}
diff --git a/build/lib.linux-i686-2.6/gstudio/templatetags/zbreadcrumbs.py b/build/lib.linux-i686-2.6/gstudio/templatetags/zbreadcrumbs.py
new file mode 100644
index 0000000..27f06c4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templatetags/zbreadcrumbs.py
@@ -0,0 +1,167 @@
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Breadcrumb module for Gstudio templatetags"""
+import re
+from datetime import datetime
+
+from django.core.urlresolvers import reverse
+from django.utils.translation import ugettext as _
+
+
+class Crumb(object):
+ """Part of the Breadcrumbs"""
+ def __init__(self, name, url=None):
+ self.name = name
+ self.url = url
+
+
+def year_crumb(creation_date):
+ """Crumb for a year"""
+ year = creation_date.strftime('%Y')
+ return Crumb(year, reverse('gstudio_nodetype_archive_year',
+ args=[year]))
+
+
+def month_crumb(creation_date):
+ """Crumb for a month"""
+ year = creation_date.strftime('%Y')
+ month = creation_date.strftime('%m')
+ month_text = creation_date.strftime('%b').capitalize()
+ return Crumb(month_text, reverse('gstudio_nodetype_archive_month',
+ args=[year, month]))
+
+
+def day_crumb(creation_date):
+ """Crumb for a day"""
+ year = creation_date.strftime('%Y')
+ month = creation_date.strftime('%m')
+ day = creation_date.strftime('%d')
+ return Crumb(day, reverse('gstudio_nodetype_archive_day',
+ args=[year, month, day]))
+
+
+GSTUDIO_ROOT_URL = lambda: reverse('gstudio_nodetype_archive_index')
+
+MODEL_BREADCRUMBS = {'Tag': lambda x: [Crumb(_('Tags'),
+ reverse('gstudio_tag_list')),
+ Crumb(x.name)],
+ 'Author': lambda x: [Crumb(_('Authors'),
+ reverse('gstudio_author_list')),
+ Crumb(x.username)],
+ 'Metatype': lambda x: [Crumb(
+ _('Metatypes'), reverse('gstudio_metatype_list'))] + \
+ [Crumb(anc.title, anc.get_absolute_url())
+ for anc in x.get_ancestors()] + [Crumb(x.title)],
+ 'Nodetype': lambda x: [year_crumb(x.creation_date),
+ month_crumb(x.creation_date),
+ day_crumb(x.creation_date),
+ Crumb(x.title)]}
+
+DATE_REGEXP = re.compile(
+ r'.*(?P<year>\d{4})/(?P<month>\d{2})?/(?P<day>\d{2})?.*')
+
+
+def retrieve_breadcrumbs(path, model_instance, root_name='gstudio'):
+ """Build a semi-hardcoded breadcrumbs
+ based of the model's url handled by Gstudio"""
+ breadcrumbs = []
+
+ if root_name:
+ breadcrumbs.append(Crumb(root_name, GSTUDIO_ROOT_URL()))
+
+ if model_instance is not None:
+ key = model_instance.__class__.__name__
+ if key in MODEL_BREADCRUMBS:
+ breadcrumbs.extend(MODEL_BREADCRUMBS[key](model_instance))
+ return breadcrumbs
+
+ date_match = DATE_REGEXP.match(path)
+ if date_match:
+ date_dict = date_match.groupdict()
+ path_date = datetime(
+ int(date_dict['year']),
+ date_dict.get('month') is not None and \
+ int(date_dict.get('month')) or 1,
+ date_dict.get('day') is not None and \
+ int(date_dict.get('day')) or 1)
+
+ date_breadcrumbs = [year_crumb(path_date)]
+ if date_dict['month']:
+ date_breadcrumbs.append(month_crumb(path_date))
+ if date_dict['day']:
+ date_breadcrumbs.append(day_crumb(path_date))
+ breadcrumbs.extend(date_breadcrumbs)
+
+ return breadcrumbs
+
+ url_components = [comp for comp in
+ path.replace(GSTUDIO_ROOT_URL(), '').split('/') if comp]
+ if len(url_components):
+ breadcrumbs.append(Crumb(_(url_components[-1].capitalize())))
+
+ return breadcrumbs
diff --git a/build/lib.linux-i686-2.6/gstudio/templatetags/zcalendar.py b/build/lib.linux-i686-2.6/gstudio/templatetags/zcalendar.py
new file mode 100644
index 0000000..8ff1b77
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/templatetags/zcalendar.py
@@ -0,0 +1,128 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
+"""Calendar module for Gstudio templatetags"""
+from datetime import date
+from calendar import HTMLCalendar
+
+from django.utils.dates import MONTHS
+from django.utils.dates import WEEKDAYS_ABBR
+from django.utils.formats import get_format
+from django.core.urlresolvers import reverse
+
+from gstudio.models import Nodetype
+
+AMERICAN_TO_EUROPEAN_WEEK_DAYS = [6, 0, 1, 2, 3, 4, 5]
+
+
+class GstudioCalendar(HTMLCalendar):
+ """Override of HTMLCalendar"""
+
+ def __init__(self):
+ """Retrieve and convert the localized first week day
+ at initialization"""
+ HTMLCalendar.__init__(self, AMERICAN_TO_EUROPEAN_WEEK_DAYS[
+ get_format('FIRST_DAY_OF_WEEK')])
+
+ def formatday(self, day, weekday):
+ """Return a day as a table cell with a link
+ if nodetypes are published this day"""
+ if day and day in self.day_nodetypes:
+ day_date = date(self.current_year, self.current_month, day)
+ archive_day_url = reverse('gstudio_nodetype_archive_day',
+ args=[day_date.strftime('%Y'),
+ day_date.strftime('%m'),
+ day_date.strftime('%d')])
+ return '<td class="%s nodetype"><a href="%s" '\
+ 'rel="archives">%d</a></td>' % (
+ self.cssclasses[weekday], archive_day_url, day)
+
+ return super(GstudioCalendar, self).formatday(day, weekday)
+
+ def formatmonth(self, theyear, themonth, withyear=True):
+ """Return a formatted month as a table with
+ new attributes computed for formatting a day"""
+ self.current_year = theyear
+ self.current_month = themonth
+ self.day_nodetypes = [nodetypes.creation_date.day for nodetypes in
+ Nodetype.published.filter(
+ creation_date__year=theyear,
+ creation_date__month=themonth)]
+
+ return super(GstudioCalendar, self).formatmonth(
+ theyear, themonth, withyear)
+
+ def formatweekday(self, day):
+ """Return a weekday name translated
+ as a table header."""
+ return '<th class="%s">%s</th>' % (self.cssclasses[day],
+ WEEKDAYS_ABBR[day].title())
+
+ def formatmonthname(self, theyear, themonth, withyear=True):
+ """Return a month name translated
+ as a table row."""
+ monthname = '%s %s' % (MONTHS[themonth].title(), theyear)
+ return '<tr><th colspan="7" class="month">%s</th></tr>' % monthname
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/__init__.py b/build/lib.linux-i686-2.6/gstudio/tests/__init__.py
new file mode 100644
index 0000000..bf03c0a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/__init__.py
@@ -0,0 +1,121 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Unit tests for Gstudio"""
+from unittest import TestSuite
+from unittest import TestLoader
+from django.conf import settings
+
+from gstudio.tests.nodetype import NodetypeTestCase # ~0.2s
+from gstudio.tests.nodetype import NodetypeHtmlContentTestCase # ~0.5s
+from gstudio.tests.nodetype import NodetypeGetBaseModelTestCase
+from gstudio.tests.signals import SignalsTestCase
+from gstudio.tests.metatype import MetatypeTestCase
+from gstudio.tests.admin import NodetypeAdminTestCase
+from gstudio.tests.admin import MetatypeAdminTestCase
+from gstudio.tests.managers import ManagersTestCase # ~1.2s
+from gstudio.tests.feeds import GstudioFeedsTestCase # ~0.4s
+from gstudio.tests.views import GstudioViewsTestCase # ~1.5s ouch...
+from gstudio.tests.views import GstudioCustomDetailViews # ~0.3s
+from gstudio.tests.pingback import PingBackTestCase # ~0.3s
+from gstudio.tests.metaweblog import MetaWeblogTestCase # ~0.6s
+from gstudio.tests.comparison import ComparisonTestCase
+from gstudio.tests.quick_nodetype import QuickNodetypeTestCase # ~0.4s
+from gstudio.tests.sitemaps import GstudioSitemapsTestCase # ~0.3s
+from gstudio.tests.ping import DirectoryPingerTestCase
+from gstudio.tests.ping import ExternalUrlsPingerTestCase
+from gstudio.tests.templatetags import TemplateTagsTestCase # ~0.4s
+from gstudio.tests.moderator import NodetypeCommentModeratorTestCase # ~0.1s
+from gstudio.tests.spam_checker import SpamCheckerTestCase
+from gstudio.tests.url_shortener import URLShortenerTestCase
+from gstudio.signals import disconnect_gstudio_signals
+# TOTAL ~ 6.6s
+
+
+def suite():
+ """Suite of TestCases for Django"""
+ suite = TestSuite()
+ loader = TestLoader()
+
+ test_cases = (ManagersTestCase, NodetypeTestCase,
+ NodetypeGetBaseModelTestCase, SignalsTestCase,
+ NodetypeHtmlContentTestCase, MetatypeTestCase,
+ GstudioViewsTestCase, GstudioFeedsTestCase,
+ GstudioSitemapsTestCase, ComparisonTestCase,
+ DirectoryPingerTestCase, ExternalUrlsPingerTestCase,
+ TemplateTagsTestCase, QuickNodetypeTestCase,
+ URLShortenerTestCase, NodetypeCommentModeratorTestCase,
+ GstudioCustomDetailViews, SpamCheckerTestCase,
+ NodetypeAdminTestCase, MetatypeAdminTestCase)
+
+ if 'django_xmlrpc' in settings.INSTALLED_APPS:
+ test_cases += (PingBackTestCase, MetaWeblogTestCase)
+
+ for test_class in test_cases:
+ tests = loader.loadTestsFromTestCase(test_class)
+ suite.addTests(tests)
+
+ return suite
+
+disconnect_gstudio_signals()
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/admin.py b/build/lib.linux-i686-2.6/gstudio/tests/admin.py
new file mode 100644
index 0000000..281ca3e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/admin.py
@@ -0,0 +1,151 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Test cases for Gstudio's admin"""
+from django.test import TestCase
+from django.contrib.auth.models import User
+
+from gstudio import settings
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+
+
+class NodetypeAdminTestCase(TestCase):
+ """Test case for Nodetype Admin"""
+ urls = 'gstudio.tests.urls'
+
+ def setUp(self):
+ self.original_wysiwyg = settings.WYSIWYG
+ settings.WYSIWYG = None
+ User.objects.create_superuser('admin', 'admin@example.com', 'password')
+ metatype_1 = Metatype.objects.create(title='Metatype 1', slug='cat-1')
+ Metatype.objects.create(title='Metatype 2', slug='cat-2',
+ parent=metatype_1)
+
+ self.client.login(username='admin', password='password')
+
+ def tearDown(self):
+ settings.WYSIWYG = self.original_wysiwyg
+
+ def test_nodetype_add_and_change(self):
+ """Test the insertion of a nodetype"""
+ self.assertEquals(Nodetype.objects.count(), 0)
+ post_data = {'title': u'New nodetype',
+ 'template': u'gstudio/nodetype_detail.html',
+ 'creation_date_0': u'2011-01-01',
+ 'creation_date_1': u'12:00:00',
+ 'start_publication_0': u'2011-01-01',
+ 'start_publication_1': u'12:00:00',
+ 'end_publication_0': u'2042-03-15',
+ 'end_publication_1': u'00:00:00',
+ 'status': u'2',
+ 'sites': u'1',
+ 'content': u'My content'}
+
+ response = self.client.post('/admin/gstudio/nodetype/add/', post_data)
+ self.assertEquals(response.status_code, 200)
+ self.assertEquals(Nodetype.objects.count(), 0)
+
+ post_data.update({'slug': u'new-nodetype'})
+ response = self.client.post('/admin/gstudio/nodetype/add/',
+ post_data, follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/admin/gstudio/nodetype/', 302)])
+ self.assertEquals(Nodetype.objects.count(), 1)
+
+
+class MetatypeAdminTestCase(TestCase):
+ """Test cases for Metatype Admin"""
+ urls = 'gstudio.tests.urls'
+
+ def setUp(self):
+ User.objects.create_superuser('admin', 'admin@example.com', 'password')
+ self.client.login(username='admin', password='password')
+
+ def test_metatype_add_and_change(self):
+ """Test the insertion of a Metatype, change error, and new insert"""
+ self.assertEquals(Metatype.objects.count(), 0)
+ post_data = {'title': u'New metatype',
+ 'slug': u'new-metatype'}
+ response = self.client.post('/admin/gstudio/metatype/add/',
+ post_data, follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/admin/gstudio/metatype/', 302)])
+ self.assertEquals(Metatype.objects.count(), 1)
+
+ post_data.update({'parent': u'1'})
+ response = self.client.post('/admin/gstudio/metatype/1/', post_data)
+ self.assertEquals(response.status_code, 200)
+
+ response = self.client.post('/admin/gstudio/metatype/add/', post_data)
+ self.assertEquals(response.status_code, 200)
+ self.assertEquals(Metatype.objects.count(), 1)
+
+ post_data.update({'slug': u'new-metatype-2'})
+ response = self.client.post('/admin/gstudio/metatype/add/',
+ post_data, follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/admin/gstudio/metatype/', 302)])
+ self.assertEquals(Metatype.objects.count(), 2)
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/comparison.py b/build/lib.linux-i686-2.6/gstudio/tests/comparison.py
new file mode 100644
index 0000000..a90959c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/comparison.py
@@ -0,0 +1,115 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Test cases for Gstudio's comparison"""
+from django.test import TestCase
+
+from gstudio.models import Nodetype
+from gstudio.comparison import pearson_score
+from gstudio.comparison import VectorBuilder
+from gstudio.comparison import ClusteredModel
+
+
+class ComparisonTestCase(TestCase):
+ """Test cases for comparison tools"""
+
+ def test_pearson_score(self):
+ self.assertEquals(pearson_score([42], [42]), 0.0)
+ self.assertEquals(pearson_score([0, 1, 2], [0, 1, 2]), 0.0)
+ self.assertEquals(pearson_score([0, 1, 3], [0, 1, 2]),
+ 0.051316701949486232)
+ self.assertEquals(pearson_score([0, 1, 2], [0, 1, 3]),
+ 0.051316701949486232)
+
+ def test_clustered_model(self):
+ params = {'title': 'My nodetype 1', 'content': 'My content 1',
+ 'tags': 'gstudio, test', 'slug': 'my-nodetype-1'}
+ Nodetype.objects.create(**params)
+ params = {'title': 'My nodetype 2', 'content': 'My content 2',
+ 'tags': 'gstudio, test', 'slug': 'my-nodetype-2'}
+ Nodetype.objects.create(**params)
+ cm = ClusteredModel(Nodetype.objects.all())
+ self.assertEquals(cm.dataset().values(), ['1', '2'])
+ cm = ClusteredModel(Nodetype.objects.all(),
+ ['title', 'excerpt', 'content'])
+ self.assertEquals(cm.dataset().values(), ['My nodetype 1 My content 1',
+ 'My nodetype 2 My content 2'])
+
+ def test_vector_builder(self):
+ vectors = VectorBuilder(Nodetype.objects.all(),
+ ['title', 'excerpt', 'content'])
+ params = {'title': 'My nodetype 1', 'content':
+ 'This is my first content',
+ 'tags': 'gstudio, test', 'slug': 'my-nodetype-1'}
+ Nodetype.objects.create(**params)
+ params = {'title': 'My nodetype 2', 'content':
+ 'My second nodetype',
+ 'tags': 'gstudio, test', 'slug': 'my-nodetype-2'}
+ Nodetype.objects.create(**params)
+ columns, dataset = vectors()
+ self.assertEquals(columns, ['content', 'This', 'my', 'is', '1',
+ 'second', '2', 'first'])
+ self.assertEquals(dataset.values(), [[1, 1, 1, 1, 1, 0, 0, 1],
+ [0, 0, 0, 0, 0, 1, 1, 0]])
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/custom_spam_checker.py b/build/lib.linux-i686-2.6/gstudio/tests/custom_spam_checker.py
new file mode 100644
index 0000000..989aea2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/custom_spam_checker.py
@@ -0,0 +1,75 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Custom spam checker backend for testing Gstudio"""
+from django.core.exceptions import ImproperlyConfigured
+
+
+raise ImproperlyConfigured('This backend only exists for testing')
+
+
+def backend(nodetype):
+ """Custom spam checker backend for testing Gstudio"""
+ return False
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/custom_url_shortener.py b/build/lib.linux-i686-2.6/gstudio/tests/custom_url_shortener.py
new file mode 100644
index 0000000..d5fce4d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/custom_url_shortener.py
@@ -0,0 +1,75 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Custom url shortener backend for testing Gstudio"""
+from django.core.exceptions import ImproperlyConfigured
+
+
+raise ImproperlyConfigured('This backend only exists for testing')
+
+
+def backend(nodetype):
+ """Custom url shortener backend for testing Gstudio"""
+ return ''
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/custom_views_detail_urls.py b/build/lib.linux-i686-2.6/gstudio/tests/custom_views_detail_urls.py
new file mode 100644
index 0000000..50d1634
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/custom_views_detail_urls.py
@@ -0,0 +1,108 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test urls for the gstudio project"""
+from functools import wraps
+
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+from gstudio.views.tags import tag_detail
+from gstudio.views.authors import author_detail
+from gstudio.views.metatypes import metatype_detail
+from gstudio.tests.urls import urlpatterns as test_urlpatterns
+
+
+def call_with_template_and_extra_context(
+ view, template_name='gstudio/nodetype_list.html',
+ extra_context={'extra': 'context'}):
+
+ @wraps(view)
+ def wrapper(*args, **kwargs):
+ return view(template_name=template_name,
+ extra_context=extra_context,
+ *args, **kwargs)
+
+ return wrapper
+
+custom_tag_detail = call_with_template_and_extra_context(tag_detail)
+custom_author_detail = call_with_template_and_extra_context(author_detail)
+custom_metatype_detail = call_with_template_and_extra_context(metatype_detail)
+
+
+urlpatterns = patterns(
+ '',
+ url(r'^authors/(?P<username>[.+-@\w]+)/$',
+ custom_author_detail, name='gstudio_author_detail'),
+ url(r'^authors/(?P<username>[.+-@\w]+)/page/(?P<page>\d+)/$',
+ custom_author_detail, name='gstudio_author_detail_paginated'),
+ url(r'^metatypes/(?P<path>[-\/\w]+)/page/(?P<page>\d+)/$',
+ custom_metatype_detail, name='gstudio_metatype_detail_paginated'),
+ url(r'^metatypes/(?P<path>[-\/\w]+)/$',
+ custom_metatype_detail, name='gstudio_metatype_detail'),
+ url(r'^tags/(?P<tag>[- \w]+)/$',
+ custom_tag_detail, name='gstudio_tag_detail'),
+ url(r'^tags/(?P<tag>[- \w]+)/page/(?P<page>\d+)/$',
+ custom_tag_detail, name='gstudio_tag_detail_paginated'),
+ ) + test_urlpatterns
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/feeds.py b/build/lib.linux-i686-2.6/gstudio/tests/feeds.py
new file mode 100644
index 0000000..da22995
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/feeds.py
@@ -0,0 +1,360 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Gstudio's feeds"""
+from datetime import datetime
+
+from django.test import TestCase
+from django.conf import settings
+from django.contrib import comments
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.utils.translation import ugettext as _
+from django.utils.feedgenerator import Atom1Feed
+from django.utils.feedgenerator import DefaultFeed
+from django.core.exceptions import ObjectDoesNotExist
+from django.contrib.contenttypes.models import ContentType
+
+from tagging.models import Tag
+
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+from gstudio.managers import PUBLISHED
+from gstudio import feeds
+from gstudio.feeds import NodetypeFeed
+from gstudio.feeds import LatestNodetypes
+from gstudio.feeds import MetatypeNodetypes
+from gstudio.feeds import AuthorNodetypes
+from gstudio.feeds import TagNodetypes
+from gstudio.feeds import SearchNodetypes
+from gstudio.feeds import NodetypeDiscussions
+from gstudio.feeds import NodetypeComments
+from gstudio.feeds import NodetypePingbacks
+from gstudio.feeds import NodetypeTrackbacks
+
+
+class GstudioFeedsTestCase(TestCase):
+ """Test cases for the Feed classes provided"""
+ urls = 'gstudio.tests.urls'
+
+ def setUp(self):
+ self.site = Site.objects.get_current()
+ self.author = User.objects.create(username='admin',
+ email='admin@example.com')
+ self.metatype = Metatype.objects.create(title='Tests', slug='tests')
+ self.nodetype_ct_id = ContentType.objects.get_for_model(Nodetype).pk
+
+ def create_published_nodetype(self):
+ params = {'title': 'My test nodetype',
+ 'content': 'My test content with image '
+ '<img src="/image.jpg" />',
+ 'slug': 'my-test-nodetype',
+ 'tags': 'tests',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ nodetype = Nodetype.objects.create(**params)
+ nodetype.sites.add(self.site)
+ nodetype.metatypes.add(self.metatype)
+ nodetype.authors.add(self.author)
+ return nodetype
+
+ def create_discussions(self, nodetype):
+ comment = comments.get_model().objects.create(comment='My Comment',
+ user=self.author,
+ content_object=nodetype,
+ site=self.site)
+ pingback = comments.get_model().objects.create(comment='My Pingback',
+ user=self.author,
+ content_object=nodetype,
+ site=self.site)
+ pingback.flags.create(user=self.author, flag='pingback')
+ trackback = comments.get_model().objects.create(comment='My Trackback',
+ user=self.author,
+ content_object=nodetype,
+ site=self.site)
+ trackback.flags.create(user=self.author, flag='trackback')
+ return [comment, pingback, trackback]
+
+ def test_nodetype_feed(self):
+ original_feeds_format = feeds.FEEDS_FORMAT
+ feeds.FEEDS_FORMAT = ''
+ nodetype = self.create_published_nodetype()
+ feed = NodetypeFeed()
+ self.assertEquals(feed.item_pubdate(nodetype), nodetype.creation_date)
+ self.assertEquals(feed.item_metatypes(nodetype), [self.metatype.title])
+ self.assertEquals(feed.item_author_name(nodetype), self.author.username)
+ self.assertEquals(feed.item_author_email(nodetype), self.author.email)
+ self.assertEquals(
+ feed.item_author_link(nodetype),
+ 'http://example.com/authors/%s/' % self.author.username)
+ # Test a NoReverseMatch for item_author_link
+ self.author.username = '[]'
+ self.author.save()
+ feed.item_author_name(nodetype)
+ self.assertEquals(feed.item_author_link(nodetype), 'http://example.com')
+ feeds.FEEDS_FORMAT = original_feeds_format
+
+ def test_nodetype_feed_enclosure(self):
+ original_feeds_format = feeds.FEEDS_FORMAT
+ feeds.FEEDS_FORMAT = ''
+ nodetype = self.create_published_nodetype()
+ feed = NodetypeFeed()
+ self.assertEquals(
+ feed.item_enclosure_url(nodetype), 'http://example.com/image.jpg')
+ nodetype.content = 'My test content with image <img src="image.jpg" />',
+ nodetype.save()
+ self.assertEquals(
+ feed.item_enclosure_url(nodetype), 'http://example.com/image.jpg')
+ nodetype.content = 'My test content with image ' \
+ '<img src="http://test.com/image.jpg" />'
+ nodetype.save()
+ self.assertEquals(
+ feed.item_enclosure_url(nodetype), 'http://test.com/image.jpg')
+ nodetype.image = 'image_field.jpg'
+ nodetype.save()
+ self.assertEquals(feed.item_enclosure_url(nodetype),
+ '%simage_field.jpg' % settings.MEDIA_URL)
+ self.assertEquals(feed.item_enclosure_length(nodetype), '100000')
+ self.assertEquals(feed.item_enclosure_mime_type(nodetype), 'image/jpeg')
+ feeds.FEEDS_FORMAT = original_feeds_format
+
+ def test_latest_nodetypes(self):
+ self.create_published_nodetype()
+ feed = LatestNodetypes()
+ self.assertEquals(feed.link(), '/')
+ self.assertEquals(len(feed.items()), 1)
+ self.assertEquals(feed.title(),
+ 'example.com - %s' % _('Latest nodetypes'))
+ self.assertEquals(
+ feed.description(),
+ _('The latest nodetypes for the site %s') % 'example.com')
+
+ def test_metatype_nodetypes(self):
+ self.create_published_nodetype()
+ feed = MetatypeNodetypes()
+ self.assertEquals(feed.get_object('request', '/tests/'), self.metatype)
+ self.assertEquals(len(feed.items(self.metatype)), 1)
+ self.assertEquals(feed.link(self.metatype), '/metatypes/tests/')
+ self.assertEquals(
+ feed.title(self.metatype),
+ _('Nodetypes for the metatype %s') % self.metatype.title)
+ self.assertEquals(
+ feed.description(self.metatype),
+ _('The latest nodetypes for the metatype %s') % self.metatype.title)
+
+ def test_author_nodetypes(self):
+ self.create_published_nodetype()
+ feed = AuthorNodetypes()
+ self.assertEquals(feed.get_object('request', 'admin'), self.author)
+ self.assertEquals(len(feed.items(self.author)), 1)
+ self.assertEquals(feed.link(self.author), '/authors/admin/')
+ self.assertEquals(feed.title(self.author),
+ _('Nodetypes for author %s') % self.author.username)
+ self.assertEquals(feed.description(self.author),
+ _('The latest nodetypes by %s') % self.author.username)
+
+ def test_tag_nodetypes(self):
+ self.create_published_nodetype()
+ feed = TagNodetypes()
+ tag = Tag(name='tests')
+ self.assertEquals(feed.get_object('request', 'tests').name, 'tests')
+ self.assertEquals(len(feed.items('tests')), 1)
+ self.assertEquals(feed.link(tag), '/tags/tests/')
+ self.assertEquals(feed.title(tag),
+ _('Nodetypes for the tag %s') % tag.name)
+ self.assertEquals(feed.description(tag),
+ _('The latest nodetypes for the tag %s') % tag.name)
+
+ def test_search_nodetypes(self):
+ class FakeRequest:
+ def __init__(self, val):
+ self.GET = {'pattern': val}
+ self.create_published_nodetype()
+ feed = SearchNodetypes()
+ self.assertRaises(ObjectDoesNotExist,
+ feed.get_object, FakeRequest('te'))
+ self.assertEquals(feed.get_object(FakeRequest('test')), 'test')
+ self.assertEquals(len(feed.items('test')), 1)
+ self.assertEquals(feed.link('test'), '/search/?pattern=test')
+ self.assertEquals(feed.title('test'),
+ _("Results of the search for '%s'") % 'test')
+ self.assertEquals(
+ feed.description('test'),
+ _("The nodetypes containing the pattern '%s'") % 'test')
+
+ def test_nodetype_discussions(self):
+ nodetype = self.create_published_nodetype()
+ comments = self.create_discussions(nodetype)
+ feed = NodetypeDiscussions()
+ self.assertEquals(feed.get_object(
+ 'request', 2010, 1, 1, nodetype.slug), nodetype)
+ self.assertEquals(feed.link(nodetype), '/2010/01/01/my-test-nodetype/')
+ self.assertEquals(len(feed.items(nodetype)), 3)
+ self.assertEquals(feed.item_pubdate(comments[0]),
+ comments[0].submit_date)
+ self.assertEquals(feed.item_link(comments[0]),
+ '/comments/cr/%i/1/#c1' % self.nodetype_ct_id)
+ self.assertEquals(feed.item_author_name(comments[0]), 'admin')
+ self.assertEquals(feed.item_author_email(comments[0]),
+ 'admin@example.com')
+ self.assertEquals(feed.item_author_link(comments[0]), '')
+ self.assertEquals(feed.title(nodetype),
+ _('Discussions on %s') % nodetype.title)
+ self.assertEquals(
+ feed.description(nodetype),
+ _('The latest discussions for the nodetype %s') % nodetype.title)
+
+ def test_nodetype_comments(self):
+ nodetype = self.create_published_nodetype()
+ comments = self.create_discussions(nodetype)
+ feed = NodetypeComments()
+ self.assertEquals(list(feed.items(nodetype)), [comments[0]])
+ self.assertEquals(feed.item_link(comments[0]),
+ '/comments/cr/%i/1/#comment_1' % self.nodetype_ct_id)
+ self.assertEquals(feed.title(nodetype),
+ _('Comments on %s') % nodetype.title)
+ self.assertEquals(
+ feed.description(nodetype),
+ _('The latest comments for the nodetype %s') % nodetype.title)
+ self.assertEquals(
+ feed.item_enclosure_url(comments[0]),
+ 'http://www.gravatar.com/avatar/e64c7d89f26b'
+ 'd1972efa854d13d7dd61.jpg?s=80&amp;r=g')
+ self.assertEquals(feed.item_enclosure_length(nodetype), '100000')
+ self.assertEquals(feed.item_enclosure_mime_type(nodetype), 'image/jpeg')
+
+ def test_nodetype_pingbacks(self):
+ nodetype = self.create_published_nodetype()
+ comments = self.create_discussions(nodetype)
+ feed = NodetypePingbacks()
+ self.assertEquals(list(feed.items(nodetype)), [comments[1]])
+ self.assertEquals(feed.item_link(comments[1]),
+ '/comments/cr/%i/1/#pingback_2' % self.nodetype_ct_id)
+ self.assertEquals(feed.title(nodetype),
+ _('Pingbacks on %s') % nodetype.title)
+ self.assertEquals(
+ feed.description(nodetype),
+ _('The latest pingbacks for the nodetype %s') % nodetype.title)
+
+ def test_nodetype_trackbacks(self):
+ nodetype = self.create_published_nodetype()
+ comments = self.create_discussions(nodetype)
+ feed = NodetypeTrackbacks()
+ self.assertEquals(list(feed.items(nodetype)), [comments[2]])
+ self.assertEquals(feed.item_link(comments[2]),
+ '/comments/cr/%i/1/#trackback_3' % self.nodetype_ct_id)
+ self.assertEquals(feed.title(nodetype),
+ _('Trackbacks on %s') % nodetype.title)
+ self.assertEquals(
+ feed.description(nodetype),
+ _('The latest trackbacks for the nodetype %s') % nodetype.title)
+
+ def test_nodetype_feed_no_authors(self):
+ original_feeds_format = feeds.FEEDS_FORMAT
+ feeds.FEEDS_FORMAT = ''
+ nodetype = self.create_published_nodetype()
+ nodetype.authors.clear()
+ feed = NodetypeFeed()
+ self.assertEquals(feed.item_author_name(nodetype), None)
+ feeds.FEEDS_FORMAT = original_feeds_format
+
+ def test_nodetype_feed_rss_or_atom(self):
+ original_feeds_format = feeds.FEEDS_FORMAT
+ feeds.FEEDS_FORMAT = ''
+ feed = LatestNodetypes()
+ self.assertEquals(feed.feed_type, DefaultFeed)
+ feeds.FEEDS_FORMAT = 'atom'
+ feed = LatestNodetypes()
+ self.assertEquals(feed.feed_type, Atom1Feed)
+ self.assertEquals(feed.subtitle, feed.description)
+ feeds.FEEDS_FORMAT = original_feeds_format
+
+ def test_discussion_feed_with_same_slugs(self):
+ """
+ https://github.com/gnowgi/django-gstudio/issues/104
+
+ OK, Here I will reproduce the original case: getting a discussion
+ type feed, with a same slug.
+
+ The correction of this case, will need some changes in the
+ get_object method.
+ """
+ nodetype = self.create_published_nodetype()
+
+ feed = NodetypeDiscussions()
+ self.assertEquals(feed.get_object(
+ 'request', 2010, 1, 1, nodetype.slug), nodetype)
+
+ params = {'title': 'My test nodetype, part II',
+ 'content': 'My content ',
+ 'slug': 'my-test-nodetype',
+ 'tags': 'tests',
+ 'creation_date': datetime(2010, 2, 1),
+ 'status': PUBLISHED}
+ nodetype_same_slug = Nodetype.objects.create(**params)
+ nodetype_same_slug.sites.add(self.site)
+ nodetype_same_slug.authors.add(self.author)
+
+ self.assertEquals(feed.get_object(
+ 'request', 2010, 2, 1, nodetype_same_slug.slug), nodetype_same_slug)
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/managers.py b/build/lib.linux-i686-2.6/gstudio/tests/managers.py
new file mode 100644
index 0000000..dd57933
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/managers.py
@@ -0,0 +1,313 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Gstudio's managers"""
+from datetime import datetime
+
+from django.test import TestCase
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+
+from tagging.models import Tag
+
+from gstudio.models import Nodetype
+from gstudio.models import Author
+from gstudio.models import Metatype
+from gstudio.managers import PUBLISHED
+from gstudio.managers import tags_published
+from gstudio.managers import nodetypes_published
+
+
+class ManagersTestCase(TestCase):
+
+ def setUp(self):
+ self.sites = [
+ Site.objects.get_current(),
+ Site.objects.create(domain='http://domain.com',
+ name='Domain.com')]
+ self.authors = [
+ User.objects.create_user(username='webmaster',
+ email='webmaster@example.com'),
+ User.objects.create_user(username='contributor',
+ email='contributor@example.com')]
+ self.metatypes = [
+ Metatype.objects.create(title='Metatype 1',
+ slug='metatype-1'),
+ Metatype.objects.create(title='Metatype 2',
+ slug='metatype-2')]
+
+ params = {'title': 'My nodetype 1', 'content': 'My content 1',
+ 'tags': 'gstudio, test', 'slug': 'my-nodetype-1',
+ 'status': PUBLISHED}
+ self.nodetype_1 = Nodetype.objects.create(**params)
+ self.nodetype_1.authors.add(self.authors[0])
+ self.nodetype_1.metatypes.add(*self.metatypes)
+ self.nodetype_1.sites.add(*self.sites)
+
+ params = {'title': 'My nodetype 2', 'content': 'My content 2',
+ 'tags': 'gstudio, test', 'slug': 'my-nodetype-2'}
+ self.nodetype_2 = Nodetype.objects.create(**params)
+ self.nodetype_2.authors.add(*self.authors)
+ self.nodetype_2.metatypes.add(self.metatypes[0])
+ self.nodetype_2.sites.add(self.sites[0])
+
+ def test_tags_published(self):
+ self.assertEquals(tags_published().count(), Tag.objects.count())
+ Tag.objects.create(name='out')
+ self.assertNotEquals(tags_published().count(), Tag.objects.count())
+
+ def test_author_published_manager_get_query_set(self):
+ self.assertEquals(Author.published.count(), 1)
+ self.nodetype_2.status = PUBLISHED
+ self.nodetype_2.save()
+ self.assertEquals(Author.published.count(), 2)
+ self.nodetype_2.sites.remove(self.sites[0])
+ self.nodetype_2.sites.add(self.sites[1])
+ self.assertEquals(Author.published.count(), 1)
+
+ def test_nodetypes_published(self):
+ self.assertEquals(nodetypes_published(Nodetype.objects.all()).count(), 1)
+ self.nodetype_2.status = PUBLISHED
+ self.nodetype_2.save()
+ self.assertEquals(nodetypes_published(Nodetype.objects.all()).count(), 2)
+ self.nodetype_1.sites.clear()
+ self.assertEquals(nodetypes_published(Nodetype.objects.all()).count(), 1)
+ self.nodetype_1.sites.add(*self.sites)
+ self.nodetype_1.start_publication = datetime(2020, 1, 1)
+ self.nodetype_1.save()
+ self.assertEquals(nodetypes_published(Nodetype.objects.all()).count(), 1)
+ self.nodetype_1.start_publication = datetime(2000, 1, 1)
+ self.nodetype_1.save()
+ self.assertEquals(nodetypes_published(Nodetype.objects.all()).count(), 2)
+ self.nodetype_1.end_publication = datetime(2000, 1, 1)
+ self.nodetype_1.save()
+ self.assertEquals(nodetypes_published(Nodetype.objects.all()).count(), 1)
+ self.nodetype_1.end_publication = datetime(2020, 1, 1)
+ self.nodetype_1.save()
+ self.assertEquals(nodetypes_published(Nodetype.objects.all()).count(), 2)
+
+ def test_nodetype_published_manager_get_query_set(self):
+ self.assertEquals(Nodetype.published.count(), 1)
+ self.nodetype_2.status = PUBLISHED
+ self.nodetype_2.save()
+ self.assertEquals(Nodetype.published.count(), 2)
+ self.nodetype_1.sites.clear()
+ self.assertEquals(Nodetype.published.count(), 1)
+ self.nodetype_1.sites.add(*self.sites)
+ self.nodetype_1.start_publication = datetime(2020, 1, 1)
+ self.nodetype_1.save()
+ self.assertEquals(Nodetype.published.count(), 1)
+ self.nodetype_1.start_publication = datetime(2000, 1, 1)
+ self.nodetype_1.save()
+ self.assertEquals(Nodetype.published.count(), 2)
+ self.nodetype_1.end_publication = datetime(2000, 1, 1)
+ self.nodetype_1.save()
+ self.assertEquals(Nodetype.published.count(), 1)
+ self.nodetype_1.end_publication = datetime(2020, 1, 1)
+ self.nodetype_1.save()
+ self.assertEquals(Nodetype.published.count(), 2)
+
+ def test_nodetype_published_manager_on_site(self):
+ self.assertEquals(Nodetype.published.on_site().count(), 2)
+ self.nodetype_2.sites.clear()
+ self.nodetype_2.sites.add(self.sites[1])
+ self.assertEquals(Nodetype.published.on_site().count(), 1)
+ self.nodetype_1.sites.clear()
+ self.assertEquals(Nodetype.published.on_site().count(), 0)
+
+ def test_nodetype_published_manager_basic_search(self):
+ self.assertEquals(Nodetype.published.basic_search('My ').count(), 1)
+ self.nodetype_2.status = PUBLISHED
+ self.nodetype_2.save()
+ self.assertEquals(Nodetype.published.basic_search('My ').count(), 2)
+ self.assertEquals(Nodetype.published.basic_search('1').count(), 1)
+ self.assertEquals(Nodetype.published.basic_search('content 1').count(), 2)
+
+ def test_nodetype_published_manager_advanced_search(self):
+ metatype = Metatype.objects.create(
+ title='SimpleMetatype', slug='simple')
+ self.nodetype_2.metatypes.add(metatype)
+ self.nodetype_2.tags = self.nodetype_2.tags + ', custom'
+ self.nodetype_2.status = PUBLISHED
+ self.nodetype_2.save()
+ self.assertEquals(
+ Nodetype.published.advanced_search('content').count(), 2)
+ search = Nodetype.published.advanced_search('content 1')
+ self.assertEquals(search.count(), 1)
+ self.assertEquals(search.all()[0], self.nodetype_1)
+ self.assertEquals(
+ Nodetype.published.advanced_search('content 1 or 2').count(), 2)
+ self.assertEquals(
+ Nodetype.published.advanced_search('content 1 and 2').count(), 0)
+ self.assertEquals(
+ Nodetype.published.advanced_search('content 1 2').count(), 0)
+ self.assertEquals(
+ Nodetype.published.advanced_search('"My content" 1 or 2').count(), 2)
+ self.assertEquals(
+ Nodetype.published.advanced_search('-"My content" 2').count(), 0)
+ search = Nodetype.published.advanced_search('content -1')
+ self.assertEquals(search.count(), 1)
+ self.assertEquals(search.all()[0], self.nodetype_2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content metatype:SimpleMetatype').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content metatype:simple').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content metatype:"Metatype 1"').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content metatype:"metatype-1"').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content metatype:"metatype-2"').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content tag:gstudio').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content tag:custom').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content author:webmaster').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content author:contributor').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content author:webmaster tag:gstudio').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content author:webmaster tag:custom').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content 1 or 2 author:webmaster').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'content 1 or 2 author:webmaster').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ '(author:webmaster content) my').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ '(author:webmaster) or (author:contributor)').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ '(author:webmaster) (author:contributor)').count(), 0)
+ self.assertEquals(Nodetype.published.advanced_search(
+ '(author:webmaster content) 1').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ '(author:webmaster content) or 2').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ '(author:contributor content) or 1').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ '(author:contributor content) or 2').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ '(author:webmaster or ("hello world")) and 2').count(), 1)
+
+ # Complex queries
+ self.assertEquals(Nodetype.published.advanced_search(
+ '(author:admin and "content 1") or author:webmaster').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'author:admin and ("content 1" or author:webmaster)').count(), 0)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'author:admin and "content 1" or author:webmaster').count(), 0)
+ self.assertEquals(Nodetype.published.advanced_search(
+ '-(author:webmaster and "content 1")').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ '-(-author:webmaster and "content 1")').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'metatype:"metatype -1" or author:"web master"').count(), 0)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'metatype:"metatype-1" or author:"webmaster"').count(), 2)
+
+ # Wildcards
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'author:webm*').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'author:*bmas*').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'author:*master').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'author:*master metatype:*ory-2').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'author:*master or metatype:cate*').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'metatype:*ate*').count(), 2)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'author:"webmast*"').count(), 0)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'tag:"gstudio*"').count(), 0)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'tag:*inni*').count(), 2)
+
+ def test_nodetype_published_manager_advanced_search_with_punctuation(self):
+ self.nodetype_2.content = 'How are you today ? Fine thank you ! OK.'
+ self.nodetype_2.status = PUBLISHED
+ self.nodetype_2.save()
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'today ?').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ 'today or ! or .').count(), 1)
+ self.assertEquals(Nodetype.published.advanced_search(
+ '"you today ?"').count(), 1)
+
+ def test_nodetype_published_manager_search(self):
+ self.nodetype_2.content = self.nodetype_2.content + ' * '
+ self.nodetype_2.status = PUBLISHED
+ self.nodetype_2.save()
+ # Be sure that basic_search does not return
+ # the same results of advanced_search
+ self.assertNotEquals(
+ Nodetype.published.basic_search('content 1').count(),
+ Nodetype.published.advanced_search('content 1').count())
+ # Now check the fallback with the '*' pattern
+ # which will fails advanced search
+ self.assertEquals(Nodetype.published.search('*').count(), 1)
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/metatype.py b/build/lib.linux-i686-2.6/gstudio/tests/metatype.py
new file mode 100644
index 0000000..b20a467
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/metatype.py
@@ -0,0 +1,116 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Gstudio's Metatype"""
+from django.test import TestCase
+from django.contrib.sites.models import Site
+
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+from gstudio.managers import PUBLISHED
+
+
+class MetatypeTestCase(TestCase):
+
+ def setUp(self):
+ self.site = Site.objects.get_current()
+ self.metatypes = [Metatype.objects.create(title='Metatype 1',
+ slug='metatype-1'),
+ Metatype.objects.create(title='Metatype 2',
+ slug='metatype-2')]
+ params = {'title': 'My nodetype',
+ 'content': 'My content',
+ 'tags': 'gstudio, test',
+ 'slug': 'my-nodetype'}
+
+ self.nodetype = Nodetype.objects.create(**params)
+ self.nodetype.metatypes.add(*self.metatypes)
+ self.nodetype.sites.add(self.site)
+
+ def test_nodetypes_published(self):
+ metatype = self.metatypes[0]
+ self.assertEqual(metatype.nodetypes_published().count(), 0)
+ self.nodetype.status = PUBLISHED
+ self.nodetype.save()
+ self.assertEqual(metatype.nodetypes_published().count(), 1)
+
+ params = {'title': 'My second nodetype',
+ 'content': 'My second content',
+ 'tags': 'gstudio, test',
+ 'status': PUBLISHED,
+ 'slug': 'my-second-nodetype'}
+
+ new_nodetype = Nodetype.objects.create(**params)
+ new_nodetype.sites.add(self.site)
+ new_nodetype.metatypes.add(self.metatypes[0])
+
+ self.assertEqual(self.metatypes[0].nodetypes_published().count(), 2)
+ self.assertEqual(self.metatypes[1].nodetypes_published().count(), 1)
+
+ def test_nodetypes_tree_path(self):
+ self.assertEqual(self.metatypes[0].tree_path, 'metatype-1')
+ self.assertEqual(self.metatypes[1].tree_path, 'metatype-2')
+ self.metatypes[1].parent = self.metatypes[0]
+ self.metatypes[1].save()
+ self.assertEqual(self.metatypes[1].tree_path, 'metatype-1/metatype-2')
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/metaweblog.py b/build/lib.linux-i686-2.6/gstudio/tests/metaweblog.py
new file mode 100644
index 0000000..f90ddec
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/metaweblog.py
@@ -0,0 +1,360 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+s# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Gstudio's MetaWeblog API"""
+from xmlrpclib import Binary
+from xmlrpclib import Fault
+from xmlrpclib import ServerProxy
+from datetime import datetime
+from tempfile import TemporaryFile
+
+from django.test import TestCase
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.core.files.storage import default_storage
+
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+from gstudio.managers import DRAFT
+from gstudio.managers import PUBLISHED
+from gstudio.settings import UPLOAD_TO
+from gstudio.xmlrpc.metaweblog import authenticate
+from gstudio.xmlrpc.metaweblog import post_structure
+from gstudio.tests.utils import TestTransport
+
+
+class MetaWeblogTestCase(TestCase):
+ """Test cases for MetaWeblog"""
+ urls = 'gstudio.tests.urls'
+
+ def setUp(self):
+ # Create data
+ self.webmaster = User.objects.create_superuser(
+ username='webmaster',
+ email='webmaster@example.com',
+ password='password')
+ self.contributor = User.objects.create_user(
+ username='contributor',
+ email='contributor@example.com',
+ password='password')
+ self.site = Site.objects.get_current()
+ self.metatypes = [
+ Metatype.objects.create(title='Metatype 1',
+ slug='metatype-1'),
+ Metatype.objects.create(title='Metatype 2',
+ slug='metatype-2')]
+ params = {'title': 'My nodetype 1', 'content': 'My content 1',
+ 'tags': 'gstudio, test', 'slug': 'my-nodetype-1',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ self.nodetype_1 = Nodetype.objects.create(**params)
+ self.nodetype_1.authors.add(self.webmaster)
+ self.nodetype_1.metatypes.add(*self.metatypes)
+ self.nodetype_1.sites.add(self.site)
+
+ params = {'title': 'My nodetype 2', 'content': 'My content 2',
+ 'creation_date': datetime(2010, 3, 15),
+ 'tags': 'gstudio, test', 'slug': 'my-nodetype-2'}
+ self.nodetype_2 = Nodetype.objects.create(**params)
+ self.nodetype_2.authors.add(self.webmaster)
+ self.nodetype_2.metatypes.add(self.metatypes[0])
+ self.nodetype_2.sites.add(self.site)
+ # Instanciating the server proxy
+ self.server = ServerProxy('http://localhost:8000/xmlrpc/',
+ transport=TestTransport())
+
+ def test_authenticate(self):
+ self.assertRaises(Fault, authenticate, 'badcontributor', 'badpassword')
+ self.assertRaises(Fault, authenticate, 'contributor', 'badpassword')
+ self.assertRaises(Fault, authenticate, 'contributor', 'password')
+ self.contributor.is_staff = True
+ self.contributor.save()
+ self.assertEquals(authenticate('contributor', 'password'),
+ self.contributor)
+ self.assertRaises(Fault, authenticate, 'contributor',
+ 'password', 'gstudio.change_nodetype')
+ self.assertEquals(authenticate('webmaster', 'password'),
+ self.webmaster)
+ self.assertEquals(authenticate('webmaster', 'password',
+ 'gstudio.change_nodetype'),
+ self.webmaster)
+
+ def test_get_users_blogs(self):
+ self.assertRaises(Fault, self.server.blogger.getUsersBlogs,
+ 'apikey', 'contributor', 'password')
+ self.assertEquals(self.server.blogger.getUsersBlogs(
+ 'apikey', 'webmaster', 'password'),
+ [{'url': 'http://example.com/',
+ 'blogid': 1,
+ 'blogName': 'example.com'}])
+
+ def test_get_user_info(self):
+ self.assertRaises(Fault, self.server.blogger.getUserInfo,
+ 'apikey', 'contributor', 'password')
+ self.webmaster.first_name = 'John'
+ self.webmaster.last_name = 'Doe'
+ self.webmaster.save()
+ self.assertEquals(self.server.blogger.getUserInfo(
+ 'apikey', 'webmaster', 'password'),
+ {'firstname': 'John', 'lastname': 'Doe',
+ 'url': 'http://example.com/authors/webmaster/',
+ 'userid': self.webmaster.pk,
+ 'nickname': 'webmaster',
+ 'email': 'webmaster@example.com'})
+
+ def test_get_authors(self):
+ self.assertRaises(Fault, self.server.wp.getAuthors,
+ 'apikey', 'contributor', 'password')
+ self.assertEquals(self.server.wp.getAuthors(
+ 'apikey', 'webmaster', 'password'), [
+ {'user_login': 'webmaster',
+ 'user_id': self.webmaster.pk,
+ 'user_email': 'webmaster@example.com',
+ 'display_name': 'webmaster'}])
+
+ def test_get_metatypes(self):
+ self.assertRaises(Fault, self.server.metaWeblog.getMetatypes,
+ 1, 'contributor', 'password')
+ self.assertEquals(
+ self.server.metaWeblog.getMetatypes('apikey',
+ 'webmaster', 'password'),
+ [{'rssUrl': 'http://example.com/feeds/metatypes/metatype-1/',
+ 'description': 'Metatype 1',
+ 'htmlUrl': 'http://example.com/metatypes/metatype-1/',
+ 'metatypeId': 1, 'parentId': 0,
+ 'metatypeName': 'Metatype 1',
+ 'metatypeDescription': ''},
+ {'rssUrl': 'http://example.com/feeds/metatypes/metatype-2/',
+ 'description': 'Metatype 2',
+ 'htmlUrl': 'http://example.com/metatypes/metatype-2/',
+ 'metatypeId': 2, 'parentId': 0,
+ 'metatypeName': 'Metatype 2',
+ 'metatypeDescription': ''}])
+ self.metatypes[1].parent = self.metatypes[0]
+ self.metatypes[1].description = 'metatype 2 description'
+ self.metatypes[1].save()
+ self.assertEquals(
+ self.server.metaWeblog.getMetatypes('apikey',
+ 'webmaster', 'password'),
+ [{'rssUrl': 'http://example.com/feeds/metatypes/metatype-1/',
+ 'description': 'Metatype 1',
+ 'htmlUrl': 'http://example.com/metatypes/metatype-1/',
+ 'metatypeId': 1, 'parentId': 0,
+ 'metatypeName': 'Metatype 1',
+ 'metatypeDescription': ''},
+ {'rssUrl':
+ 'http://example.com/feeds/metatypes/metatype-1/metatype-2/',
+ 'description': 'Metatype 2',
+ 'htmlUrl':
+ 'http://example.com/metatypes/metatype-1/metatype-2/',
+ 'metatypeId': 2, 'parentId': 1,
+ 'metatypeName': 'Metatype 2',
+ 'metatypeDescription': 'metatype 2 description'}])
+
+ def test_new_metatype(self):
+ metatype_struct = {'name': 'Metatype 3', 'slug': 'metatype-3',
+ 'description': 'Metatype 3 description',
+ 'parent_id': self.metatypes[0].pk}
+ self.assertRaises(Fault, self.server.wp.newMetatype,
+ 1, 'contributor', 'password', metatype_struct)
+ self.assertEquals(Metatype.objects.count(), 2)
+ new_metatype_id = self.server.wp.newMetatype(
+ 1, 'webmaster', 'password', metatype_struct)
+ self.assertEquals(Metatype.objects.count(), 3)
+ metatype = Metatype.objects.get(pk=new_metatype_id)
+ self.assertEquals(metatype.title, 'Metatype 3')
+ self.assertEquals(metatype.description, 'Metatype 3 description')
+ self.assertEquals(metatype.slug, 'metatype-3')
+ self.assertEquals(metatype.parent.pk, 1)
+
+ def test_get_recent_posts(self):
+ self.assertRaises(Fault, self.server.metaWeblog.getRecentPosts,
+ 1, 'contributor', 'password', 10)
+ self.assertEquals(len(self.server.metaWeblog.getRecentPosts(
+ 1, 'webmaster', 'password', 10)), 2)
+
+ def test_delete_post(self):
+ self.assertRaises(Fault, self.server.blogger.deletePost,
+ 'apikey', 1, 'contributor', 'password', 'publish')
+ self.assertEquals(Nodetype.objects.count(), 2)
+ self.assertTrue(
+ self.server.blogger.deletePost(
+ 'apikey', self.nodetype_1.pk, 'webmaster', 'password', 'publish'))
+ self.assertEquals(Nodetype.objects.count(), 1)
+
+ def test_get_post(self):
+ self.assertRaises(Fault, self.server.metaWeblog.getPost,
+ 1, 'contributor', 'password')
+ post = self.server.metaWeblog.getPost(
+ self.nodetype_1.pk, 'webmaster', 'password')
+ self.assertEquals(post['title'], self.nodetype_1.title)
+ self.assertEquals(post['description'], '<p>My content 1</p>')
+ self.assertEquals(post['metatypes'], ['Metatype 1', 'Metatype 2'])
+ self.assertEquals(post['dateCreated'].value, '2010-01-01T00:00:00')
+ self.assertEquals(post['link'],
+ 'http://example.com/2010/01/01/my-nodetype-1/')
+ self.assertEquals(post['permaLink'],
+ 'http://example.com/2010/01/01/my-nodetype-1/')
+ self.assertEquals(post['postid'], self.nodetype_1.pk)
+ self.assertEquals(post['userid'], 'webmaster')
+ self.assertEquals(post['mt_excerpt'], '')
+ self.assertEquals(post['mt_allow_comments'], 1)
+ self.assertEquals(post['mt_allow_pings'], 1)
+ self.assertEquals(post['mt_keywords'], self.nodetype_1.tags)
+ self.assertEquals(post['wp_author'], 'webmaster')
+ self.assertEquals(post['wp_author_id'], self.webmaster.pk)
+ self.assertEquals(post['wp_author_display_name'], 'webmaster')
+ self.assertEquals(post['wp_password'], '')
+ self.assertEquals(post['wp_slug'], self.nodetype_1.slug)
+
+ def test_new_post(self):
+ post = post_structure(self.nodetype_2, self.site)
+ self.assertRaises(Fault, self.server.metaWeblog.newPost,
+ 1, 'contributor', 'password', post, 1)
+ self.assertEquals(Nodetype.objects.count(), 2)
+ self.assertEquals(Nodetype.published.count(), 1)
+ self.server.metaWeblog.newPost(
+ 1, 'webmaster', 'password', post, 1)
+ self.assertEquals(Nodetype.objects.count(), 3)
+ self.assertEquals(Nodetype.published.count(), 2)
+ del post['dateCreated']
+ post['wp_author_id'] = self.contributor.pk
+ self.server.metaWeblog.newPost(
+ 1, 'webmaster', 'password', post, 0)
+ self.assertEquals(Nodetype.objects.count(), 4)
+ self.assertEquals(Nodetype.published.count(), 2)
+
+ def test_edit_post(self):
+ post = post_structure(self.nodetype_2, self.site)
+ self.assertRaises(Fault, self.server.metaWeblog.editPost,
+ 1, 'contributor', 'password', post, 1)
+ new_post_id = self.server.metaWeblog.newPost(
+ 1, 'webmaster', 'password', post, 0)
+
+ nodetype = Nodetype.objects.get(pk=new_post_id)
+ self.assertEquals(nodetype.title, self.nodetype_2.title)
+ self.assertEquals(nodetype.content, self.nodetype_2.html_content)
+ self.assertEquals(nodetype.excerpt, self.nodetype_2.excerpt)
+ self.assertEquals(nodetype.slug, self.nodetype_2.slug)
+ self.assertEquals(nodetype.status, DRAFT)
+ self.assertEquals(nodetype.password, self.nodetype_2.password)
+ self.assertEquals(nodetype.comment_enabled, True)
+ self.assertEquals(nodetype.pingback_enabled, True)
+ self.assertEquals(nodetype.metatypes.count(), 1)
+ self.assertEquals(nodetype.authors.count(), 1)
+ self.assertEquals(nodetype.authors.all()[0], self.webmaster)
+ self.assertEquals(nodetype.creation_date, self.nodetype_2.creation_date)
+
+ nodetype.title = 'Title edited'
+ nodetype.creation_date = datetime(2000, 1, 1)
+ post = post_structure(nodetype, self.site)
+ post['metatypes'] = ''
+ post['description'] = 'Content edited'
+ post['mt_excerpt'] = 'Content edited'
+ post['wp_slug'] = 'slug-edited'
+ post['wp_password'] = 'password'
+ post['mt_allow_comments'] = 2
+ post['mt_allow_pings'] = 0
+
+ response = self.server.metaWeblog.editPost(
+ new_post_id, 'webmaster', 'password', post, 1)
+ self.assertEquals(response, True)
+ nodetype = Nodetype.objects.get(pk=new_post_id)
+ self.assertEquals(nodetype.title, post['title'])
+ self.assertEquals(nodetype.content, post['description'])
+ self.assertEquals(nodetype.excerpt, post['mt_excerpt'])
+ self.assertEquals(nodetype.slug, 'slug-edited')
+ self.assertEquals(nodetype.status, PUBLISHED)
+ self.assertEquals(nodetype.password, 'password')
+ self.assertEquals(nodetype.comment_enabled, False)
+ self.assertEquals(nodetype.pingback_enabled, False)
+ self.assertEquals(nodetype.metatypes.count(), 0)
+ self.assertEquals(nodetype.creation_date, datetime(2000, 1, 1))
+
+ del post['dateCreated']
+ post['wp_author_id'] = self.contributor.pk
+
+ response = self.server.metaWeblog.editPost(
+ new_post_id, 'webmaster', 'password', post, 1)
+ nodetype = Nodetype.objects.get(pk=new_post_id)
+ self.assertEquals(nodetype.authors.count(), 1)
+ self.assertEquals(nodetype.authors.all()[0], self.contributor)
+ self.assertEquals(nodetype.creation_date, datetime(2000, 1, 1))
+
+ def test_new_media_object(self):
+ file_ = TemporaryFile()
+ file_.write('My test content')
+ file_.seek(0)
+ media = {'name': 'gstudio_test_file.txt',
+ 'type': 'text/plain',
+ 'bits': Binary(file_.read())}
+ file_.close()
+
+ self.assertRaises(Fault, self.server.metaWeblog.newMediaObject,
+ 1, 'contributor', 'password', media)
+ new_media = self.server.metaWeblog.newMediaObject(
+ 1, 'webmaster', 'password', media)
+ self.assertTrue('/gstudio_test_file' in new_media['url'])
+ default_storage.delete('/'.join([
+ UPLOAD_TO, new_media['url'].split('/')[-1]]))
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/moderator.py b/build/lib.linux-i686-2.6/gstudio/tests/moderator.py
new file mode 100644
index 0000000..58332b1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/moderator.py
@@ -0,0 +1,169 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Gstudio's moderator"""
+from django.core import mail
+from django.test import TestCase
+from django.contrib import comments
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.contrib.contenttypes.models import ContentType
+
+from gstudio.models import Nodetype
+from gstudio.managers import PUBLISHED
+from gstudio.moderator import NodetypeCommentModerator
+
+
+class NodetypeCommentModeratorTestCase(TestCase):
+ """Test cases for the moderator"""
+
+ def setUp(self):
+ self.site = Site.objects.get_current()
+ self.author = User.objects.create(username='admin',
+ email='admin@example.com')
+ self.nodetype_ct_id = ContentType.objects.get_for_model(Nodetype).pk
+
+ params = {'title': 'My test nodetype',
+ 'content': 'My test nodetype',
+ 'slug': 'my-test-nodetype',
+ 'status': PUBLISHED}
+ self.nodetype = Nodetype.objects.create(**params)
+ self.nodetype.sites.add(self.site)
+ self.nodetype.authors.add(self.author)
+
+ def test_email(self):
+ comment = comments.get_model().objects.create(
+ comment='My Comment', user=self.author, is_public=True,
+ content_object=self.nodetype, site=self.site)
+ self.assertEquals(len(mail.outbox), 0)
+ moderator = NodetypeCommentModerator(Nodetype)
+ moderator.email_reply = False
+ moderator.email_authors = False
+ moderator.mail_comment_notification_recipients = []
+ moderator.email(comment, self.nodetype, 'request')
+ self.assertEquals(len(mail.outbox), 0)
+ moderator.email_reply = True
+ moderator.email_authors = True
+ moderator.mail_comment_notification_recipients = ['admin@example.com']
+ moderator.email(comment, self.nodetype, 'request')
+ self.assertEquals(len(mail.outbox), 1)
+
+ def test_do_email_notification(self):
+ comment = comments.get_model().objects.create(
+ comment='My Comment', user=self.author, is_public=True,
+ content_object=self.nodetype, site=self.site)
+ self.assertEquals(len(mail.outbox), 0)
+ moderator = NodetypeCommentModerator(Nodetype)
+ moderator.mail_comment_notification_recipients = ['admin@example.com']
+ moderator.do_email_notification(comment, self.nodetype, 'request')
+ self.assertEquals(len(mail.outbox), 1)
+
+ def test_do_email_authors(self):
+ comment = comments.get_model().objects.create(
+ comment='My Comment', user=self.author, is_public=True,
+ content_object=self.nodetype, site=self.site)
+ self.assertEquals(len(mail.outbox), 0)
+ moderator = NodetypeCommentModerator(Nodetype)
+ moderator.email_authors = True
+ moderator.mail_comment_notification_recipients = ['admin@example.com']
+ moderator.do_email_authors(comment, self.nodetype, 'request')
+ self.assertEquals(len(mail.outbox), 0)
+ moderator.mail_comment_notification_recipients = []
+ moderator.do_email_authors(comment, self.nodetype, 'request')
+ self.assertEquals(len(mail.outbox), 1)
+
+ def test_do_email_reply(self):
+ comment = comments.get_model().objects.create(
+ comment='My Comment 1', user=self.author, is_public=True,
+ content_object=self.nodetype, site=self.site)
+ moderator = NodetypeCommentModerator(Nodetype)
+ moderator.email_notification_reply = True
+ moderator.mail_comment_notification_recipients = ['admin@example.com']
+ moderator.do_email_reply(comment, self.nodetype, 'request')
+ self.assertEquals(len(mail.outbox), 0)
+
+ comment = comments.get_model().objects.create(
+ comment='My Comment 2', user_email='user_1@example.com',
+ content_object=self.nodetype, is_public=True, site=self.site)
+ moderator.do_email_reply(comment, self.nodetype, 'request')
+ self.assertEquals(len(mail.outbox), 0)
+
+ comment = comments.get_model().objects.create(
+ comment='My Comment 3', user_email='user_2@example.com',
+ content_object=self.nodetype, is_public=True, site=self.site)
+ moderator.do_email_reply(comment, self.nodetype, 'request')
+ self.assertEquals(len(mail.outbox), 1)
+ self.assertEquals(mail.outbox[0].bcc, [u'user_1@example.com'])
+
+ comment = comments.get_model().objects.create(
+ comment='My Comment 4', user=self.author, is_public=True,
+ content_object=self.nodetype, site=self.site)
+ moderator.do_email_reply(comment, self.nodetype, 'request')
+ self.assertEquals(len(mail.outbox), 2)
+ self.assertEquals(mail.outbox[1].bcc, [u'user_1@example.com',
+ u'user_2@example.com'])
+
+ def test_moderate(self):
+ comment = comments.get_model().objects.create(
+ comment='My Comment', user=self.author, is_public=True,
+ content_object=self.nodetype, site=self.site)
+ moderator = NodetypeCommentModerator(Nodetype)
+ moderator.auto_moderate_comments = True
+ moderator.spam_checker_backends = ()
+ self.assertEquals(moderator.moderate(comment, self.nodetype, 'request'),
+ True)
+ moderator.auto_moderate_comments = False
+ self.assertEquals(moderator.moderate(comment, self.nodetype, 'request'),
+ False)
+ self.assertEquals(comments.get_model().objects.filter(
+ flags__flag='spam').count(), 0)
+ moderator.spam_checker_backends = (
+ 'gstudio.spam_checker.backends.all_is_spam',)
+ self.assertEquals(moderator.moderate(comment, self.nodetype, 'request'),
+ True)
+ self.assertEquals(comments.get_model().objects.filter(
+ flags__flag='spam').count(), 1)
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/nodetype.py b/build/lib.linux-i686-2.6/gstudio/tests/nodetype.py
new file mode 100644
index 0000000..2d09336
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/nodetype.py
@@ -0,0 +1,348 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Gstudio's Nodetype"""
+from __future__ import with_statement
+import warnings
+from datetime import datetime
+from datetime import timedelta
+
+from django.test import TestCase
+from django.conf import settings
+from django.contrib import comments
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+from django.contrib.comments.models import CommentFlag
+
+from gstudio import models
+from gstudio.models import Nodetype
+from gstudio.managers import PUBLISHED
+from gstudio.models import get_base_model
+from gstudio.models import Nodetype
+from gstudio import models as models_settings
+from gstudio import url_shortener as shortener_settings
+
+
+class NodetypeTestCase(TestCase):
+
+ def setUp(self):
+ params = {'title': 'My nodetype',
+ 'content': 'My content',
+ 'slug': 'my-nodetype'}
+ self.nodetype = Nodetype.objects.create(**params)
+
+ def test_discussions(self):
+ site = Site.objects.get_current()
+ self.assertEquals(self.nodetype.discussions.count(), 0)
+ self.assertEquals(self.nodetype.comments.count(), 0)
+ self.assertEquals(self.nodetype.pingbacks.count(), 0)
+ self.assertEquals(self.nodetype.trackbacks.count(), 0)
+
+ comments.get_model().objects.create(comment='My Comment 1',
+ content_object=self.nodetype,
+ site=site)
+ self.assertEquals(self.nodetype.discussions.count(), 1)
+ self.assertEquals(self.nodetype.comments.count(), 1)
+ self.assertEquals(self.nodetype.pingbacks.count(), 0)
+ self.assertEquals(self.nodetype.trackbacks.count(), 0)
+
+ comments.get_model().objects.create(comment='My Comment 2',
+ content_object=self.nodetype,
+ site=site, is_public=False)
+ self.assertEquals(self.nodetype.discussions.count(), 1)
+ self.assertEquals(self.nodetype.comments.count(), 1)
+ self.assertEquals(self.nodetype.pingbacks.count(), 0)
+ self.assertEquals(self.nodetype.trackbacks.count(), 0)
+
+ author = User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+
+ comment = comments.get_model().objects.create(
+ comment='My Comment 3',
+ content_object=self.nodetype,
+ site=Site.objects.create(domain='http://toto.com',
+ name='Toto.com'))
+ comment.flags.create(user=author, flag=CommentFlag.MODERATOR_APPROVAL)
+ self.assertEquals(self.nodetype.discussions.count(), 2)
+ self.assertEquals(self.nodetype.comments.count(), 2)
+ self.assertEquals(self.nodetype.pingbacks.count(), 0)
+ self.assertEquals(self.nodetype.trackbacks.count(), 0)
+
+ comment = comments.get_model().objects.create(
+ comment='My Pingback 1', content_object=self.nodetype, site=site)
+ comment.flags.create(user=author, flag='pingback')
+ self.assertEquals(self.nodetype.discussions.count(), 3)
+ self.assertEquals(self.nodetype.comments.count(), 2)
+ self.assertEquals(self.nodetype.pingbacks.count(), 1)
+ self.assertEquals(self.nodetype.trackbacks.count(), 0)
+
+ comment = comments.get_model().objects.create(
+ comment='My Trackback 1', content_object=self.nodetype, site=site)
+ comment.flags.create(user=author, flag='trackback')
+ self.assertEquals(self.nodetype.discussions.count(), 4)
+ self.assertEquals(self.nodetype.comments.count(), 2)
+ self.assertEquals(self.nodetype.pingbacks.count(), 1)
+ self.assertEquals(self.nodetype.trackbacks.count(), 1)
+
+ def test_str(self):
+ self.assertEquals(str(self.nodetype), 'My nodetype: draft')
+
+ def test_word_count(self):
+ self.assertEquals(self.nodetype.word_count, 2)
+
+ def test_comments_are_open(self):
+ original_auto_close = models.AUTO_CLOSE_COMMENTS_AFTER
+ models.AUTO_CLOSE_COMMENTS_AFTER = None
+ self.assertEquals(self.nodetype.comments_are_open, True)
+ models.AUTO_CLOSE_COMMENTS_AFTER = 5
+ self.nodetype.start_publication = datetime.now() - timedelta(days=7)
+ self.nodetype.save()
+ self.assertEquals(self.nodetype.comments_are_open, False)
+
+ models.AUTO_CLOSE_COMMENTS_AFTER = original_auto_close
+
+ def test_is_actual(self):
+ self.assertTrue(self.nodetype.is_actual)
+ self.nodetype.start_publication = datetime(2020, 3, 15)
+ self.assertFalse(self.nodetype.is_actual)
+ self.nodetype.start_publication = datetime.now()
+ self.assertTrue(self.nodetype.is_actual)
+ self.nodetype.end_publication = datetime(2000, 3, 15)
+ self.assertFalse(self.nodetype.is_actual)
+
+ def test_is_visible(self):
+ self.assertFalse(self.nodetype.is_visible)
+ self.nodetype.status = PUBLISHED
+ self.assertTrue(self.nodetype.is_visible)
+ self.nodetype.start_publication = datetime(2020, 3, 15)
+ self.assertFalse(self.nodetype.is_visible)
+
+ def test_short_url(self):
+ original_shortener = shortener_settings.URL_SHORTENER_BACKEND
+ shortener_settings.URL_SHORTENER_BACKEND = 'gstudio.url_shortener.'\
+ 'backends.default'
+ self.assertEquals(self.nodetype.short_url,
+ 'http://example.com' +
+ reverse('gstudio_nodetype_shortlink',
+ args=[self.nodetype.pk]))
+ shortener_settings.URL_SHORTENER_BACKEND = original_shortener
+
+ def test_previous_nodetype(self):
+ site = Site.objects.get_current()
+ self.assertFalse(self.nodetype.previous_nodetype)
+ params = {'title': 'My second nodetype',
+ 'content': 'My second content',
+ 'slug': 'my-second-nodetype',
+ 'creation_date': datetime(2000, 1, 1),
+ 'status': PUBLISHED}
+ self.second_nodetype = Nodetype.objects.create(**params)
+ self.second_nodetype.sites.add(site)
+ self.assertEquals(self.nodetype.previous_nodetype, self.second_nodetype)
+ params = {'title': 'My third nodetype',
+ 'content': 'My third content',
+ 'slug': 'my-third-nodetype',
+ 'creation_date': datetime(2001, 1, 1),
+ 'status': PUBLISHED}
+ self.third_nodetype = Nodetype.objects.create(**params)
+ self.third_nodetype.sites.add(site)
+ self.assertEquals(self.nodetype.previous_nodetype, self.third_nodetype)
+ self.assertEquals(self.third_nodetype.previous_nodetype, self.second_nodetype)
+
+ def test_next_nodetype(self):
+ site = Site.objects.get_current()
+ self.assertFalse(self.nodetype.next_nodetype)
+ params = {'title': 'My second nodetype',
+ 'content': 'My second content',
+ 'slug': 'my-second-nodetype',
+ 'creation_date': datetime(2100, 1, 1),
+ 'status': PUBLISHED}
+ self.second_nodetype = Nodetype.objects.create(**params)
+ self.second_nodetype.sites.add(site)
+ self.assertEquals(self.nodetype.next_nodetype, self.second_nodetype)
+ params = {'title': 'My third nodetype',
+ 'content': 'My third content',
+ 'slug': 'my-third-nodetype',
+ 'creation_date': datetime(2050, 1, 1),
+ 'status': PUBLISHED}
+ self.third_nodetype = Nodetype.objects.create(**params)
+ self.third_nodetype.sites.add(site)
+ self.assertEquals(self.nodetype.next_nodetype, self.third_nodetype)
+ self.assertEquals(self.third_nodetype.next_nodetype, self.second_nodetype)
+
+ def test_related_published(self):
+ site = Site.objects.get_current()
+ self.assertFalse(self.nodetype.related_published)
+ params = {'title': 'My second nodetype',
+ 'content': 'My second content',
+ 'slug': 'my-second-nodetype',
+ 'status': PUBLISHED}
+ self.second_nodetype = Nodetype.objects.create(**params)
+ self.second_nodetype.related.add(self.nodetype)
+ self.assertEquals(len(self.nodetype.related_published), 0)
+
+ self.second_nodetype.sites.add(site)
+ self.assertEquals(len(self.nodetype.related_published), 1)
+ self.assertEquals(len(self.second_nodetype.related_published), 0)
+
+ self.nodetype.status = PUBLISHED
+ self.nodetype.save()
+ self.nodetype.sites.add(site)
+ self.assertEquals(len(self.nodetype.related_published), 1)
+ self.assertEquals(len(self.second_nodetype.related_published), 1)
+
+
+class NodetypeHtmlContentTestCase(TestCase):
+
+ def setUp(self):
+ params = {'title': 'My nodetype',
+ 'content': 'My content',
+ 'slug': 'my-nodetype'}
+ self.nodetype = Nodetype(**params)
+ self.original_debug = settings.DEBUG
+ self.original_rendering = models_settings.MARKUP_LANGUAGE
+ settings.DEBUG = False
+
+ def tearDown(self):
+ settings.DEBUG = self.original_debug
+ models_settings.MARKUP_LANGUAGE = self.original_rendering
+
+ def test_html_content_default(self):
+ models_settings.MARKUP_LANGUAGE = None
+ self.assertEquals(self.nodetype.html_content, '<p>My content</p>')
+
+ self.nodetype.content = 'Hello world !\n' \
+ ' this is my content'
+ self.assertEquals(self.nodetype.html_content,
+ '<p>Hello world !<br /> this is my content</p>')
+
+ def test_html_content_textitle(self):
+ models_settings.MARKUP_LANGUAGE = 'textile'
+ self.nodetype.content = 'Hello world !\n\n' \
+ 'this is my content :\n\n' \
+ '* Item 1\n* Item 2'
+ html_content = self.nodetype.html_content
+ try:
+ self.assertEquals(html_content,
+ '\t<p>Hello world !</p>\n\n\t' \
+ '<p>this is my content :</p>\n\n\t' \
+ '<ul>\n\t\t<li>Item 1</li>\n\t\t' \
+ '<li>Item 2</li>\n\t</ul>')
+ except AssertionError:
+ self.assertEquals(html_content, self.nodetype.content)
+
+ def test_html_content_markdown(self):
+ models_settings.MARKUP_LANGUAGE = 'markdown'
+ self.nodetype.content = 'Hello world !\n\n' \
+ 'this is my content :\n\n' \
+ '* Item 1\n* Item 2'
+ html_content = self.nodetype.html_content
+ try:
+ self.assertEquals(html_content,
+ '<p>Hello world !</p>\n' \
+ '<p>this is my content :</p>'\
+ '\n<ul>\n<li>Item 1</li>\n' \
+ '<li>Item 2</li>\n</ul>')
+ except AssertionError:
+ self.assertEquals(html_content, self.nodetype.content)
+
+ def test_html_content_restructuredtext(self):
+ models_settings.MARKUP_LANGUAGE = 'restructuredtext'
+ self.nodetype.content = 'Hello world !\n\n' \
+ 'this is my content :\n\n' \
+ '* Item 1\n* Item 2'
+ html_content = self.nodetype.html_content
+ try:
+ self.assertEquals(html_content,
+ '<p>Hello world !</p>\n' \
+ '<p>this is my content :</p>'\
+ '\n<ul class="simple">\n<li>Item 1</li>\n' \
+ '<li>Item 2</li>\n</ul>\n')
+ except AssertionError:
+ self.assertEquals(html_content, self.nodetype.content)
+
+# this class can be removed since the base abstract class is no longer present.
+class NodetypeGetBaseModelTestCase(TestCase):
+
+ def setUp(self):
+ self.original_nodetype_base_model = models_settings.NODETYPE_BASE_MODEL
+
+ def tearDown(self):
+ models_settings.NODETYPE_BASE_MODEL = self.original_nodetype_base_model
+
+ def test_get_base_model(self):
+ models_settings.NODETYPE_BASE_MODEL = ''
+ self.assertEquals(get_base_model(), Nodetype)
+
+ models_settings.NODETYPE_BASE_MODEL = 'mymodule.myclass'
+ try:
+ with warnings.catch_warnings(record=True) as w:
+ self.assertEquals(get_base_model(), Nodetype)
+ self.assertTrue(issubclass(w[-1].metatype, RuntimeWarning))
+ except AttributeError:
+ # Fail under Python2.5, because of'warnings.catch_warnings'
+ pass
+
+ models_settings.NODETYPE_BASE_MODEL = 'gstudio.models.Nodetype'
+ self.assertEquals(get_base_model(), Nodetype)
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/ping.py b/build/lib.linux-i686-2.6/gstudio/tests/ping.py
new file mode 100644
index 0000000..85dd463
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/ping.py
@@ -0,0 +1,187 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Gstudio's ping"""
+import cStringIO
+from urllib2 import URLError
+from urllib import addinfourl
+from django.test import TestCase
+
+from gstudio.models import Nodetype
+from gstudio.ping import URLRessources
+from gstudio.ping import DirectoryPinger
+from gstudio.ping import ExternalUrlsPinger
+
+
+class DirectoryPingerTestCase(TestCase):
+ """Test cases for DirectoryPinger"""
+ def setUp(self):
+ params = {'title': 'My nodetype',
+ 'content': 'My content',
+ 'tags': 'gstudio, test',
+ 'slug': 'my-nodetype'}
+ self.nodetype = Nodetype.objects.create(**params)
+ self.pinger = DirectoryPinger('http://localhost', [self.nodetype],
+ start_now=False)
+
+ def test_ping_nodetype(self):
+ self.assertEquals(
+ self.pinger.ping_nodetype(self.nodetype),
+ {'message': 'http://localhost is an invalid directory.',
+ 'flerror': True})
+
+
+class ExternalUrlsPingerTestCase(TestCase):
+ """Test cases for ExternalUrlsPinger"""
+
+ def setUp(self):
+ params = {'title': 'My nodetype',
+ 'content': 'My content',
+ 'tags': 'gstudio, test',
+ 'slug': 'my-nodetype'}
+ self.nodetype = Nodetype.objects.create(**params)
+ self.pinger = ExternalUrlsPinger(self.nodetype, start_now=False)
+
+ def test_is_external_url(self):
+ r = URLRessources()
+ self.assertEquals(self.pinger.is_external_url(
+ 'http://example.com/', 'http://google.com/'), True)
+ self.assertEquals(self.pinger.is_external_url(
+ 'http://example.com/toto/', 'http://google.com/titi/'), True)
+ self.assertEquals(self.pinger.is_external_url(
+ 'http://example.com/blog/', 'http://example.com/page/'), False)
+ self.assertEquals(self.pinger.is_external_url(
+ '%s/blog/' % r.site_url, r.site_url), False)
+ self.assertEquals(self.pinger.is_external_url(
+ 'http://google.com/', r.site_url), True)
+ self.assertEquals(self.pinger.is_external_url(
+ '/blog/', r.site_url), False)
+
+ def test_find_external_urls(self):
+ r = URLRessources()
+ external_urls = self.pinger.find_external_urls(self.nodetype)
+ self.assertEquals(external_urls, [])
+ self.nodetype.content = """
+ <p>This is a <a href="http://fantomas.willbreak.it/">link</a>
+ to a site.</p>
+ <p>This is a <a href="%s/blog/">link</a> within my site.</p>
+ <p>This is a <a href="/blog/">relative link</a> within my site.</p>
+ """ % r.site_url
+ self.nodetype.save()
+ external_urls = self.pinger.find_external_urls(self.nodetype)
+ self.assertEquals(external_urls, ['http://fantomas.willbreak.it/'])
+
+ def test_find_pingback_href(self):
+ result = self.pinger.find_pingback_href('')
+ self.assertEquals(result, None)
+ result = self.pinger.find_pingback_href("""
+ <html><head><link rel="pingback" href="/xmlrpc/" /></head>
+ <body></body></html>
+ """)
+ self.assertEquals(result, '/xmlrpc/')
+ result = self.pinger.find_pingback_href("""
+ <html><head><LINK hrEF="/xmlrpc/" REL="PingBack" /></head>
+ <body></body></html>
+ """)
+ self.assertEquals(result, '/xmlrpc/')
+ result = self.pinger.find_pingback_href("""
+ <html><head><LINK REL="PingBack" /></head><body></body></html>
+ """)
+ self.assertEquals(result, None)
+
+ def fake_urlopen(self, url):
+ """Fake urlopen using test client"""
+ if 'example' in url:
+ response = cStringIO.StringIO('')
+ return addinfourl(response, {'X-Pingback': '/xmlrpc.php',
+ 'Content-Type': 'text/html'}, url)
+ elif 'localhost' in url:
+ response = cStringIO.StringIO(
+ '<link rel="pingback" href="/xmlrpc/">')
+ return addinfourl(response, {'Content-Type': 'text/xhtml'}, url)
+ elif 'google' in url:
+ response = cStringIO.StringIO('PNG CONTENT')
+ return addinfourl(response, {'content-type': 'image/png'}, url)
+ elif 'error' in url:
+ raise URLError('Invalid ressource')
+
+ def test_find_pingback_urls(self):
+ # Set up a stub around urlopen
+ import gstudio.ping
+ self.original_urlopen = gstudio.ping.urlopen
+ gstudio.ping.urlopen = self.fake_urlopen
+
+ urls = ['http://localhost/', 'http://example.com/', 'http://error',
+ 'http://www.google.co.uk/images/nav_logo72.png']
+ self.assertEquals(
+ self.pinger.find_pingback_urls(urls),
+ {'http://localhost/': 'http://localhost/xmlrpc/',
+ 'http://example.com/': 'http://example.com/xmlrpc.php'})
+ # Remove stub
+ gstudio.ping.urlopen = self.original_urlopen
+
+ def test_pingback_url(self):
+ self.assertEquals(self.pinger.pingback_url('http://localhost',
+ 'http://error.com'),
+ 'http://error.com cannot be pinged.')
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/pingback.py b/build/lib.linux-i686-2.6/gstudio/tests/pingback.py
new file mode 100644
index 0000000..4bc295c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/pingback.py
@@ -0,0 +1,253 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Gstudio's PingBack API"""
+import cStringIO
+from datetime import datetime
+from urlparse import urlsplit
+from urllib2 import HTTPError
+from xmlrpclib import ServerProxy
+
+from django.test import TestCase
+from django.contrib import comments
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.contrib.contenttypes.models import ContentType
+
+from BeautifulSoup import BeautifulSoup
+
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+from gstudio.managers import PUBLISHED
+from gstudio.tests.utils import TestTransport
+from gstudio.xmlrpc.pingback import generate_pingback_content
+from gstudio import url_shortener as shortener_settings
+
+
+class PingBackTestCase(TestCase):
+ """Test cases for pingbacks"""
+ urls = 'gstudio.tests.urls'
+
+ def fake_urlopen(self, url):
+ """Fake urlopen using client if domain
+ correspond to current_site else HTTPError"""
+ scheme, netloc, path, query, fragment = urlsplit(url)
+ if not netloc:
+ raise
+ if self.site.domain == netloc:
+ response = cStringIO.StringIO(self.client.get(url).content)
+ return response
+ raise HTTPError(url, 404, 'unavailable url', {}, None)
+
+ def setUp(self):
+ # Use default URL shortener backend, to avoid networks errors
+ self.original_shortener = shortener_settings.URL_SHORTENER_BACKEND
+ shortener_settings.URL_SHORTENER_BACKEND = 'gstudio.url_shortener.'\
+ 'backends.default'
+ # Set up a stub around urlopen
+ import gstudio.xmlrpc.pingback
+ self.original_urlopen = gstudio.xmlrpc.pingback.urlopen
+ gstudio.xmlrpc.pingback.urlopen = self.fake_urlopen
+ # Preparing site
+ self.site = Site.objects.get_current()
+ self.site.domain = 'localhost:8000'
+ self.site.save()
+ # Creating tests nodetypes
+ self.author = User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+ self.metatype = Metatype.objects.create(title='test', slug='test')
+ params = {'title': 'My first nodetype',
+ 'content': 'My first content',
+ 'slug': 'my-first-nodetype',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ self.first_nodetype = Nodetype.objects.create(**params)
+ self.first_nodetype.sites.add(self.site)
+ self.first_nodetype.metatypes.add(self.metatype)
+ self.first_nodetype.authors.add(self.author)
+
+ params = {'title': 'My second nodetype',
+ 'content': 'My second content with link '
+ 'to <a href="http://%s%s">first nodetype</a>'
+ ' and other links : %s %s.' % (
+ self.site.domain,
+ self.first_nodetype.get_absolute_url(),
+ 'http://localhost:8000/error-404/',
+ 'http://example.com/'),
+ 'slug': 'my-second-nodetype',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ self.second_nodetype = Nodetype.objects.create(**params)
+ self.second_nodetype.sites.add(self.site)
+ self.second_nodetype.metatypes.add(self.metatype)
+ self.second_nodetype.authors.add(self.author)
+ # Instanciating the server proxy
+ self.server = ServerProxy('http://localhost:8000/xmlrpc/',
+ transport=TestTransport())
+
+ def tearDown(self):
+ import gstudio.xmlrpc.pingback
+ gstudio.xmlrpc.pingback.urlopen = self.original_urlopen
+ shortener_settings.URL_SHORTENER_BACKEND = self.original_shortener
+
+ def test_generate_pingback_content(self):
+ soup = BeautifulSoup(self.second_nodetype.content)
+ target = 'http://%s%s' % (self.site.domain,
+ self.first_nodetype.get_absolute_url())
+
+ self.assertEquals(
+ generate_pingback_content(soup, target, 1000),
+ 'My second content with link to first nodetype and other links : '
+ 'http://localhost:8000/error-404/ http://example.com/.')
+ self.assertEquals(
+ generate_pingback_content(soup, target, 50),
+ '...ond content with link to first nodetype and other lin...')
+
+ soup = BeautifulSoup('<a href="%s">test link</a>' % target)
+ self.assertEquals(
+ generate_pingback_content(soup, target, 6), 'test l...')
+
+ soup = BeautifulSoup('test <a href="%s">link</a>' % target)
+ self.assertEquals(
+ generate_pingback_content(soup, target, 8), '...est link')
+ self.assertEquals(
+ generate_pingback_content(soup, target, 9), 'test link')
+
+ def test_pingback_ping(self):
+ target = 'http://%s%s' % (
+ self.site.domain, self.first_nodetype.get_absolute_url())
+ source = 'http://%s%s' % (
+ self.site.domain, self.second_nodetype.get_absolute_url())
+
+ # Error code 0 : A generic fault code
+ response = self.server.pingback.ping('toto', 'titi')
+ self.assertEquals(response, 0)
+ response = self.server.pingback.ping('http://%s/' % self.site.domain,
+ 'http://%s/' % self.site.domain)
+ self.assertEquals(response, 0)
+
+ # Error code 16 : The source URI does not exist.
+ response = self.server.pingback.ping('http://example.com/', target)
+ self.assertEquals(response, 16)
+
+ # Error code 17 : The source URI does not contain a link to
+ # the target URI and so cannot be used as a source.
+ response = self.server.pingback.ping(source, 'toto')
+ self.assertEquals(response, 17)
+
+ # Error code 32 : The target URI does not exist.
+ response = self.server.pingback.ping(
+ source, 'http://localhost:8000/error-404/')
+ self.assertEquals(response, 32)
+ response = self.server.pingback.ping(source, 'http://example.com/')
+ self.assertEquals(response, 32)
+
+ # Error code 33 : The target URI cannot be used as a target.
+ response = self.server.pingback.ping(source, 'http://localhost:8000/')
+ self.assertEquals(response, 33)
+ self.first_nodetype.pingback_enabled = False
+ self.first_nodetype.save()
+ response = self.server.pingback.ping(source, target)
+ self.assertEquals(response, 33)
+
+ # Validate pingback
+ self.assertEquals(self.first_nodetype.comments.count(), 0)
+ self.first_nodetype.pingback_enabled = True
+ self.first_nodetype.save()
+ response = self.server.pingback.ping(source, target)
+ self.assertEquals(
+ response,
+ 'Pingback from %s to %s registered.' % (source, target))
+ self.assertEquals(self.first_nodetype.pingbacks.count(), 1)
+ self.assertTrue(self.second_nodetype.title in \
+ self.first_nodetype.pingbacks[0].user_name)
+
+ # Error code 48 : The pingback has already been registered.
+ response = self.server.pingback.ping(source, target)
+ self.assertEquals(response, 48)
+
+ def test_pingback_extensions_get_pingbacks(self):
+ target = 'http://%s%s' % (
+ self.site.domain, self.first_nodetype.get_absolute_url())
+ source = 'http://%s%s' % (
+ self.site.domain, self.second_nodetype.get_absolute_url())
+
+ response = self.server.pingback.ping(source, target)
+ self.assertEquals(
+ response, 'Pingback from %s to %s registered.' % (source, target))
+
+ response = self.server.pingback.extensions.getPingbacks(
+ 'http://example.com/')
+ self.assertEquals(response, 32)
+
+ response = self.server.pingback.extensions.getPingbacks(
+ 'http://localhost:8000/error-404/')
+ self.assertEquals(response, 32)
+
+ response = self.server.pingback.extensions.getPingbacks(
+ 'http://localhost:8000/2010/')
+ self.assertEquals(response, 33)
+
+ response = self.server.pingback.extensions.getPingbacks(source)
+ self.assertEquals(response, [])
+
+ response = self.server.pingback.extensions.getPingbacks(target)
+ self.assertEquals(response, [
+ 'http://localhost:8000/2010/01/01/my-second-nodetype/'])
+
+ comment = comments.get_model().objects.create(
+ content_type=ContentType.objects.get_for_model(Nodetype),
+ object_pk=self.first_nodetype.pk,
+ site=self.site, comment='Test pingback',
+ user_url='http://example.com/blog/1/',
+ user_name='Test pingback')
+ comment.flags.create(user=self.author, flag='pingback')
+
+ response = self.server.pingback.extensions.getPingbacks(target)
+ self.assertEquals(response, [
+ 'http://localhost:8000/2010/01/01/my-second-nodetype/',
+ 'http://example.com/blog/1/'])
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/quick_nodetype.py b/build/lib.linux-i686-2.6/gstudio/tests/quick_nodetype.py
new file mode 100644
index 0000000..066eb95
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/quick_nodetype.py
@@ -0,0 +1,103 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Gstudio's quick nodetype"""
+from django.test import TestCase
+from django.contrib.auth.models import User
+
+from gstudio import settings
+from gstudio.models import Nodetype
+from gstudio.managers import DRAFT
+
+
+class QuickNodetypeTestCase(TestCase):
+ """Test cases for quick_nodetype view"""
+ urls = 'gstudio.tests.urls'
+
+ def setUp(self):
+ self.original_wysiwyg = settings.WYSIWYG
+ settings.WYSIWYG = None
+
+ def tearDown(self):
+ settings.WYSIWYG = self.original_wysiwyg
+
+ def test_quick_nodetype(self):
+ User.objects.create_user('user', 'user@example.com', 'password')
+ User.objects.create_superuser('admin', 'admin@example.com', 'password')
+
+ response = self.client.get('/quick_nodetype/', follow=True)
+ self.assertEquals(
+ response.redirect_chain,
+ [('http://testserver/accounts/login/?next=/quick_nodetype/', 302)])
+ self.client.login(username='user', password='password')
+ response = self.client.get('/quick_nodetype/', follow=True)
+ self.assertEquals(
+ response.redirect_chain,
+ [('http://testserver/accounts/login/?next=/quick_nodetype/', 302)])
+ self.client.logout()
+ self.client.login(username='admin', password='password')
+ response = self.client.get('/quick_nodetype/', follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/admin/gstudio/nodetype/add/', 302)])
+ response = self.client.post('/quick_nodetype/', {'title': 'test'},
+ follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/admin/gstudio/nodetype/add/' \
+ '?tags=&title=test&sites=1&content=' \
+ '%3Cp%3E%3C%2Fp%3E&authors=2&slug=test', 302)])
+ response = self.client.post('/quick_nodetype/',
+ {'title': 'test', 'tags': 'test',
+ 'content': 'Test content',
+ 'save_draft': ''}, follow=True)
+ nodetype = Nodetype.objects.get(title='test')
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver%s' % nodetype.get_absolute_url(),
+ 302)])
+ self.assertEquals(nodetype.status, DRAFT)
+ self.assertEquals(nodetype.title, 'test')
+ self.assertEquals(nodetype.tags, 'test')
+ self.assertEquals(nodetype.content, '<p>Test content</p>')
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/signals.py b/build/lib.linux-i686-2.6/gstudio/tests/signals.py
new file mode 100644
index 0000000..0cc6529
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/signals.py
@@ -0,0 +1,137 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Gstudio's signals"""
+from django.test import TestCase
+
+from gstudio.models import Nodetype
+from gstudio.managers import DRAFT
+from gstudio.managers import PUBLISHED
+from gstudio.signals import disable_for_loaddata
+from gstudio.signals import ping_directories_handler
+from gstudio.signals import ping_external_urls_handler
+
+
+class SignalsTestCase(TestCase):
+ """Test cases for signals"""
+
+ def test_disable_for_loaddata(self):
+ self.top = 0
+
+ @disable_for_loaddata
+ def make_top():
+ self.top += 1
+
+ def call():
+ return make_top()
+
+ call()
+ self.assertEquals(self.top, 1)
+ # Okay the command is executed
+
+ def test_ping_directories_handler(self):
+ # Set up a stub around DirectoryPinger
+ self.top = 0
+
+ def fake_pinger(*ka, **kw):
+ self.top += 1
+
+ import gstudio.ping
+ from gstudio import settings
+ self.original_pinger = gstudio.ping.DirectoryPinger
+ gstudio.ping.DirectoryPinger = fake_pinger
+
+ params = {'title': 'My nodetype',
+ 'content': 'My content',
+ 'status': PUBLISHED,
+ 'slug': 'my-nodetype'}
+ nodetype = Nodetype.objects.create(**params)
+ self.assertEquals(nodetype.is_visible, True)
+ settings.PING_DIRECTORIES = ()
+ ping_directories_handler('sender', **{'instance': nodetype})
+ self.assertEquals(self.top, 0)
+ settings.PING_DIRECTORIES = ('toto',)
+ settings.SAVE_PING_DIRECTORIES = True
+ ping_directories_handler('sender', **{'instance': nodetype})
+ self.assertEquals(self.top, 1)
+ nodetype.status = DRAFT
+ ping_directories_handler('sender', **{'instance': nodetype})
+ self.assertEquals(self.top, 1)
+
+ # Remove stub
+ gstudio.ping.DirectoryPinger = self.original_pinger
+
+ def test_ping_external_urls_handler(self):
+ # Set up a stub around ExternalUrlsPinger
+ self.top = 0
+
+ def fake_pinger(*ka, **kw):
+ self.top += 1
+
+ import gstudio.ping
+ from gstudio import settings
+ self.original_pinger = gstudio.ping.ExternalUrlsPinger
+ gstudio.ping.ExternalUrlsPinger = fake_pinger
+
+ params = {'title': 'My nodetype',
+ 'content': 'My content',
+ 'status': PUBLISHED,
+ 'slug': 'my-nodetype'}
+ nodetype = Nodetype.objects.create(**params)
+ self.assertEquals(nodetype.is_visible, True)
+ settings.SAVE_PING_EXTERNAL_URLS = False
+ ping_external_urls_handler('sender', **{'instance': nodetype})
+ self.assertEquals(self.top, 0)
+ settings.SAVE_PING_EXTERNAL_URLS = True
+ ping_external_urls_handler('sender', **{'instance': nodetype})
+ self.assertEquals(self.top, 1)
+ nodetype.status = 0
+ ping_external_urls_handler('sender', **{'instance': nodetype})
+ self.assertEquals(self.top, 1)
+
+ # Remove stub
+ gstudio.ping.ExternalUrlsPinger = self.original_pinger
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/sitemaps.py b/build/lib.linux-i686-2.6/gstudio/tests/sitemaps.py
new file mode 100644
index 0000000..c2ed549
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/sitemaps.py
@@ -0,0 +1,128 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Gstudio's sitemaps"""
+from django.test import TestCase
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+
+from tagging.models import Tag
+
+from gstudio.models import Nodetype
+from gstudio.models import Author
+from gstudio.models import Metatype
+from gstudio.managers import PUBLISHED
+from gstudio.sitemaps import NodetypeSitemap
+from gstudio.sitemaps import MetatypeSitemap
+from gstudio.sitemaps import AuthorSitemap
+from gstudio.sitemaps import TagSitemap
+
+
+class GstudioSitemapsTestCase(TestCase):
+ """Test cases for Sitemaps classes provided"""
+ urls = 'gstudio.tests.urls'
+
+ def setUp(self):
+ self.site = Site.objects.get_current()
+ self.author = User.objects.create(username='admin',
+ email='admin@example.com')
+ self.metatype = Metatype.objects.create(title='Tests', slug='tests')
+ params = {'title': 'My nodetype 1', 'content': 'My content 1',
+ 'tags': 'gstudio, test', 'slug': 'my-nodetype-1',
+ 'status': PUBLISHED}
+ self.nodetype_1 = Nodetype.objects.create(**params)
+ self.nodetype_1.authors.add(self.author)
+ self.nodetype_1.metatypes.add(self.metatype)
+ self.nodetype_1.sites.add(self.site)
+
+ params = {'title': 'My nodetype 2', 'content': 'My content 2',
+ 'tags': 'gstudio', 'slug': 'my-nodetype-2',
+ 'status': PUBLISHED}
+ self.nodetype_2 = Nodetype.objects.create(**params)
+ self.nodetype_2.authors.add(self.author)
+ self.nodetype_2.metatypes.add(self.metatype)
+ self.nodetype_2.sites.add(self.site)
+
+ def test_nodetype_sitemap(self):
+ sitemap = NodetypeSitemap()
+ self.assertEquals(len(sitemap.items()), 2)
+ self.assertEquals(sitemap.lastmod(self.nodetype_1),
+ self.nodetype_1.last_update)
+
+ def test_metatype_sitemap(self):
+ sitemap = MetatypeSitemap()
+ self.assertEquals(len(sitemap.items()), 1)
+ self.assertEquals(sitemap.lastmod(self.metatype),
+ self.nodetype_2.creation_date)
+ self.assertEquals(sitemap.lastmod(Metatype.objects.create(
+ title='New', slug='new')), None)
+ self.assertEquals(sitemap.priority(self.metatype), '1.0')
+
+ def test_author_sitemap(self):
+ sitemap = AuthorSitemap()
+ authors = sitemap.items()
+ self.assertEquals(len(authors), 1)
+ self.assertEquals(sitemap.lastmod(authors[0]),
+ self.nodetype_2.creation_date)
+ self.assertEquals(sitemap.lastmod(Author.objects.create(
+ username='New', email='new@example.com')), None)
+ self.assertEquals(sitemap.location(self.author), '/authors/admin/')
+
+ def test_tag_sitemap(self):
+ sitemap = TagSitemap()
+ gstudio_tag = Tag.objects.get(name='gstudio')
+ self.assertEquals(len(sitemap.items()), 2)
+ self.assertEquals(sitemap.lastmod(gstudio_tag),
+ self.nodetype_2.creation_date)
+ self.assertEquals(sitemap.priority(gstudio_tag), '1.0')
+ self.assertEquals(sitemap.location(gstudio_tag), '/tags/gstudio/')
+
+ def test_metatype_sitemap_zero_division_error(self):
+ Nodetype.objects.all().delete()
+ metatype_sitemap = MetatypeSitemap()
+ metatype_sitemap.items()
+ self.assertEquals(metatype_sitemap.priority(self.metatype), '0.5')
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/spam_checker.py b/build/lib.linux-i686-2.6/gstudio/tests/spam_checker.py
new file mode 100644
index 0000000..e40ae94
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/spam_checker.py
@@ -0,0 +1,40 @@
+"""Test cases for Gstudio's spam_checker"""
+from __future__ import with_statement
+import warnings
+
+from django.test import TestCase
+
+from gstudio.spam_checker import get_spam_checker
+from gstudio.spam_checker.backends.all_is_spam import backend
+
+
+class SpamCheckerTestCase(TestCase):
+ """Test cases for gstudio.spam_checker"""
+
+ def test_get_spam_checker(self):
+ try:
+ with warnings.catch_warnings(record=True) as w:
+ self.assertEquals(get_spam_checker('mymodule.myclass'), None)
+ self.assertTrue(issubclass(w[-1].metatype, RuntimeWarning))
+ self.assertEquals(
+ str(w[-1].message),
+ 'mymodule.myclass backend cannot be imported')
+ except AttributeError:
+ # Fail under Python2.5, because of'warnings.catch_warnings'
+ pass
+
+ try:
+ with warnings.catch_warnings(record=True) as w:
+ self.assertEquals(
+ get_spam_checker('gstudio.tests.custom_spam_checker'), None)
+ self.assertTrue(issubclass(w[-1].metatype, RuntimeWarning))
+ self.assertEquals(
+ str(w[-1].message),
+ 'This backend only exists for testing')
+ except AttributeError:
+ # Fail under Python2.5, because of'warnings.catch_warnings'
+ pass
+
+ self.assertEquals(
+ get_spam_checker('gstudio.spam_checker.backends.all_is_spam'),
+ backend)
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/templatetags.py b/build/lib.linux-i686-2.6/gstudio/tests/templatetags.py
new file mode 100644
index 0000000..37d47c2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/templatetags.py
@@ -0,0 +1,590 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Gstudio's templatetags"""
+from datetime import datetime
+
+from django.test import TestCase
+from django.template import Context
+from django.template import Template
+from django.template import TemplateSyntaxError
+from django.contrib import comments
+from django.core.paginator import Paginator
+from django.core.urlresolvers import reverse
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.contrib.comments.models import CommentFlag
+
+from tagging.models import Tag
+
+from gstudio.models import Nodetype
+from gstudio.models import Author
+from gstudio.models import Metatype
+from gstudio.managers import DRAFT
+from gstudio.managers import PUBLISHED
+from gstudio.templatetags.gstudio_tags import get_authors
+from gstudio.templatetags.gstudio_tags import get_gravatar
+from gstudio.templatetags.gstudio_tags import get_tag_cloud
+from gstudio.templatetags.gstudio_tags import get_metatypes
+from gstudio.templatetags.gstudio_tags import gstudio_pagination
+from gstudio.templatetags.gstudio_tags import get_recent_nodetypes
+from gstudio.templatetags.gstudio_tags import get_random_nodetypes
+from gstudio.templatetags.gstudio_tags import gstudio_breadcrumbs
+from gstudio.templatetags.gstudio_tags import get_popular_nodetypes
+from gstudio.templatetags.gstudio_tags import get_similar_nodetypes
+from gstudio.templatetags.gstudio_tags import get_recent_comments
+from gstudio.templatetags.gstudio_tags import get_recent_linkbacks
+from gstudio.templatetags.gstudio_tags import get_calendar_nodetypes
+from gstudio.templatetags.gstudio_tags import get_archives_nodetypes
+from gstudio.templatetags.gstudio_tags import get_featured_nodetypes
+from gstudio.templatetags.gstudio_tags import get_archives_nodetypes_tree
+
+
+class TemplateTagsTestCase(TestCase):
+ """Test cases for Template tags"""
+
+ def setUp(self):
+ params = {'title': 'My nodetype',
+ 'content': 'My content',
+ 'tags': 'gstudio, test',
+ 'creation_date': datetime(2010, 1, 1),
+ 'slug': 'my-nodetype'}
+ self.nodetype = Nodetype.objects.create(**params)
+
+ def publish_nodetype(self):
+ self.nodetype.status = PUBLISHED
+ self.nodetype.featured = True
+ self.nodetype.sites.add(Site.objects.get_current())
+ self.nodetype.save()
+
+ def test_get_metatypes(self):
+ context = get_metatypes()
+ self.assertEquals(len(context['metatypes']), 0)
+ self.assertEquals(context['template'], 'gstudio/tags/metatypes.html')
+
+ Metatype.objects.create(title='Metatype 1', slug='metatype-1')
+ context = get_metatypes('custom_template.html')
+ self.assertEquals(len(context['metatypes']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ def test_get_authors(self):
+ context = get_authors()
+ self.assertEquals(len(context['authors']), 0)
+ self.assertEquals(context['template'], 'gstudio/tags/authors.html')
+
+ user = User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+ self.nodetype.authors.add(user)
+ self.publish_nodetype()
+ context = get_authors('custom_template.html')
+ self.assertEquals(len(context['authors']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ def test_get_recent_nodetypes(self):
+ context = get_recent_nodetypes()
+ self.assertEquals(len(context['nodetypes']), 0)
+ self.assertEquals(context['template'],
+ 'gstudio/tags/recent_nodetypes.html')
+
+ self.publish_nodetype()
+ context = get_recent_nodetypes(3, 'custom_template.html')
+ self.assertEquals(len(context['nodetypes']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+ context = get_recent_nodetypes(0)
+ self.assertEquals(len(context['nodetypes']), 0)
+
+ def test_get_featured_nodetypes(self):
+ context = get_featured_nodetypes()
+ self.assertEquals(len(context['nodetypes']), 0)
+ self.assertEquals(context['template'],
+ 'gstudio/tags/featured_nodetypes.html')
+
+ self.publish_nodetype()
+ context = get_featured_nodetypes(3, 'custom_template.html')
+ self.assertEquals(len(context['nodetypes']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+ context = get_featured_nodetypes(0)
+ self.assertEquals(len(context['nodetypes']), 0)
+
+ def test_get_random_nodetypes(self):
+ context = get_random_nodetypes()
+ self.assertEquals(len(context['nodetypes']), 0)
+ self.assertEquals(context['template'],
+ 'gstudio/tags/random_nodetypes.html')
+
+ self.publish_nodetype()
+ context = get_random_nodetypes(3, 'custom_template.html')
+ self.assertEquals(len(context['nodetypes']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+ context = get_random_nodetypes(0)
+ self.assertEquals(len(context['nodetypes']), 0)
+
+ def test_get_popular_nodetypes(self):
+ context = get_popular_nodetypes()
+ self.assertEquals(len(context['nodetypes']), 0)
+ self.assertEquals(context['template'],
+ 'gstudio/tags/popular_nodetypes.html')
+
+ self.publish_nodetype()
+ context = get_popular_nodetypes(3, 'custom_template.html')
+ self.assertEquals(len(context['nodetypes']), 0)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ params = {'title': 'My second nodetype',
+ 'content': 'My second content',
+ 'tags': 'gstudio, test',
+ 'status': PUBLISHED,
+ 'slug': 'my-second-nodetype'}
+ site = Site.objects.get_current()
+ second_nodetype = Nodetype.objects.create(**params)
+ second_nodetype.sites.add(site)
+
+ comments.get_model().objects.create(comment='My Comment 1', site=site,
+ content_object=self.nodetype)
+ comments.get_model().objects.create(comment='My Comment 2', site=site,
+ content_object=self.nodetype)
+ comments.get_model().objects.create(comment='My Comment 3', site=site,
+ content_object=second_nodetype)
+ context = get_popular_nodetypes(3)
+ self.assertEquals(context['nodetypes'], [self.nodetype, second_nodetype])
+ self.nodetype.status = DRAFT
+ self.nodetype.save()
+ context = get_popular_nodetypes(3)
+ self.assertEquals(context['nodetypes'], [second_nodetype])
+
+ def test_get_similar_nodetypes(self):
+ self.publish_nodetype()
+ source_context = Context({'object': self.nodetype})
+ context = get_similar_nodetypes(source_context)
+ self.assertEquals(len(context['nodetypes']), 0)
+ self.assertEquals(context['template'],
+ 'gstudio/tags/similar_nodetypes.html')
+
+ params = {'title': 'My second nodetype',
+ 'content': 'This is the second nodetype of my tests.',
+ 'tags': 'gstudio, test',
+ 'status': PUBLISHED,
+ 'slug': 'my-second-nodetype'}
+ site = Site.objects.get_current()
+ second_nodetype = Nodetype.objects.create(**params)
+ second_nodetype.sites.add(site)
+
+ source_context = Context({'object': second_nodetype})
+ context = get_similar_nodetypes(source_context, 3,
+ 'custom_template.html',
+ flush=True)
+ self.assertEquals(len(context['nodetypes']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ def test_get_archives_nodetypes(self):
+ context = get_archives_nodetypes()
+ self.assertEquals(len(context['archives']), 0)
+ self.assertEquals(context['template'],
+ 'gstudio/tags/archives_nodetypes.html')
+
+ self.publish_nodetype()
+ params = {'title': 'My second nodetype',
+ 'content': 'My second content',
+ 'tags': 'gstudio, test',
+ 'status': PUBLISHED,
+ 'creation_date': datetime(2009, 1, 1),
+ 'slug': 'my-second-nodetype'}
+ site = Site.objects.get_current()
+ second_nodetype = Nodetype.objects.create(**params)
+ second_nodetype.sites.add(site)
+
+ context = get_archives_nodetypes('custom_template.html')
+ self.assertEquals(len(context['archives']), 2)
+ self.assertEquals(context['archives'][0], datetime(2010, 1, 1))
+ self.assertEquals(context['archives'][1], datetime(2009, 1, 1))
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ def test_get_archives_tree(self):
+ context = get_archives_nodetypes_tree()
+ self.assertEquals(len(context['archives']), 0)
+ self.assertEquals(context['template'],
+ 'gstudio/tags/archives_nodetypes_tree.html')
+
+ self.publish_nodetype()
+ params = {'title': 'My second nodetype',
+ 'content': 'My second content',
+ 'tags': 'gstudio, test',
+ 'status': PUBLISHED,
+ 'creation_date': datetime(2009, 1, 10),
+ 'slug': 'my-second-nodetype'}
+ site = Site.objects.get_current()
+ second_nodetype = Nodetype.objects.create(**params)
+ second_nodetype.sites.add(site)
+
+ context = get_archives_nodetypes_tree('custom_template.html')
+ self.assertEquals(len(context['archives']), 2)
+ self.assertEquals(context['archives'][0], datetime(2009, 1, 10))
+ self.assertEquals(context['archives'][1], datetime(2010, 1, 1))
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ def test_get_calendar_nodetypes(self):
+ source_context = Context()
+ context = get_calendar_nodetypes(source_context)
+ self.assertEquals(context['previous_month'], None)
+ self.assertEquals(context['next_month'], None)
+ self.assertEquals(context['template'], 'gstudio/tags/calendar.html')
+
+ self.publish_nodetype()
+ context = get_calendar_nodetypes(source_context,
+ template='custom_template.html')
+ self.assertEquals(context['previous_month'], datetime(2010, 1, 1))
+ self.assertEquals(context['next_month'], None)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ context = get_calendar_nodetypes(source_context, 2009, 1)
+ self.assertEquals(context['previous_month'], None)
+ self.assertEquals(context['next_month'], datetime(2010, 1, 1))
+
+ source_context = Context({'month': datetime(2009, 1, 1)})
+ context = get_calendar_nodetypes(source_context)
+ self.assertEquals(context['previous_month'], None)
+ self.assertEquals(context['next_month'], datetime(2010, 1, 1))
+
+ source_context = Context({'month': datetime(2010, 1, 1)})
+ context = get_calendar_nodetypes(source_context)
+ self.assertEquals(context['previous_month'], None)
+ self.assertEquals(context['next_month'], None)
+
+ params = {'title': 'My second nodetype',
+ 'content': 'My second content',
+ 'tags': 'gstudio, test',
+ 'status': PUBLISHED,
+ 'creation_date': datetime(2008, 1, 1),
+ 'slug': 'my-second-nodetype'}
+ site = Site.objects.get_current()
+ second_nodetype = Nodetype.objects.create(**params)
+ second_nodetype.sites.add(site)
+
+ source_context = Context()
+ context = get_calendar_nodetypes(source_context, 2009, 1)
+ self.assertEquals(context['previous_month'], datetime(2008, 1, 1))
+ self.assertEquals(context['next_month'], datetime(2010, 1, 1))
+ context = get_calendar_nodetypes(source_context)
+ self.assertEquals(context['previous_month'], datetime(2010, 1, 1))
+ self.assertEquals(context['next_month'], None)
+
+ def test_get_recent_comments(self):
+ site = Site.objects.get_current()
+ context = get_recent_comments()
+ self.assertEquals(len(context['comments']), 0)
+ self.assertEquals(context['template'],
+ 'gstudio/tags/recent_comments.html')
+
+ comment_1 = comments.get_model().objects.create(
+ comment='My Comment 1', site=site,
+ content_object=self.nodetype)
+ context = get_recent_comments(3, 'custom_template.html')
+ self.assertEquals(len(context['comments']), 0)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ self.publish_nodetype()
+ context = get_recent_comments()
+ self.assertEquals(len(context['comments']), 1)
+
+ author = User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+ comment_2 = comments.get_model().objects.create(
+ comment='My Comment 2', site=site,
+ content_object=self.nodetype)
+ comment_2.flags.create(user=author,
+ flag=CommentFlag.MODERATOR_APPROVAL)
+ context = get_recent_comments()
+ self.assertEquals(list(context['comments']), [comment_2, comment_1])
+
+ def test_get_recent_linkbacks(self):
+ user = User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+ site = Site.objects.get_current()
+ context = get_recent_linkbacks()
+ self.assertEquals(len(context['linkbacks']), 0)
+ self.assertEquals(context['template'],
+ 'gstudio/tags/recent_linkbacks.html')
+
+ linkback_1 = comments.get_model().objects.create(
+ comment='My Linkback 1', site=site,
+ content_object=self.nodetype)
+ linkback_1.flags.create(user=user, flag='pingback')
+ context = get_recent_linkbacks(3, 'custom_template.html')
+ self.assertEquals(len(context['linkbacks']), 0)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ self.publish_nodetype()
+ context = get_recent_linkbacks()
+ self.assertEquals(len(context['linkbacks']), 1)
+
+ linkback_2 = comments.get_model().objects.create(
+ comment='My Linkback 2', site=site,
+ content_object=self.nodetype)
+ linkback_2.flags.create(user=user, flag='trackback')
+ context = get_recent_linkbacks()
+ self.assertEquals(list(context['linkbacks']), [linkback_2, linkback_1])
+
+ def test_gstudio_pagination(self):
+ class FakeRequest(object):
+ def __init__(self, get_dict):
+ self.GET = get_dict
+
+ source_context = Context({'request': FakeRequest(
+ {'page': '1', 'key': 'val'})})
+ paginator = Paginator(range(200), 10)
+
+ context = gstudio_pagination(source_context, paginator.page(1))
+ self.assertEquals(context['page'].number, 1)
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [18, 19, 20])
+ self.assertEquals(context['GET_string'], '&key=val')
+ self.assertEquals(context['template'], 'gstudio/tags/pagination.html')
+
+ source_context = Context({'request': FakeRequest({})})
+ context = gstudio_pagination(source_context, paginator.page(2))
+ self.assertEquals(context['page'].number, 2)
+ self.assertEquals(context['begin'], [1, 2, 3, 4])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [18, 19, 20])
+ self.assertEquals(context['GET_string'], '')
+
+ context = gstudio_pagination(source_context, paginator.page(3))
+ self.assertEquals(context['begin'], [1, 2, 3, 4, 5])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [18, 19, 20])
+
+ context = gstudio_pagination(source_context, paginator.page(6))
+ self.assertEquals(context['begin'], [1, 2, 3, 4, 5, 6, 7, 8])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [18, 19, 20])
+
+ context = gstudio_pagination(source_context, paginator.page(11))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [9, 10, 11, 12, 13])
+ self.assertEquals(context['end'], [18, 19, 20])
+
+ context = gstudio_pagination(source_context, paginator.page(15))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [13, 14, 15, 16, 17, 18, 19, 20])
+
+ context = gstudio_pagination(source_context, paginator.page(18))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [16, 17, 18, 19, 20])
+
+ context = gstudio_pagination(source_context, paginator.page(19))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [17, 18, 19, 20])
+
+ context = gstudio_pagination(source_context, paginator.page(20))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [18, 19, 20])
+
+ context = gstudio_pagination(source_context, paginator.page(10),
+ begin_pages=1, end_pages=3,
+ before_pages=4, after_pages=3,
+ template='custom_template.html')
+ self.assertEquals(context['begin'], [1])
+ self.assertEquals(context['middle'], [6, 7, 8, 9, 10, 11, 12, 13])
+ self.assertEquals(context['end'], [18, 19, 20])
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ paginator = Paginator(range(50), 10)
+ context = gstudio_pagination(source_context, paginator.page(1))
+ self.assertEquals(context['begin'], [1, 2, 3, 4, 5])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [])
+
+ paginator = Paginator(range(60), 10)
+ context = gstudio_pagination(source_context, paginator.page(1))
+ self.assertEquals(context['begin'], [1, 2, 3, 4, 5, 6])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [])
+
+ paginator = Paginator(range(70), 10)
+ context = gstudio_pagination(source_context, paginator.page(1))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [5, 6, 7])
+
+ def test_gstudio_breadcrumbs(self):
+ class FakeRequest(object):
+ def __init__(self, path):
+ self.path = path
+
+ source_context = Context({'request': FakeRequest('/')})
+ context = gstudio_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 1)
+ self.assertEquals(context['breadcrumbs'][0].name, 'Blog')
+ self.assertEquals(context['breadcrumbs'][0].url,
+ reverse('gstudio_nodetype_archive_index'))
+ self.assertEquals(context['separator'], '/')
+ self.assertEquals(context['template'], 'gstudio/tags/breadcrumbs.html')
+
+ context = gstudio_breadcrumbs(source_context,
+ '>', 'Weblog', 'custom_template.html')
+ self.assertEquals(len(context['breadcrumbs']), 1)
+ self.assertEquals(context['breadcrumbs'][0].name, 'Weblog')
+ self.assertEquals(context['separator'], '>')
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ source_context = Context(
+ {'request': FakeRequest(self.nodetype.get_absolute_url()),
+ 'object': self.nodetype})
+ context = gstudio_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 5)
+
+ cat_1 = Metatype.objects.create(title='Metatype 1', slug='metatype-1')
+ source_context = Context(
+ {'request': FakeRequest(cat_1.get_absolute_url()),
+ 'object': cat_1})
+ context = gstudio_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 3)
+ cat_2 = Metatype.objects.create(title='Metatype 2', slug='metatype-2',
+ parent=cat_1)
+ source_context = Context(
+ {'request': FakeRequest(cat_2.get_absolute_url()),
+ 'object': cat_2})
+ context = gstudio_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 4)
+
+ tag = Tag.objects.get(name='test')
+ source_context = Context(
+ {'request': FakeRequest(reverse('gstudio_tag_detail',
+ args=['test'])),
+ 'object': tag})
+ context = gstudio_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 3)
+
+ User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+ author = Author.objects.get(username='webmaster')
+ source_context = Context(
+ {'request': FakeRequest(author.get_absolute_url()),
+ 'object': author})
+ context = gstudio_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 3)
+
+ source_context = Context(
+ {'request': FakeRequest(reverse(
+ 'gstudio_nodetype_archive_year', args=[2011]))})
+ context = gstudio_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 2)
+
+ source_context = Context({'request': FakeRequest(reverse(
+ 'gstudio_nodetype_archive_month', args=[2011, '03']))})
+ context = gstudio_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 3)
+
+ source_context = Context({'request': FakeRequest(reverse(
+ 'gstudio_nodetype_archive_day', args=[2011, '03', 15]))})
+ context = gstudio_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 4)
+ # More tests can be done here, for testing path and objects in context
+
+ def test_get_gravatar(self):
+ self.assertEquals(
+ get_gravatar('webmaster@example.com'),
+ 'http://www.gravatar.com/avatar/86d4fd4a22de452'
+ 'a9228298731a0b592.jpg?s=80&amp;r=g')
+ self.assertEquals(
+ get_gravatar(' WEBMASTER@example.com ', 15, 'x', '404'),
+ 'http://www.gravatar.com/avatar/86d4fd4a22de452'
+ 'a9228298731a0b592.jpg?s=15&amp;r=x&amp;d=404')
+
+ def test_get_tags(self):
+ Tag.objects.create(name='tag')
+ t = Template("""
+ {% load gstudio_tags %}
+ {% get_tags as nodetype_tags %}
+ {{ nodetype_tags|join:", " }}
+ """)
+ html = t.render(Context())
+ self.assertEquals(html.strip(), '')
+ self.publish_nodetype()
+ html = t.render(Context())
+ self.assertEquals(html.strip(), 'test, gstudio')
+
+ template_error_as = """
+ {% load gstudio_tags %}
+ {% get_tags a_s nodetype_tags %}"""
+ self.assertRaises(TemplateSyntaxError, Template, template_error_as)
+
+ template_error_args = """
+ {% load gstudio_tags %}
+ {% get_tags as nodetype tags %}"""
+ self.assertRaises(TemplateSyntaxError, Template, template_error_args)
+
+ def test_get_tag_cloud(self):
+ context = get_tag_cloud()
+ self.assertEquals(len(context['tags']), 0)
+ self.assertEquals(context['template'], 'gstudio/tags/tag_cloud.html')
+ self.publish_nodetype()
+ context = get_tag_cloud(6, 'custom_template.html')
+ self.assertEquals(len(context['tags']), 2)
+ self.assertEquals(context['template'], 'custom_template.html')
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/url_shortener.py b/build/lib.linux-i686-2.6/gstudio/tests/url_shortener.py
new file mode 100644
index 0000000..7901d6a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/url_shortener.py
@@ -0,0 +1,112 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Gstudio's url_shortener"""
+from __future__ import with_statement
+import warnings
+
+from django.test import TestCase
+
+from gstudio.url_shortener import get_url_shortener
+from gstudio import url_shortener as us_settings
+from gstudio.url_shortener.backends.default import backend as default_backend
+
+
+class URLShortenerTestCase(TestCase):
+ """Test cases for gstudio.url_shortener"""
+
+ def setUp(self):
+ self.original_backend = us_settings.URL_SHORTENER_BACKEND
+
+ def tearDown(self):
+ us_settings.URL_SHORTENER_BACKEND = self.original_backend
+
+ def test_get_url_shortener(self):
+ us_settings.URL_SHORTENER_BACKEND = 'mymodule.myclass'
+ try:
+ with warnings.catch_warnings(record=True) as w:
+ self.assertEquals(get_url_shortener(), default_backend)
+ self.assertTrue(issubclass(w[-1].metatype, RuntimeWarning))
+ self.assertEquals(
+ str(w[-1].message),
+ 'mymodule.myclass backend cannot be imported')
+ except AttributeError:
+ # Fail under Python2.5, because of'warnings.catch_warnings'
+ pass
+
+ us_settings.URL_SHORTENER_BACKEND = 'gstudio.tests.custom_url_shortener'
+ try:
+ with warnings.catch_warnings(record=True) as w:
+ self.assertEquals(get_url_shortener(), default_backend)
+ self.assertTrue(issubclass(w[-1].metatype, RuntimeWarning))
+ self.assertEquals(
+ str(w[-1].message),
+ 'This backend only exists for testing')
+ except AttributeError:
+ # Fail under Python2.5, because of'warnings.catch_warnings'
+ pass
+
+ us_settings.URL_SHORTENER_BACKEND = 'gstudio.url_shortener'\
+ '.backends.default'
+ self.assertEquals(get_url_shortener(), default_backend)
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/urls.py b/build/lib.linux-i686-2.6/gstudio/tests/urls.py
new file mode 100644
index 0000000..96a34b0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/urls.py
@@ -0,0 +1,37 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test urls for the gstudio project"""
+from django.contrib import admin
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import include
+from django.conf.urls.defaults import patterns
+
+from gstudio.urls import urlpatterns
+
+admin.autodiscover()
+
+handler500 = 'django.views.defaults.server_error'
+handler404 = 'django.views.defaults.page_not_found'
+
+urlpatterns += patterns(
+ '',
+ url(r'^channel-test/$', 'gstudio.views.channels.nodetype_channel',
+ {'query': 'test'}),
+ url(r'^comments/', include('django.contrib.comments.urls')),
+ url(r'^xmlrpc/$', 'django_xmlrpc.views.handle_xmlrpc'),
+ url(r'^admin/', include(admin.site.urls)),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/utils.py b/build/lib.linux-i686-2.6/gstudio/tests/utils.py
new file mode 100644
index 0000000..230b6ef
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/utils.py
@@ -0,0 +1,90 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Utils for Gstudio's tests"""
+import StringIO
+from xmlrpclib import Transport
+
+from django.test.client import Client
+
+
+class TestTransport(Transport):
+ """Handles connections to XML-RPC server
+ through Django test client."""
+
+ def __init__(self, *args, **kwargs):
+ Transport.__init__(self, *args, **kwargs)
+ self.client = Client()
+
+ def request(self, host, handler, request_body, verbose=0):
+ self.verbose = verbose
+ response = self.client.post(handler,
+ request_body,
+ content_type="text/xml")
+ res = StringIO.StringIO(response.content)
+ setattr(res, 'getheader', lambda *args: '') # For Python >= 2.7
+ res.seek(0)
+ if not hasattr(res, 'getheader'):
+ setattr(res, 'getheader', lambda *args: "")
+ return self.parse_response(res)
diff --git a/build/lib.linux-i686-2.6/gstudio/tests/views.py b/build/lib.linux-i686-2.6/gstudio/tests/views.py
new file mode 100644
index 0000000..8d55912
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/tests/views.py
@@ -0,0 +1,363 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Gstudio's views"""
+from datetime import datetime
+
+from django.conf import settings
+from django.test import TestCase
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.template import TemplateDoesNotExist
+from django.utils.translation import ugettext_lazy as _
+
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+from gstudio.managers import PUBLISHED
+from gstudio.settings import PAGINATION
+
+
+class ViewsBaseCase(TestCase):
+ """
+ Setup and utility function base case.
+ """
+
+ def setUp(self):
+ self.old_CONTEXT_PROCESSORS = settings.TEMPLATE_CONTEXT_PROCESSORS
+ self.old_TEMPLATE_LOADERS = settings.TEMPLATE_LOADERS
+ settings.TEMPLATE_LOADERS = (
+ ('django.template.loaders.cached.Loader', (
+ 'django.template.loaders.app_directories.Loader',
+ 'django.template.loaders.eggs.Loader',
+ )
+ ),
+ )
+ settings.TEMPLATE_CONTEXT_PROCESSORS = (
+ 'django.core.context_processors.request',
+ )
+
+ self.site = Site.objects.get_current()
+ self.author = User.objects.create_superuser(
+ username='admin', email='admin@example.com', password='password')
+ self.metatype = Metatype.objects.create(title='Tests', slug='tests')
+ params = {'title': 'Test 1',
+ 'content': 'First test nodetype published',
+ 'slug': 'test-1',
+ 'tags': 'tests',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ nodetype = Nodetype.objects.create(**params)
+ nodetype.sites.add(self.site)
+ nodetype.metatypes.add(self.metatype)
+ nodetype.authors.add(self.author)
+
+ params = {'title': 'Test 2',
+ 'content': 'Second test nodetype published',
+ 'slug': 'test-2',
+ 'tags': 'tests',
+ 'creation_date': datetime(2010, 6, 1),
+ 'status': PUBLISHED}
+ nodetype = Nodetype.objects.create(**params)
+ nodetype.sites.add(self.site)
+ nodetype.metatypes.add(self.metatype)
+ nodetype.authors.add(self.author)
+
+ def tearDown(self):
+ settings.TEMPLATE_CONTEXT_PROCESSORS = self.old_CONTEXT_PROCESSORS
+ settings.TEMPLATE_LOADERS = self.old_TEMPLATE_LOADERS
+
+ def create_published_nodetype(self):
+ params = {'title': 'My test nodetype',
+ 'content': 'My test content',
+ 'slug': 'my-test-nodetype',
+ 'tags': 'tests',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ nodetype = Nodetype.objects.create(**params)
+ nodetype.sites.add(self.site)
+ nodetype.metatypes.add(self.metatype)
+ nodetype.authors.add(self.author)
+ return nodetype
+
+ def check_publishing_context(self, url, first_expected,
+ second_expected=None):
+ """Test the numbers of nodetypes in context of an url,"""
+ response = self.client.get(url)
+ self.assertEquals(len(response.context['object_list']), first_expected)
+ if second_expected:
+ self.create_published_nodetype()
+ response = self.client.get(url)
+ self.assertEquals(
+ len(response.context['object_list']), second_expected)
+ return response
+
+
+class GstudioViewsTestCase(ViewsBaseCase):
+ """
+ Test cases for generic views used in the application,
+ for reproducing and correcting issue :
+ http://github.com/gnowgi/django-gstudio/issues#issue/3
+ """
+ urls = 'gstudio.tests.urls'
+
+ def test_gstudio_nodetype_archive_index(self):
+ self.check_publishing_context('/', 2, 3)
+
+ def test_gstudio_nodetype_archive_year(self):
+ self.check_publishing_context('/2010/', 2, 3)
+
+ def test_gstudio_nodetype_archive_month(self):
+ self.check_publishing_context('/2010/01/', 1, 2)
+
+ def test_gstudio_nodetype_archive_day(self):
+ self.check_publishing_context('/2010/01/01/', 1, 2)
+
+ def test_gstudio_nodetype_shortlink(self):
+ response = self.client.get('/1/', follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/2010/01/01/test-1/', 301)])
+
+ def test_gstudio_nodetype_detail(self):
+ nodetype = self.create_published_nodetype()
+ nodetype.sites.clear()
+ # Check a 404 error, but the 404.html may no exist
+ try:
+ self.assertRaises(TemplateDoesNotExist, self.client.get,
+ '/2010/01/01/my-test-nodetype/')
+ except AssertionError:
+ response = self.client.get('/2010/01/01/my-test-nodetype/')
+ self.assertEquals(response.status_code, 404)
+
+ nodetype.template = 'gstudio/_nodetype_detail.html'
+ nodetype.save()
+ nodetype.sites.add(Site.objects.get_current())
+ response = self.client.get('/2010/01/01/my-test-nodetype/')
+ self.assertEquals(response.status_code, 200)
+ self.assertTemplateUsed(response, 'gstudio/_nodetype_detail.html')
+
+ def test_gstudio_nodetype_detail_login(self):
+ nodetype = self.create_published_nodetype()
+ nodetype.login_required = True
+ nodetype.save()
+ response = self.client.get('/2010/01/01/my-test-nodetype/')
+ self.assertTemplateUsed(response, 'gstudio/login.html')
+
+ def test_gstudio_nodetype_detail_password(self):
+ nodetype = self.create_published_nodetype()
+ nodetype.password = 'password'
+ nodetype.save()
+ response = self.client.get('/2010/01/01/my-test-nodetype/')
+ self.assertTemplateUsed(response, 'gstudio/password.html')
+ self.assertEquals(response.context['error'], False)
+ response = self.client.post('/2010/01/01/my-test-nodetype/',
+ {'password': 'bad_password'})
+ self.assertTemplateUsed(response, 'gstudio/password.html')
+ self.assertEquals(response.context['error'], True)
+ response = self.client.post('/2010/01/01/my-test-nodetype/',
+ {'password': 'password'})
+ self.assertEquals(response.status_code, 302)
+
+ def test_gstudio_nodetype_channel(self):
+ self.check_publishing_context('/channel-test/', 2, 3)
+
+ def test_gstudio_metatype_list(self):
+ self.check_publishing_context('/metatypes/', 1)
+ nodetype = Nodetype.objects.all()[0]
+ nodetype.metatypes.add(Metatype.objects.create(title='New metatype',
+ slug='new-metatype'))
+ self.check_publishing_context('/metatypes/', 2)
+
+ def test_gstudio_metatype_detail(self):
+ response = self.check_publishing_context('/metatypes/tests/', 2, 3)
+ self.assertTemplateUsed(response, 'gstudio/metatype/nodetype_list.html')
+ self.assertEquals(response.context['metatype'].slug, 'tests')
+
+ def test_gstudio_metatype_detail_paginated(self):
+ """Test case reproducing issue #42 on metatype
+ detail view paginated"""
+ for i in range(PAGINATION):
+ params = {'title': 'My nodetype %i' % i,
+ 'content': 'My content %i' % i,
+ 'slug': 'my-nodetype-%i' % i,
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ nodetype = Nodetype.objects.create(**params)
+ nodetype.sites.add(self.site)
+ nodetype.metatypes.add(self.metatype)
+ nodetype.authors.add(self.author)
+ response = self.client.get('/metatypes/tests/')
+ self.assertEquals(len(response.context['object_list']), PAGINATION)
+ response = self.client.get('/metatypes/tests/?page=2')
+ self.assertEquals(len(response.context['object_list']), 2)
+ response = self.client.get('/metatypes/tests/page/2/')
+ self.assertEquals(len(response.context['object_list']), 2)
+ self.assertEquals(response.context['metatype'].slug, 'tests')
+
+ def test_gstudio_author_list(self):
+ self.check_publishing_context('/authors/', 1)
+ nodetype = Nodetype.objects.all()[0]
+ nodetype.authors.add(User.objects.create(username='new-user',
+ email='new_user@example.com'))
+ self.check_publishing_context('/authors/', 2)
+
+ def test_gstudio_author_detail(self):
+ response = self.check_publishing_context('/authors/admin/', 2, 3)
+ self.assertTemplateUsed(response, 'gstudio/author/nodetype_list.html')
+ self.assertEquals(response.context['author'].username, 'admin')
+
+ def test_gstudio_tag_list(self):
+ self.check_publishing_context('/tags/', 1)
+ nodetype = Nodetype.objects.all()[0]
+ nodetype.tags = 'tests, tag'
+ nodetype.save()
+ self.check_publishing_context('/tags/', 2)
+
+ def test_gstudio_tag_detail(self):
+ response = self.check_publishing_context('/tags/tests/', 2, 3)
+ self.assertTemplateUsed(response, 'gstudio/tag/nodetype_list.html')
+ self.assertEquals(response.context['tag'].name, 'tests')
+
+ def test_gstudio_nodetype_search(self):
+ self.check_publishing_context('/search/?pattern=test', 2, 3)
+ response = self.client.get('/search/?pattern=ab')
+ self.assertEquals(len(response.context['object_list']), 0)
+ self.assertEquals(response.context['error'],
+ _('The pattern is too short'))
+ response = self.client.get('/search/')
+ self.assertEquals(len(response.context['object_list']), 0)
+ self.assertEquals(response.context['error'],
+ _('No pattern to search found'))
+
+ def test_gstudio_sitemap(self):
+ response = self.client.get('/sitemap/')
+ self.assertEquals(len(response.context['nodetypes']), 2)
+ self.assertEquals(len(response.context['metatypes']), 1)
+ nodetype = self.create_published_nodetype()
+ nodetype.metatypes.add(Metatype.objects.create(title='New metatype',
+ slug='new-metatype'))
+ response = self.client.get('/sitemap/')
+ self.assertEquals(len(response.context['nodetypes']), 3)
+ self.assertEquals(len(response.context['metatypes']), 2)
+
+ def test_gstudio_trackback(self):
+ # Check a 404 error, but the 404.html may no exist
+ try:
+ self.assertRaises(TemplateDoesNotExist, self.client.post,
+ '/trackback/404/')
+ except AssertionError:
+ response = self.client.post('/trackback/404/')
+ self.assertEquals(response.status_code, 404)
+ self.assertEquals(
+ self.client.post('/trackback/1/').status_code, 301)
+ self.assertEquals(
+ self.client.get('/trackback/1/').status_code, 301)
+ nodetype = Nodetype.objects.get(slug='test-1')
+ nodetype.pingback_enabled = False
+ nodetype.save()
+ self.assertEquals(
+ self.client.post('/trackback/1/',
+ {'url': 'http://example.com'}).content,
+ '<?xml version="1.0" encoding="utf-8"?>\n<response>\n \n '
+ '<error>1</error>\n <message>Trackback is not enabled for '
+ 'Test 1</message>\n \n</response>\n')
+ nodetype.pingback_enabled = True
+ nodetype.save()
+ self.assertEquals(
+ self.client.post('/trackback/1/',
+ {'url': 'http://example.com'}).content,
+ '<?xml version="1.0" encoding="utf-8"?>\n<response>\n \n '
+ '<error>0</error>\n \n</response>\n')
+ self.assertEquals(
+ self.client.post('/trackback/1/',
+ {'url': 'http://example.com'}).content,
+ '<?xml version="1.0" encoding="utf-8"?>\n<response>\n \n '
+ '<error>1</error>\n <message>Trackback is already registered'
+ '</message>\n \n</response>\n')
+
+
+class GstudioCustomDetailViews(ViewsBaseCase):
+ """
+ Tests with an alternate urls.py that modifies how author_detail,
+ tags_detail and metatypes_detail views to be called with a custom
+ template_name keyword argument and an extra_context.
+ """
+ urls = 'gstudio.tests.custom_views_detail_urls'
+
+ def test_custom_metatype_detail(self):
+ response = self.check_publishing_context('/metatypes/tests/', 2, 3)
+ self.assertTemplateUsed(response, 'gstudio/nodetype_list.html')
+ self.assertEquals(response.context['metatype'].slug, 'tests')
+ self.assertEquals(response.context['extra'], 'context')
+
+ def test_custom_author_detail(self):
+ response = self.check_publishing_context('/authors/admin/', 2, 3)
+ self.assertTemplateUsed(response, 'gstudio/nodetype_list.html')
+ self.assertEquals(response.context['author'].username, 'admin')
+ self.assertEquals(response.context['extra'], 'context')
+
+ def test_custom_tag_detail(self):
+ response = self.check_publishing_context('/tags/tests/', 2, 3)
+ self.assertTemplateUsed(response, 'gstudio/nodetype_list.html')
+ self.assertEquals(response.context['tag'].name, 'tests')
+ self.assertEquals(response.context['extra'], 'context')
diff --git a/build/lib.linux-i686-2.6/gstudio/testsettings.py b/build/lib.linux-i686-2.6/gstudio/testsettings.py
new file mode 100644
index 0000000..5a5ff5a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/testsettings.py
@@ -0,0 +1,104 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Settings for testing gstudio"""
+import os
+from gstudio.xmlrpc import GSTUDIO_XMLRPC_METHODS
+
+DATABASES = {'default': {'NAME': 'gstudio_tests.db',
+ 'ENGINE': 'django.db.backends.sqlite3'}}
+
+SITE_ID = 1
+
+STATIC_URL = '/static/'
+
+ROOT_URLCONF = 'gstudio.tests.urls'
+
+TEMPLATE_CONTEXT_PROCESSORS = [
+ 'django.core.context_processors.request',
+ 'gstudio.context_processors.version']
+
+TEMPLATE_LOADERS = [
+ ['django.template.loaders.cached.Loader', [
+ 'django.template.loaders.filesystem.Loader',
+ 'django.template.loaders.app_directories.Loader']
+ ]
+ ]
+
+TEMPLATE_DIRS = [os.path.join(os.path.dirname(__file__),
+ 'tests', 'templates')]
+
+INSTALLED_APPS = ['django.contrib.contenttypes',
+ 'django.contrib.comments',
+ 'django.contrib.sessions',
+ 'django.contrib.sites',
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django_xmlrpc',
+ 'mptt', 'tagging', 'gstudio']
+
+GSTUDIO_PAGINATION = 3
+
+XMLRPC_METHODS = GSTUDIO_XMLRPC_METHODS
diff --git a/build/lib.linux-i686-2.6/gstudio/url_shortener/__init__.py b/build/lib.linux-i686-2.6/gstudio/url_shortener/__init__.py
new file mode 100644
index 0000000..d334d89
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/url_shortener/__init__.py
@@ -0,0 +1,24 @@
+"""Url shortener for Gstudio"""
+import warnings
+
+from django.utils.importlib import import_module
+from django.core.exceptions import ImproperlyConfigured
+
+from gstudio.settings import URL_SHORTENER_BACKEND
+from gstudio.url_shortener.backends.default import backend as default_backend
+
+
+def get_url_shortener():
+ """Return the selected url shortener backend"""
+ try:
+ backend_module = import_module(URL_SHORTENER_BACKEND)
+ backend = getattr(backend_module, 'backend')
+ except (ImportError, AttributeError):
+ warnings.warn('%s backend cannot be imported' % URL_SHORTENER_BACKEND,
+ RuntimeWarning)
+ backend = default_backend
+ except ImproperlyConfigured, e:
+ warnings.warn(str(e), RuntimeWarning)
+ backend = default_backend
+
+ return backend
diff --git a/build/lib.linux-i686-2.6/gstudio/url_shortener/backends/__init__.py b/build/lib.linux-i686-2.6/gstudio/url_shortener/backends/__init__.py
new file mode 100644
index 0000000..da6cf49
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/url_shortener/backends/__init__.py
@@ -0,0 +1 @@
+"""Shortlink backends for Gstudio"""
diff --git a/build/lib.linux-i686-2.6/gstudio/url_shortener/backends/bitly.py b/build/lib.linux-i686-2.6/gstudio/url_shortener/backends/bitly.py
new file mode 100644
index 0000000..3a1258e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/url_shortener/backends/bitly.py
@@ -0,0 +1,67 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Bit.ly url shortener backend for Gstudio"""
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+
+try:
+ from django_bitly.models import Bittle
+except ImportError:
+ raise ImproperlyConfigured('django_bitly is not available')
+
+if not getattr(settings, 'BITLY_LOGIN', ''):
+ raise ImproperlyConfigured('You have to set a BITLY_LOGIN setting')
+
+if not getattr(settings, 'BITLY_API_KEY', ''):
+ raise ImproperlyConfigured('You have to set a BITLY_API_KEY setting')
+
+
+def backend(nodetype):
+ """Bit.ly url shortener backend for Gstudio"""
+ bittle = Bittle.objects.bitlify(nodetype)
+ return bittle.shortUrl
diff --git a/build/lib.linux-i686-2.6/gstudio/url_shortener/backends/default.py b/build/lib.linux-i686-2.6/gstudio/url_shortener/backends/default.py
new file mode 100644
index 0000000..bedcc27
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/url_shortener/backends/default.py
@@ -0,0 +1,58 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Default url shortener backend for Gstudio"""
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+
+from gstudio.settings import PROTOCOL
+
+
+def backend(nodetype):
+ """Default url shortener backend for Gstudio"""
+ return '%s://%s%s' % (PROTOCOL, Site.objects.get_current().domain,
+ reverse('gstudio_nodetype_shortlink', args=[nodetype.pk]))
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/__init__.py b/build/lib.linux-i686-2.6/gstudio/urls/__init__.py
new file mode 100644
index 0000000..b04f148
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/__init__.py
@@ -0,0 +1,40 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Defaults urls for the Gstudio project"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import include
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns(
+ '',
+ url(r'^tags/', include('gstudio.urls.tags',)),
+ url(r'^feeds/', include('gstudio.urls.feeds')),
+ url(r'^authors/', include('gstudio.urls.authors')),
+ url(r'^metatypes/', include('gstudio.urls.metatypes')),
+ url(r'^search/', include('gstudio.urls.search')),
+ url(r'^sitemap/', include('gstudio.urls.sitemap')),
+ url(r'^trackback/', include('gstudio.urls.trackback')),
+ url(r'^discussions/', include('gstudio.urls.discussions')),
+ url(r'^add/', include('gstudio.urls.add')),
+ url(r'^ajax/', include('gstudio.urls.ajaxurls')),
+ url(r'^graphs/', include('gstudio.urls.graphs')),
+ url(r'^userdashboard/', include('gstudio.urls.dashboard')),
+ url(r'^', include('gstudio.urls.quick_nodetype')),
+ url(r'^', include('gstudio.urls.capabilities')),
+ url(r'^', include('gstudio.urls.nodetypes')),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/add.py b/build/lib.linux-i686-2.6/gstudio/urls/add.py
new file mode 100644
index 0000000..d2a2b0f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/add.py
@@ -0,0 +1,52 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for Gstudio forms"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('gstudio.views.add',
+ url(r'^metatype/$', 'addmetatype',
+ name='gstudio_add_meatype'),
+ url(r'^objecttype/$', 'addobjecttype',
+ name='gstudio_add_objecttype'),
+
+ url(r'^attributetype/$', 'addattributetype',
+ name='gstudio_add_attributetype'),
+
+ url(r'^relationtype/$', 'addrelationtype',
+ name='gstudio_add_relationtype'),
+ url(r'^systemtype/$', 'addsystemtype',
+ name='gstudio_add_systemtype'),
+ url(r'^processtype/$', 'addprocesstype',
+ name='gstudio_add_systemtype'),
+ url(r'^attribute/$', 'addattribute',
+ name='gstudio_add_attribute'),
+ url(r'^relation/$', 'addrelation',
+ name='gstudio_add_relation'),
+ url(r'^complement/$', 'addcomplement',
+ name='gstudio_add_complement'),
+ url(r'^intersection/$', 'addintersection',
+ name='gstudio_add_intersection'),
+ url(r'^union/$', 'addunion',
+ name='gstudio_add_union'),
+
+
+
+
+
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/ajaxurls.py b/build/lib.linux-i686-2.6/gstudio/urls/ajaxurls.py
new file mode 100644
index 0000000..4b84de3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/ajaxurls.py
@@ -0,0 +1,26 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Gstudio sitemap"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('gstudio.views.ajaxviews',
+ url(r'^$', 'AjaxAttribute',
+
+ name='ajax_views'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/authors.py b/build/lib.linux-i686-2.6/gstudio/urls/authors.py
new file mode 100644
index 0000000..9505a32
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/authors.py
@@ -0,0 +1,31 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Gstudio authors"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+
+urlpatterns = patterns('gstudio.views.authors',
+ url(r'^$', 'author_list',
+ name='gstudio_author_list'),
+ url(r'^(?P<username>[.+-@\w]+)/$', 'author_detail',
+ name='gstudio_author_detail'),
+ url(r'^(?P<username>[.+-@\w]+)/page/(?P<page>\d+)/$',
+ 'author_detail',
+ name='gstudio_author_detail_paginated'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/capabilities.py b/build/lib.linux-i686-2.6/gstudio/urls/capabilities.py
new file mode 100644
index 0000000..7a08e0b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/capabilities.py
@@ -0,0 +1,51 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the gstudio capabilities"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+from django.contrib.sites.models import Site
+
+from gstudio.settings import PROTOCOL
+from gstudio.settings import COPYRIGHT
+from gstudio.settings import FEEDS_FORMAT
+
+extra_context = {'protocol': PROTOCOL,
+ 'site': Site.objects.get_current()}
+
+extra_context_opensearch = extra_context.copy()
+extra_context_opensearch.update({'copyright': COPYRIGHT,
+ 'feeds_format': FEEDS_FORMAT})
+
+urlpatterns = patterns('django.views.generic.simple',
+ url(r'^rsd.xml$', 'direct_to_template',
+ {'template': 'gstudio/rsd.xml',
+ 'mimetype': 'application/rsd+xml',
+ 'extra_context': extra_context},
+ name='gstudio_rsd'),
+ url(r'^wlwmanifest.xml$', 'direct_to_template',
+ {'template': 'gstudio/wlwmanifest.xml',
+ 'mimetype': 'application/wlwmanifest+xml',
+ 'extra_context': extra_context},
+ name='gstudio_wlwmanifest'),
+ url(r'^opensearch.xml$', 'direct_to_template',
+ {'template': 'gstudio/opensearch.xml',
+ 'mimetype':
+ 'application/opensearchdescription+xml',
+ 'extra_context': extra_context_opensearch},
+ name='gstudio_opensearch'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/dashboard.py b/build/lib.linux-i686-2.6/gstudio/urls/dashboard.py
new file mode 100644
index 0000000..ea127c2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/dashboard.py
@@ -0,0 +1,75 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
+"""Url for Gstudio User Dashboard"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('gstudio.views.userdashboard',
+ url(r'^$', 'userdashboard',
+ name='gstudio_userdashboard'),
+
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/discussions.py b/build/lib.linux-i686-2.6/gstudio/urls/discussions.py
new file mode 100644
index 0000000..6309dcf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/discussions.py
@@ -0,0 +1,26 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Gstudio discussions"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('django.views.generic.simple',
+ url(r'^success/$', 'direct_to_template',
+ {'template': 'comments/gstudio/nodetype/posted.html'},
+ name='gstudio_discussion_success'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/feeds.py b/build/lib.linux-i686-2.6/gstudio/urls/feeds.py
new file mode 100644
index 0000000..34f36bd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/feeds.py
@@ -0,0 +1,66 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Gstudio feeds"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+from gstudio.feeds import LatestNodetypes
+from gstudio.feeds import NodetypeDiscussions
+from gstudio.feeds import NodetypeComments
+from gstudio.feeds import NodetypeTrackbacks
+from gstudio.feeds import NodetypePingbacks
+from gstudio.feeds import SearchNodetypes
+from gstudio.feeds import TagNodetypes
+from gstudio.feeds import MetatypeNodetypes
+from gstudio.feeds import AuthorNodetypes
+
+
+urlpatterns = patterns(
+ '',
+ url(r'^latest/$',
+ LatestNodetypes(),
+ name='gstudio_nodetype_latest_feed'),
+ url(r'^search/$',
+ SearchNodetypes(),
+ name='gstudio_nodetype_search_feed'),
+ url(r'^tags/(?P<slug>[- \w]+)/$',
+ TagNodetypes(),
+ name='gstudio_tag_feed'),
+ url(r'^authors/(?P<username>[.+-@\w]+)/$',
+ AuthorNodetypes(),
+ name='gstudio_author_feed'),
+ url(r'^metatypes/(?P<path>[-\/\w]+)/$',
+ MetatypeNodetypes(),
+ name='gstudio_metatype_feed'),
+ url(r'^discussions/(?P<year>\d{4})/(?P<month>\d{2})/' \
+ '(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
+ NodetypeDiscussions(),
+ name='gstudio_nodetype_discussion_feed'),
+ url(r'^comments/(?P<year>\d{4})/(?P<month>\d{2})/' \
+ '(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
+ NodetypeComments(),
+ name='gstudio_nodetype_comment_feed'),
+ url(r'^pingbacks/(?P<year>\d{4})/(?P<month>\d{2})/' \
+ '(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
+ NodetypePingbacks(),
+ name='gstudio_nodetype_pingback_feed'),
+ url(r'^trackbacks/(?P<year>\d{4})/(?P<month>\d{2})/' \
+ '(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
+ NodetypeTrackbacks(),
+ name='gstudio_nodetype_trackback_feed'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/graphs.py b/build/lib.linux-i686-2.6/gstudio/urls/graphs.py
new file mode 100644
index 0000000..952f021
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/graphs.py
@@ -0,0 +1,31 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Gstudio nodetypes"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+from gstudio.models import Nodetype
+from gstudio.settings import PAGINATION
+from gstudio.settings import ALLOW_EMPTY
+from gstudio.settings import ALLOW_FUTURE
+
+urlpatterns = patterns(
+ 'gstudio.views.graphs',
+ url(r'^graph_json/(?P<node_id>\d+)$','graph_json', name='graph_json_d3'),
+ url(r'^graph/(?P<node_id>\d+)$','force_graph', name='force_graph_d3'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/metatypes.py b/build/lib.linux-i686-2.6/gstudio/urls/metatypes.py
new file mode 100644
index 0000000..b54da69
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/metatypes.py
@@ -0,0 +1,37 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Gstudio metatypes"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+from gstudio.models import Metatype
+
+metatype_conf = {'queryset': Metatype.tree.all()}
+
+urlpatterns = patterns('django.views.generic.list_detail',
+ url(r'^$', 'object_list',
+ metatype_conf, 'gstudio_metatype_list'),
+ )
+
+urlpatterns += patterns('gstudio.views.metatypes',
+ url(r'^(?P<path>[-\/\w]+)/page/(?P<page>\d+)/$',
+ 'metatype_detail',
+ name='gstudio_metatype_detail_paginated'),
+ url(r'^(?P<path>[-\/\w]+)/$', 'metatype_detail',
+ name='gstudio_metatype_detail'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/nodetypes.py b/build/lib.linux-i686-2.6/gstudio/urls/nodetypes.py
new file mode 100644
index 0000000..9e7cd97
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/nodetypes.py
@@ -0,0 +1,70 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Gstudio nodetypes"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+from gstudio.models import Nodetype
+from gstudio.settings import PAGINATION
+from gstudio.settings import ALLOW_EMPTY
+from gstudio.settings import ALLOW_FUTURE
+
+nodetype_conf_index = {'paginate_by': PAGINATION,
+ 'template_name': 'gstudio/nodetype_archive.html'}
+
+nodetype_conf = {'date_field': 'creation_date',
+ 'allow_empty': ALLOW_EMPTY,
+ 'allow_future': ALLOW_FUTURE,
+ 'month_format': '%m',
+ 'queryset': Nodetype.tree.all()}
+
+metatype_conf = {}
+
+nodetype_conf_year = nodetype_conf.copy()
+nodetype_conf_year['make_object_list'] = True
+del nodetype_conf_year['month_format']
+
+nodetype_conf_detail = nodetype_conf.copy()
+del nodetype_conf_detail['allow_empty']
+nodetype_conf_detail['queryset'] = Nodetype.published.on_site()
+
+
+urlpatterns = patterns(
+ 'gstudio.views.nodetypes',
+ url(r'^$',
+ 'nodetype_index', nodetype_conf_index,
+ name='gstudio_nodetype_archive_index'),
+ url(r'^page/(?P<page>\d+)/$',
+ 'nodetype_index', nodetype_conf_index,
+ name='gstudio_nodetype_archive_index_paginated'),
+ url(r'^(?P<year>\d{4})/$',
+ 'nodetype_year', nodetype_conf_year,
+ name='gstudio_nodetype_archive_year'),
+ url(r'^(?P<year>\d{4})/(?P<month>\d{2})/$',
+ 'nodetype_month', nodetype_conf,
+ name='gstudio_nodetype_archive_month'),
+ url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$',
+ 'nodetype_day', nodetype_conf,
+ name='gstudio_nodetype_archive_day'),
+ url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
+ 'nodetype_detail', nodetype_conf_detail,
+ name='gstudio_nodetype_detail'),
+ url(r'^(?P<object_id>\d+)/$',
+ 'nodetype_shortlink',
+ name='gstudio_nodetype_shortlink'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/quick_nodetype.py b/build/lib.linux-i686-2.6/gstudio/urls/quick_nodetype.py
new file mode 100644
index 0000000..fb613cf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/quick_nodetype.py
@@ -0,0 +1,25 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Url for the Gstudio quick nodetype view"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('gstudio.views.quick_nodetype',
+ url(r'^quick_nodetype/$', 'view_quick_nodetype',
+ name='gstudio_nodetype_quick_post')
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/search.py b/build/lib.linux-i686-2.6/gstudio/urls/search.py
new file mode 100644
index 0000000..4b52cb9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/search.py
@@ -0,0 +1,24 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Gstudio search"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('gstudio.views.search',
+ url(r'^$', 'nodetype_search', name='gstudio_nodetype_search'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/sitemap.py b/build/lib.linux-i686-2.6/gstudio/urls/sitemap.py
new file mode 100644
index 0000000..c88d024
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/sitemap.py
@@ -0,0 +1,9 @@
+"""Urls for the Gstudio sitemap"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('gstudio.views.sitemap',
+ url(r'^$', 'sitemap',
+ {'template': 'gstudio/sitemap.html'},
+ name='gstudio_sitemap'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/tags.py b/build/lib.linux-i686-2.6/gstudio/urls/tags.py
new file mode 100644
index 0000000..112f846
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/tags.py
@@ -0,0 +1,29 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Gstudio tags"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('gstudio.views.tags',
+ url(r'^$', 'tag_list',
+ name='gstudio_tag_list'),
+ url(r'^(?P<tag>[^/]+(?u))/$', 'tag_detail',
+ name='gstudio_tag_detail'),
+ url(r'^(?P<tag>[^/]+(?u))/page/(?P<page>\d+)/$',
+ 'tag_detail', name='gstudio_tag_detail_paginated'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/urls/trackback.py b/build/lib.linux-i686-2.6/gstudio/urls/trackback.py
new file mode 100644
index 0000000..898e344
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/urls/trackback.py
@@ -0,0 +1,25 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Gstudio trackback"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('gstudio.views.trackback',
+ url(r'^(?P<object_id>\d+)/$', 'nodetype_trackback',
+ name='gstudio_nodetype_trackback'),
+ )
diff --git a/build/lib.linux-i686-2.6/gstudio/views/__init__.py b/build/lib.linux-i686-2.6/gstudio/views/__init__.py
new file mode 100644
index 0000000..6c98e2b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/__init__.py
@@ -0,0 +1 @@
+"""Views for Gstudio"""
diff --git a/build/lib.linux-i686-2.6/gstudio/views/add.py b/build/lib.linux-i686-2.6/gstudio/views/add.py
new file mode 100644
index 0000000..f222752
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/add.py
@@ -0,0 +1,219 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""Views for Gstudio forms"""
+from django.http import HttpResponse
+from django.http import HttpResponseRedirect
+from django.template import RequestContext
+from django.shortcuts import render_to_response
+from datetime import datetime
+from gstudio.forms import *
+
+
+def addmetatype(request):
+ if request.method == 'POST':
+ formset = MetatypeForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/nodetypes/")
+
+
+
+ else:
+
+ formset = MetatypeForm()
+
+
+ variables = RequestContext(request,{'formset':formset})
+ template = "gstudioforms/gstudiometatypeform.html"
+ return render_to_response(template, variables)
+
+
+
+def addobjecttype(request):
+ if request.method == 'POST':
+ formset = ObjecttypeForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/nodetypes/")
+
+
+
+ else:
+
+ formset = ObjecttypeForm()
+
+ template = "gstudioforms/gstudioobjecttypeform.html"
+ variables = RequestContext(request,{'formset':formset})
+ return render_to_response(template, variables)
+
+def addrelationtype(request):
+ if request.method == 'POST':
+ formset = RelationtypeForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/nodetypes/")
+
+
+ else:
+
+ formset = RelationtypeForm()
+
+ template = "gstudioforms/gstudiorelationtypeform.html"
+ variables = RequestContext(request,{'formset':formset})
+ return render_to_response(template, variables)
+
+
+def addattributetype(request):
+ if request.method == 'POST':
+ formset = AttributetypeForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/nodetypes/")
+
+
+ else:
+
+ formset = AttributetypeForm()
+
+ template = "gstudioforms/gstudioattributetypeform.html"
+ variables = RequestContext(request,{'formset':formset})
+ return render_to_response(template, variables)
+
+
+def addsystemtype(request):
+ if request.method == 'POST':
+ formset = SystemtypeForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/nodetypes/")
+
+
+ else:
+
+ formset = SystemtypeForm()
+
+ template = "gstudioforms/gstudiosystemtypeform.html"
+ variables = RequestContext(request,{'formset':formset})
+ return render_to_response(template, variables)
+
+def addprocesstype(request):
+ if request.method == 'POST':
+ formset = ProcesstypeForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/nodetypes/")
+
+
+ else:
+
+ formset = ProcesstypeForm()
+
+ template = "gstudioforms/gstudioprocesstypeform.html"
+ variables = RequestContext(request,{'formset':formset})
+ return render_to_response(template, variables)
+
+def addattribute(request):
+ if request.method == 'POST':
+ formset = AttributeForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/nodetypes/")
+
+
+ else:
+
+ formset = AttributeForm()
+
+ template = "gstudioforms/gstudioattributeform.html"
+ variables = RequestContext(request,{'formset':formset})
+ return render_to_response(template, variables)
+
+def addrelation(request):
+ if request.method == 'POST':
+ formset = RelationForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/nodetypes/")
+
+
+ else:
+
+ formset = RelationForm()
+
+ template = "gstudioforms/gstudiorelationform.html"
+ variables = RequestContext(request,{'formset':formset})
+ return render_to_response(template, variables)
+
+def addcomplement(request):
+ if request.method == 'POST':
+ formset = ComplementForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/nodetypes/")
+
+
+ else:
+
+ formset = ComplementForm()
+
+ template = "gstudioforms/gstudiocomplementform.html"
+ variables = RequestContext(request,{'formset':formset})
+ return render_to_response(template, variables)
+
+def addunion(request):
+ if request.method == 'POST':
+ formset = UnionForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/nodetypes/")
+
+
+ else:
+
+ formset = UnionForm()
+
+ template = "gstudioforms/gstudiounionform.html"
+ variables = RequestContext(request,{'formset':formset})
+ return render_to_response(template, variables)
+
+def addintersection(request):
+ if request.method == 'POST':
+ formset = IntersectionForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/nodetypes/")
+
+
+ else:
+
+ formset = IntersectionForm()
+
+ template = "gstudioforms/gstudiointersectionform.html"
+ variables = RequestContext(request,{'formset':formset})
+ return render_to_response(template, variables)
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/views/ajaxviews.py b/build/lib.linux-i686-2.6/gstudio/views/ajaxviews.py
new file mode 100644
index 0000000..2bb64a3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/ajaxviews.py
@@ -0,0 +1,47 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+from django.http import HttpResponse
+import json
+from gstudio.models import *
+from objectapp.models import *
+
+def AjaxAttribute(request):
+ iden = request.GET["id"]
+ attr = Attributetype.objects.get(id=iden)
+ subjecttype = attr.subjecttype
+ returndict = {}
+
+ for each in Objecttype.objects.all():
+ if attr.subjecttype.id == each.id:
+ for member in each.get_members:
+ returndict[member.id] = member.title
+ jsonobject = json.dumps(returndict)
+ return HttpResponse(jsonobject, "application/json")
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/views/authors.py b/build/lib.linux-i686-2.6/gstudio/views/authors.py
new file mode 100644
index 0000000..e4459b3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/authors.py
@@ -0,0 +1,45 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Gstudio authors"""
+from django.shortcuts import get_object_or_404
+from django.views.generic.list_detail import object_list
+
+from gstudio.models import Author
+from gstudio.settings import PAGINATION
+from gstudio.views.decorators import update_queryset
+from gstudio.views.decorators import template_name_for_nodetype_queryset_filtered
+
+
+author_list = update_queryset(object_list, Author.published.all)
+
+
+def author_detail(request, username, page=None, **kwargs):
+ """Display the nodetypes of an author"""
+ extra_context = kwargs.pop('extra_context', {})
+
+ author = get_object_or_404(Author, username=username)
+ if not kwargs.get('template_name'):
+ kwargs['template_name'] = template_name_for_nodetype_queryset_filtered(
+ 'author', author.username)
+
+ extra_context.update({'author': author})
+ kwargs['extra_context'] = extra_context
+
+ return object_list(request, queryset=author.nodetypes_published(),
+ paginate_by=PAGINATION, page=page,
+ **kwargs)
diff --git a/build/lib.linux-i686-2.6/gstudio/views/channels.py b/build/lib.linux-i686-2.6/gstudio/views/channels.py
new file mode 100644
index 0000000..f4e74c5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/channels.py
@@ -0,0 +1,28 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Gstudio channels"""
+from django.views.generic.list_detail import object_list
+
+from gstudio.models import Nodetype
+
+
+def nodetype_channel(request, query, *ka, **kw):
+ """Display a custom selection of nodetypes"""
+ queryset = Nodetype.published.search(query)
+ return object_list(request, queryset=queryset,
+ *ka, **kw)
diff --git a/build/lib.linux-i686-2.6/gstudio/views/decorators.py b/build/lib.linux-i686-2.6/gstudio/views/decorators.py
new file mode 100644
index 0000000..2b053f0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/decorators.py
@@ -0,0 +1,152 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+
+"""Decorators for gstudio.views"""
+from functools import wraps
+
+from django.template import RequestContext
+from django.contrib.auth.views import login
+from django.shortcuts import redirect
+from django.shortcuts import get_object_or_404
+from django.shortcuts import render_to_response
+from django.template.loader import get_template
+from django.template import TemplateDoesNotExist
+from django.views.decorators.csrf import csrf_protect
+from django.views.decorators.cache import never_cache
+
+
+def update_queryset(view, queryset,
+ queryset_parameter='queryset'):
+ """Decorator around views based on a queryset
+ passed in parameter, who will force the update
+ of the queryset before executing the view.
+ Related to issue http://code.djangoproject.com/ticket/8378"""
+
+ @wraps(view)
+ def wrapper(*args, **kwargs):
+ """Regenerate the queryset before passing it to the view."""
+ kwargs[queryset_parameter] = queryset()
+ return view(*args, **kwargs)
+
+ return wrapper
+
+
+@csrf_protect
+@never_cache
+def password(request, nodetype):
+ """Displays the password form and handle validation
+ by setting the valid password in a cookie."""
+ error = False
+ if request.method == 'POST':
+ if request.POST.get('password') == nodetype.password:
+ request.session[
+ 'gstudio_nodetype_%s_password' % nodetype.pk] = nodetype.password
+ return redirect(nodetype)
+ error = True
+ return render_to_response('gstudio/password.html', {'error': error},
+ context_instance=RequestContext(request))
+
+
+def protect_nodetype(view):
+ """Decorator performing a security check if needed
+ around the generic.date_based.nodetype_detail view
+ and specify the template used to render the nodetype"""
+
+ @wraps(view)
+ def wrapper(*ka, **kw):
+ """Do security check and retrieve the template"""
+ request = ka[0]
+ nodetype = get_object_or_404(kw['queryset'], slug=kw['slug'],
+ creation_date__year=kw['year'],
+ creation_date__month=kw['month'],
+ creation_date__day=kw['day'])
+
+ if nodetype.login_required and not request.user.is_authenticated():
+ return login(request, 'gstudio/login.html')
+ if nodetype.password and nodetype.password != \
+ request.session.get('gstudio_nodetype_%s_password' % nodetype.pk):
+ return password(request, nodetype)
+ kw['template_name'] = nodetype.template
+ return view(*ka, **kw)
+
+ return wrapper
+
+
+def template_name_for_nodetype_queryset_filtered(model_type, model_name):
+ """Return a custom template name for views
+ returning a queryset of Nodetype filtered by another model."""
+ template_name_list = (
+ 'gstudio/%s/%s/nodetype_list.html' % (model_type, model_name),
+ 'gstudio/%s/%s_nodetype_list.html' % (model_type, model_name),
+ 'gstudio/%s/nodetype_list.html' % model_type,
+ 'gstudio/nodetype_list.html')
+
+ for template_name in template_name_list:
+ try:
+ get_template(template_name)
+ return template_name
+ except TemplateDoesNotExist:
+ continue
diff --git a/build/lib.linux-i686-2.6/gstudio/views/graphs.py b/build/lib.linux-i686-2.6/gstudio/views/graphs.py
new file mode 100644
index 0000000..1adffec
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/graphs.py
@@ -0,0 +1,118 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Views for Gstudio nodetypes"""
+from django.shortcuts import redirect
+from django.shortcuts import render_to_response
+from django.shortcuts import get_object_or_404
+from django.http import HttpResponse
+from gstudio.gnowql import *
+#import networkx as nx
+#import d3
+import json
+import os
+
+from gstudio.views.decorators import protect_nodetype
+from gstudio.views.decorators import update_queryset
+
+def graph_json(request, node_id):
+
+ if(node_id=='189087228'):
+ jsonFile = open( os.path.join(os.path.dirname(__file__), '../static/gstudio/js/egonet.json'), "r")
+ #testjson = json.loads(jsonFile)
+
+ return HttpResponse(str(jsonFile.read()), "application/json")
+
+ try:
+ node = NID.objects.get(id=node_id)
+ node = node.ref
+ except:
+ return HttpResponse("Node not found.", "text/html")
+
+ return HttpResponse(node.get_graph_json(), "application/json")
+
+def force_graph(request, node_id):
+ return render_to_response('gstudio/graph1.html',{'node_id': node_id })
+
+
+#node = get_node(str(object_id))
+#ot = Objecttype.objects.get(title='place')
+#G = ot.get_radial_graph_json()
+#
+# G = nx.DiGraph()
+#
+# G.add_node(node)
+#
+# for key in node.get_nbh.keys():
+# # is null
+# if isinstance(node[key],list):
+# G.add_nodes_from(node[key])
+#
+# for item in node[key]:
+# G.add_edge()
+#
+
+
+# return ast(nodetype, permanent=True)
diff --git a/build/lib.linux-i686-2.6/gstudio/views/metatypes.py b/build/lib.linux-i686-2.6/gstudio/views/metatypes.py
new file mode 100644
index 0000000..248347e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/metatypes.py
@@ -0,0 +1,47 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Gstudio metatypes"""
+from django.shortcuts import get_object_or_404
+from django.views.generic.list_detail import object_list
+
+from gstudio.models import Metatype
+from gstudio.settings import PAGINATION
+from gstudio.views.decorators import template_name_for_nodetype_queryset_filtered
+
+
+def get_metatype_or_404(path):
+ """Retrieve a Metatype by a path"""
+ path_bits = [p for p in path.split('/') if p]
+ return get_object_or_404(Metatype, slug=path_bits[-1])
+
+
+def metatype_detail(request, path, page=None, **kwargs):
+ """Display the nodetypes of a metatype"""
+ extra_context = kwargs.pop('extra_context', {})
+
+ metatype = get_metatype_or_404(path)
+ if not kwargs.get('template_name'):
+ kwargs['template_name'] = template_name_for_nodetype_queryset_filtered(
+ 'metatype', metatype.slug)
+
+ extra_context.update({'metatype': metatype})
+ kwargs['extra_context'] = extra_context
+
+ return object_list(request, queryset=metatype.nodetypes_published(),
+ paginate_by=PAGINATION, page=page,
+ **kwargs)
diff --git a/build/lib.linux-i686-2.6/gstudio/views/nodetypes.py b/build/lib.linux-i686-2.6/gstudio/views/nodetypes.py
new file mode 100644
index 0000000..17e36eb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/nodetypes.py
@@ -0,0 +1,97 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Gstudio nodetypes"""
+from django.shortcuts import redirect
+from django.shortcuts import get_object_or_404
+from django.views.generic.list_detail import object_list
+from django.views.generic.date_based import archive_year
+from django.views.generic.date_based import archive_month
+from django.views.generic.date_based import archive_day
+from django.views.generic.date_based import object_detail
+
+from gstudio.models import Nodetype
+from gstudio.views.decorators import protect_nodetype
+from gstudio.views.decorators import update_queryset
+
+
+nodetype_index = update_queryset(object_list, Nodetype.published.all)
+
+nodetype_year = update_queryset(archive_year, Nodetype.published.all)
+
+nodetype_month = update_queryset(archive_month, Nodetype.published.all)
+
+nodetype_day = update_queryset(archive_day, Nodetype.published.all)
+
+nodetype_detail = protect_nodetype(object_detail)
+
+
+def nodetype_shortlink(request, object_id):
+ """
+ Redirect to the 'get_absolute_url' of a nodetype,
+ accordingly to 'object_id' argument
+ """
+ nodetype = get_object_or_404(Nodetype, pk=object_id)
+ return redirect(nodetype, permanent=True)
diff --git a/build/lib.linux-i686-2.6/gstudio/views/quick_nodetype.py b/build/lib.linux-i686-2.6/gstudio/views/quick_nodetype.py
new file mode 100644
index 0000000..825a785
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/quick_nodetype.py
@@ -0,0 +1,119 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Views for Gstudio quick nodetype"""
+from urllib import urlencode
+
+from django import forms
+from django.utils.html import linebreaks
+from django.shortcuts import redirect
+from django.core.urlresolvers import reverse
+from django.contrib.sites.models import Site
+from django.template.defaultfilters import slugify
+from django.utils.encoding import smart_str
+from django.contrib.auth.decorators import permission_required
+
+from gstudio.models import Nodetype
+from gstudio.managers import DRAFT
+from gstudio.managers import PUBLISHED
+
+
+class QuickNodetypeForm(forms.Form):
+ """Form for posting an nodetype quickly"""
+
+ title = forms.CharField(required=True, max_length=255)
+ content = forms.CharField(required=True)
+ tags = forms.CharField(required=False, max_length=255)
+
+
+@permission_required('gstudio.add_nodetype')
+def view_quick_nodetype(request):
+ """View for quickly post an Nodetype"""
+ if request.POST:
+ form = QuickNodetypeForm(request.POST)
+ if form.is_valid():
+ nodetype_dict = form.cleaned_data
+ status = PUBLISHED
+ if 'save_draft' in request.POST:
+ status = DRAFT
+ nodetype_dict['content'] = linebreaks(nodetype_dict['content'])
+ nodetype_dict['slug'] = slugify(nodetype_dict['title'])
+ nodetype_dict['status'] = status
+ nodetype = Nodetype.objects.create(**nodetype_dict)
+ nodetype.sites.add(Site.objects.get_current())
+ nodetype.authors.add(request.user)
+ return redirect(nodetype)
+
+ data = {'title': smart_str(request.POST.get('title', '')),
+ 'content': smart_str(linebreaks(request.POST.get(
+ 'content', ''))),
+ 'tags': smart_str(request.POST.get('tags', '')),
+ 'slug': slugify(request.POST.get('title', '')),
+ 'authors': request.user.pk,
+ 'sites': Site.objects.get_current().pk}
+ return redirect('%s?%s' % (reverse('admin:gstudio_nodetype_add'),
+ urlencode(data)))
+
+ return redirect('admin:gstudio_nodetype_add')
diff --git a/build/lib.linux-i686-2.6/gstudio/views/search.py b/build/lib.linux-i686-2.6/gstudio/views/search.py
new file mode 100644
index 0000000..c8ac954
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/search.py
@@ -0,0 +1,93 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Views for Gstudio nodetypes search"""
+from django.utils.translation import ugettext as _
+from django.views.generic.list_detail import object_list
+
+from gstudio.models import Nodetype
+from gstudio.settings import PAGINATION
+
+
+def nodetype_search(request):
+ """Search nodetypes matching with a pattern"""
+ error = None
+ pattern = None
+ nodetypes = Nodetype.published.none()
+
+ if request.GET:
+ pattern = request.GET.get('pattern', '')
+ if len(pattern) < 3:
+ error = _('The pattern is too short')
+ else:
+ nodetypes = Nodetype.published.search(pattern)
+ else:
+ error = _('No pattern to search found')
+
+ return object_list(request, queryset=nodetypes,
+ paginate_by=PAGINATION,
+ template_name='gstudio/nodetype_search.html',
+ extra_context={'error': error,
+ 'pattern': pattern})
diff --git a/build/lib.linux-i686-2.6/gstudio/views/sitemap.py b/build/lib.linux-i686-2.6/gstudio/views/sitemap.py
new file mode 100644
index 0000000..acdc8a1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/sitemap.py
@@ -0,0 +1,78 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Views for Gstudio sitemap"""
+from django.views.generic.simple import direct_to_template
+
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+
+
+def sitemap(*ka, **kw):
+ """Wrapper around the direct to template generic view to
+ force the update of the extra context"""
+ kw['extra_context'] = {'nodetypes': Nodetype.tree.all(),
+ 'metatypes': Metatype.tree.all()}
+ return direct_to_template(*ka, **kw)
diff --git a/build/lib.linux-i686-2.6/gstudio/views/tags.py b/build/lib.linux-i686-2.6/gstudio/views/tags.py
new file mode 100644
index 0000000..6b53baf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/tags.py
@@ -0,0 +1,98 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Views for Gstudio tags"""
+from django.template import RequestContext
+from django.shortcuts import render_to_response
+from django.template.defaultfilters import slugify
+
+from tagging.models import Tag
+from tagging.views import tagged_object_list
+
+from gstudio.models import Nodetype
+from gstudio.settings import PAGINATION
+
+from gstudio.views.decorators import template_name_for_nodetype_queryset_filtered
+
+
+def tag_list(request, template_name='gstudio/tag_list.html'):
+ """Return the list of published tags with counts,
+ try to simulate an object_list view"""
+ tag_list = Tag.objects.usage_for_queryset(
+ Nodetype.published.all(), counts=True)
+ return render_to_response(template_name, {'object_list': tag_list},
+ context_instance=RequestContext(request))
+
+
+def tag_detail(request, tag, page=None, **kwargs):
+ """Display the nodetypes of a tag"""
+ if not kwargs.get('template_name'):
+ kwargs['template_name'] = template_name_for_nodetype_queryset_filtered(
+ 'tag', slugify(tag))
+
+ return tagged_object_list(request, tag=tag,
+ queryset_or_model=Nodetype.published.all(),
+ paginate_by=PAGINATION, page=page,
+ **kwargs)
diff --git a/build/lib.linux-i686-2.6/gstudio/views/trackback.py b/build/lib.linux-i686-2.6/gstudio/views/trackback.py
new file mode 100644
index 0000000..dbd179f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/trackback.py
@@ -0,0 +1,110 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+"""Views for Gstudio trackback"""
+from django.shortcuts import redirect
+from django.shortcuts import get_object_or_404
+from django.contrib.sites.models import Site
+from django.contrib import comments
+from django.views.decorators.csrf import csrf_exempt
+from django.contrib.contenttypes.models import ContentType
+from django.views.generic.simple import direct_to_template
+
+from gstudio.models import Nodetype
+
+
+@csrf_exempt
+def nodetype_trackback(request, object_id):
+ """Set a TrackBack for a nodetype"""
+ nodetype = get_object_or_404(Nodetype.published, pk=object_id)
+
+ if request.POST.get('url'):
+ error = ''
+ url = request.POST['url']
+ site = Site.objects.get_current()
+
+ if not nodetype.pingback_enabled:
+ error = u'Trackback is not enabled for %s' % nodetype.title
+
+ title = request.POST.get('title') or url
+ excerpt = request.POST.get('excerpt') or title
+ blog_name = request.POST.get('blog_name') or title
+
+ if not error:
+ comment, created = comments.get_model().objects.get_or_create(
+ content_type=ContentType.objects.get_for_model(Nodetype),
+ object_pk=nodetype.pk, site=site, user_url=url,
+ user_name=blog_name, defaults={'comment': excerpt})
+ if created:
+ user = nodetype.authors.all()[0]
+ comment.flags.create(user=user, flag='trackback')
+ else:
+ error = u'Trackback is already registered'
+
+ return direct_to_template(request, 'gstudio/nodetype_trackback.xml',
+ mimetype='text/xml',
+ extra_context={'error': error})
+
+ return redirect(nodetype, permanent=True)
diff --git a/build/lib.linux-i686-2.6/gstudio/views/userdashboard.py b/build/lib.linux-i686-2.6/gstudio/views/userdashboard.py
new file mode 100644
index 0000000..83d32fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/views/userdashboard.py
@@ -0,0 +1,78 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+from django.http import HttpResponse
+from django.http import HttpResponseRedirect
+from django.template import RequestContext
+from django.shortcuts import render_to_response
+
+def userdashboard(request):
+ variables = RequestContext(request)
+ template = "gstudiodashboard/dashboard.html"
+ return render_to_response(template, variables)
+
+
+
+
diff --git a/build/lib.linux-i686-2.6/gstudio/xmlrpc/__init__.py b/build/lib.linux-i686-2.6/gstudio/xmlrpc/__init__.py
new file mode 100644
index 0000000..88ced6b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/xmlrpc/__init__.py
@@ -0,0 +1,81 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""XML-RPC methods for Gstudio"""
+
+
+GSTUDIO_XMLRPC_PINGBACK = [
+ ('gstudio.xmlrpc.pingback.pingback_ping',
+ 'pingback.ping'),
+ ('gstudio.xmlrpc.pingback.pingback_extensions_get_pingbacks',
+ 'pingback.extensions.getPingbacks')]
+
+GSTUDIO_XMLRPC_METAWEBLOG = [
+ ('gstudio.xmlrpc.metaweblog.get_users_blogs',
+ 'blogger.getUsersBlogs'),
+ ('gstudio.xmlrpc.metaweblog.get_user_info',
+ 'blogger.getUserInfo'),
+ ('gstudio.xmlrpc.metaweblog.delete_post',
+ 'blogger.deletePost'),
+ ('gstudio.xmlrpc.metaweblog.get_authors',
+ 'wp.getAuthors'),
+ ('gstudio.xmlrpc.metaweblog.get_metatypes',
+ 'metaWeblog.getMetatypes'),
+ ('gstudio.xmlrpc.metaweblog.new_metatype',
+ 'wp.newMetatype'),
+ ('gstudio.xmlrpc.metaweblog.get_recent_posts',
+ 'metaWeblog.getRecentPosts'),
+ ('gstudio.xmlrpc.metaweblog.get_post',
+ 'metaWeblog.getPost'),
+ ('gstudio.xmlrpc.metaweblog.new_post',
+ 'metaWeblog.newPost'),
+ ('gstudio.xmlrpc.metaweblog.edit_post',
+ 'metaWeblog.editPost'),
+ ('gstudio.xmlrpc.metaweblog.new_media_object',
+ 'metaWeblog.newMediaObject')]
+
+GSTUDIO_XMLRPC_METHODS = GSTUDIO_XMLRPC_PINGBACK + GSTUDIO_XMLRPC_METAWEBLOG
diff --git a/build/lib.linux-i686-2.6/gstudio/xmlrpc/metaweblog.py b/build/lib.linux-i686-2.6/gstudio/xmlrpc/metaweblog.py
new file mode 100644
index 0000000..56ee26c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/xmlrpc/metaweblog.py
@@ -0,0 +1,344 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""XML-RPC methods of Gstudio metaWeblog API"""
+import os
+from datetime import datetime
+from xmlrpclib import Fault
+from xmlrpclib import DateTime
+
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+from django.utils.translation import gettext as _
+from django.utils.html import strip_tags
+from django.utils.text import truncate_words
+from django.core.files.base import ContentFile
+from django.core.files.storage import default_storage
+from django.template.defaultfilters import slugify
+
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+from gstudio.settings import PROTOCOL
+from gstudio.settings import UPLOAD_TO
+from gstudio.managers import DRAFT, PUBLISHED
+from django_xmlrpc.decorators import xmlrpc_func
+
+# http://docs.nucleuscms.org/blog/12#errorcodes
+LOGIN_ERROR = 801
+PERMISSION_DENIED = 803
+
+
+def authenticate(username, password, permission=None):
+ """Authenticate staff_user with permission"""
+ try:
+ user = User.objects.get(username__exact=username)
+ except User.DoesNotExist:
+ raise Fault(LOGIN_ERROR, _('Username is incorrect.'))
+ if not user.check_password(password):
+ raise Fault(LOGIN_ERROR, _('Password is invalid.'))
+ if not user.is_staff or not user.is_active:
+ raise Fault(PERMISSION_DENIED, _('User account unavailable.'))
+ if permission:
+ if not user.has_perm(permission):
+ raise Fault(PERMISSION_DENIED, _('User cannot %s.') % permission)
+ return user
+
+
+def blog_structure(site):
+ """A blog structure"""
+ return {'url': '%s://%s%s' % (
+ PROTOCOL, site.domain, reverse('gstudio_nodetype_archive_index')),
+ 'blogid': settings.SITE_ID,
+ 'blogName': site.name}
+
+
+def user_structure(user, site):
+ """An user structure"""
+ return {'userid': user.pk,
+ 'email': user.email,
+ 'nickname': user.username,
+ 'lastname': user.last_name,
+ 'firstname': user.first_name,
+ 'url': '%s://%s%s' % (
+ PROTOCOL, site.domain,
+ reverse('gstudio_author_detail', args=[user.username]))}
+
+
+def author_structure(user):
+ """An author structure"""
+ return {'user_id': user.pk,
+ 'user_login': user.username,
+ 'display_name': user.username,
+ 'user_email': user.email}
+
+
+def metatype_structure(metatype, site):
+ """A metatype structure"""
+ return {'description': metatype.title,
+ 'htmlUrl': '%s://%s%s' % (
+ PROTOCOL, site.domain,
+ metatype.get_absolute_url()),
+ 'rssUrl': '%s://%s%s' % (
+ PROTOCOL, site.domain,
+ reverse('gstudio_metatype_feed', args=[metatype.tree_path])),
+ # Useful Wordpress Extensions
+ 'metatypeId': metatype.pk,
+ 'parentId': metatype.parent and metatype.parent.pk or 0,
+ 'metatypeDescription': metatype.description,
+ 'metatypeName': metatype.title}
+
+
+def post_structure(nodetype, site):
+ """A post structure with extensions"""
+ author = nodetype.authors.all()[0]
+ return {'title': nodetype.title,
+ 'description': unicode(nodetype.html_content),
+ 'link': '%s://%s%s' % (PROTOCOL, site.domain,
+ nodetype.get_absolute_url()),
+ # Basic Extensions
+ 'permaLink': '%s://%s%s' % (PROTOCOL, site.domain,
+ nodetype.get_absolute_url()),
+ 'metatypes': [cat.title for cat in nodetype.metatypes.all()],
+ 'dateCreated': DateTime(nodetype.creation_date.isoformat()),
+ 'postid': nodetype.pk,
+ 'userid': author.username,
+ # Useful Movable Type Extensions
+ 'mt_excerpt': nodetype.excerpt,
+ 'mt_allow_comments': int(nodetype.comment_enabled),
+ 'mt_allow_pings': int(nodetype.pingback_enabled),
+ 'mt_keywords': nodetype.tags,
+ # Useful Wordpress Extensions
+ 'wp_author': author.username,
+ 'wp_author_id': author.pk,
+ 'wp_author_display_name': author.username,
+ 'wp_password': nodetype.password,
+ 'wp_slug': nodetype.slug,
+ 'sticky': nodetype.featured}
+
+
+@xmlrpc_func(returns='struct[]', args=['string', 'string', 'string'])
+def get_users_blogs(apikey, username, password):
+ """blogger.getUsersBlogs(api_key, username, password)
+ => blog structure[]"""
+ authenticate(username, password)
+ site = Site.objects.get_current()
+ return [blog_structure(site)]
+
+
+@xmlrpc_func(returns='struct', args=['string', 'string', 'string'])
+def get_user_info(apikey, username, password):
+ """blogger.getUserInfo(api_key, username, password)
+ => user structure"""
+ user = authenticate(username, password)
+ site = Site.objects.get_current()
+ return user_structure(user, site)
+
+
+@xmlrpc_func(returns='struct[]', args=['string', 'string', 'string'])
+def get_authors(apikey, username, password):
+ """wp.getAuthors(api_key, username, password)
+ => author structure[]"""
+ authenticate(username, password)
+ return [author_structure(author)
+ for author in User.objects.filter(is_staff=True)]
+
+
+@xmlrpc_func(returns='boolean', args=['string', 'string',
+ 'string', 'string', 'string'])
+def delete_post(apikey, post_id, username, password, publish):
+ """blogger.deletePost(api_key, post_id, username, password, 'publish')
+ => boolean"""
+ user = authenticate(username, password, 'gstudio.delete_nodetype')
+ nodetype = Nodetype.objects.get(id=post_id, authors=user)
+ nodetype.delete()
+ return True
+
+
+@xmlrpc_func(returns='struct', args=['string', 'string', 'string'])
+def get_post(post_id, username, password):
+ """metaWeblog.getPost(post_id, username, password)
+ => post structure"""
+ user = authenticate(username, password)
+ site = Site.objects.get_current()
+ return post_structure(Nodetype.objects.get(id=post_id, authors=user), site)
+
+
+@xmlrpc_func(returns='struct[]',
+ args=['string', 'string', 'string', 'integer'])
+def get_recent_posts(blog_id, username, password, number):
+ """metaWeblog.getRecentPosts(blog_id, username, password, number)
+ => post structure[]"""
+ user = authenticate(username, password)
+ site = Site.objects.get_current()
+ return [post_structure(nodetype, site) \
+ for nodetype in Nodetype.objects.filter(authors=user)[:number]]
+
+
+@xmlrpc_func(returns='struct[]', args=['string', 'string', 'string'])
+def get_metatypes(blog_id, username, password):
+ """metaWeblog.getMetatypes(blog_id, username, password)
+ => metatype structure[]"""
+ authenticate(username, password)
+ site = Site.objects.get_current()
+ return [metatype_structure(metatype, site) \
+ for metatype in Metatype.objects.all()]
+
+
+@xmlrpc_func(returns='string', args=['string', 'string', 'string', 'struct'])
+def new_metatype(blog_id, username, password, metatype_struct):
+ """wp.newMetatype(blog_id, username, password, metatype)
+ => metatype_id"""
+ authenticate(username, password, 'gstudio.add_metatype')
+ metatype_dict = {'title': metatype_struct['name'],
+ 'description': metatype_struct['description'],
+ 'slug': metatype_struct['slug']}
+ if int(metatype_struct['parent_id']):
+ metatype_dict['parent'] = Metatype.objects.get(
+ pk=metatype_struct['parent_id'])
+ metatype = Metatype.objects.create(**metatype_dict)
+
+ return metatype.pk
+
+
+@xmlrpc_func(returns='string', args=['string', 'string', 'string',
+ 'struct', 'boolean'])
+def new_post(blog_id, username, password, post, publish):
+ """metaWeblog.newPost(blog_id, username, password, post, publish)
+ => post_id"""
+ user = authenticate(username, password, 'gstudio.add_nodetype')
+ if post.get('dateCreated'):
+ creation_date = datetime.strptime(
+ post['dateCreated'].value.replace('Z', '').replace('-', ''),
+ '%Y%m%dT%H:%M:%S')
+ else:
+ creation_date = datetime.now()
+
+ nodetype_dict = {'title': post['title'],
+ 'content': post['description'],
+ 'excerpt': post.get('mt_excerpt', truncate_words(
+ strip_tags(post['description']), 50)),
+ 'creation_date': creation_date,
+ 'last_update': creation_date,
+ 'comment_enabled': post.get('mt_allow_comments', 1) == 1,
+ 'pingback_enabled': post.get('mt_allow_pings', 1) == 1,
+ 'featured': post.get('sticky', 0) == 1,
+ 'tags': 'mt_keywords' in post and post['mt_keywords'] or '',
+ 'slug': 'wp_slug' in post and post['wp_slug'] or slugify(
+ post['title']),
+ 'password': post.get('wp_password', ''),
+ 'status': publish and PUBLISHED or DRAFT}
+ nodetype = Nodetype.objects.create(**nodetype_dict)
+
+ author = user
+ if 'wp_author_id' in post and user.has_perm('gstudio.can_change_author'):
+ if int(post['wp_author_id']) != user.pk:
+ author = User.objects.get(pk=post['wp_author_id'])
+ nodetype.authors.add(author)
+
+ nodetype.sites.add(Site.objects.get_current())
+ if 'metatypes' in post:
+ nodetype.metatypes.add(*[Metatype.objects.get_or_create(
+ title=cat, slug=slugify(cat))[0]
+ for cat in post['metatypes']])
+
+ return nodetype.pk
+
+
+@xmlrpc_func(returns='boolean', args=['string', 'string', 'string',
+ 'struct', 'boolean'])
+def edit_post(post_id, username, password, post, publish):
+ """metaWeblog.editPost(post_id, username, password, post, publish)
+ => boolean"""
+ user = authenticate(username, password, 'gstudio.change_nodetype')
+ nodetype = Nodetype.objects.get(id=post_id, authors=user)
+ if post.get('dateCreated'):
+ creation_date = datetime.strptime(
+ post['dateCreated'].value.replace('Z', '').replace('-', ''),
+ '%Y%m%dT%H:%M:%S')
+ else:
+ creation_date = nodetype.creation_date
+
+ nodetype.title = post['title']
+ nodetype.content = post['description']
+ nodetype.excerpt = post.get('mt_excerpt', truncate_words(
+ strip_tags(post['description']), 50))
+ nodetype.creation_date = creation_date
+ nodetype.last_update = datetime.now()
+ nodetype.comment_enabled = post.get('mt_allow_comments', 1) == 1
+ nodetype.pingback_enabled = post.get('mt_allow_pings', 1) == 1
+ nodetype.featured = post.get('sticky', 0) == 1
+ nodetype.tags = 'mt_keywords' in post and post['mt_keywords'] or ''
+ nodetype.slug = 'wp_slug' in post and post['wp_slug'] or slugify(
+ post['title'])
+ nodetype.status = publish and PUBLISHED or DRAFT
+ nodetype.password = post.get('wp_password', '')
+ nodetype.save()
+
+ if 'wp_author_id' in post and user.has_perm('gstudio.can_change_author'):
+ if int(post['wp_author_id']) != user.pk:
+ author = User.objects.get(pk=post['wp_author_id'])
+ nodetype.authors.clear()
+ nodetype.authors.add(author)
+
+ if 'metatypes' in post:
+ nodetype.metatypes.clear()
+ nodetype.metatypes.add(*[Metatype.objects.get_or_create(
+ title=cat, slug=slugify(cat))[0]
+ for cat in post['metatypes']])
+ return True
+
+
+@xmlrpc_func(returns='struct', args=['string', 'string', 'string', 'struct'])
+def new_media_object(blog_id, username, password, media):
+ """metaWeblog.newMediaObject(blog_id, username, password, media)
+ => media structure"""
+ authenticate(username, password)
+ path = default_storage.save(os.path.join(UPLOAD_TO, media['name']),
+ ContentFile(media['bits'].data))
+ return {'url': default_storage.url(path)}
diff --git a/build/lib.linux-i686-2.6/gstudio/xmlrpc/pingback.py b/build/lib.linux-i686-2.6/gstudio/xmlrpc/pingback.py
new file mode 100644
index 0000000..44aaafd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/gstudio/xmlrpc/pingback.py
@@ -0,0 +1,140 @@
+"""XML-RPC methods of Gstudio Pingback"""
+from urllib2 import urlopen
+from urllib2 import URLError
+from urllib2 import HTTPError
+from urlparse import urlsplit
+
+from django.contrib import comments
+from django.utils.html import strip_tags
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import resolve
+from django.core.urlresolvers import Resolver404
+from django.utils.translation import ugettext as _
+from django.contrib.contenttypes.models import ContentType
+
+from gstudio.models import Nodetype
+from gstudio.settings import PINGBACK_CONTENT_LENGTH
+from BeautifulSoup import BeautifulSoup
+from django_xmlrpc.decorators import xmlrpc_func
+
+UNDEFINED_ERROR = 0
+SOURCE_DOES_NOT_EXIST = 16
+SOURCE_DOES_NOT_LINK = 17
+TARGET_DOES_NOT_EXIST = 32
+TARGET_IS_NOT_PINGABLE = 33
+PINGBACK_ALREADY_REGISTERED = 48
+
+
+def generate_pingback_content(soup, target, max_length, trunc_char='...'):
+ """Generate a description text for the pingback"""
+ link = soup.find('a', href=target)
+
+ content = strip_tags(unicode(link.findParent()))
+ index = content.index(link.string)
+
+ if len(content) > max_length:
+ middle = max_length / 2
+ start = index - middle
+ end = index + middle
+
+ if start <= 0:
+ end -= start
+ extract = content[0:end]
+ else:
+ extract = '%s%s' % (trunc_char, content[start:end])
+
+ if end < len(content):
+ extract += trunc_char
+ return extract
+
+ return content
+
+
+@xmlrpc_func(returns='string', args=['string', 'string'])
+def pingback_ping(source, target):
+ """pingback.ping(sourceURI, targetURI) => 'Pingback message'
+
+ Notifies the server that a link has been added to sourceURI,
+ pointing to targetURI.
+
+ See: http://hixie.ch/specs/pingback/pingback-1.0"""
+ try:
+ if source == target:
+ return UNDEFINED_ERROR
+
+ site = Site.objects.get_current()
+ try:
+ document = ''.join(urlopen(source).readlines())
+ except (HTTPError, URLError):
+ return SOURCE_DOES_NOT_EXIST
+
+ if not target in document:
+ return SOURCE_DOES_NOT_LINK
+
+ scheme, netloc, path, query, fragment = urlsplit(target)
+ if netloc != site.domain:
+ return TARGET_DOES_NOT_EXIST
+
+ try:
+ view, args, kwargs = resolve(path)
+ except Resolver404:
+ return TARGET_DOES_NOT_EXIST
+
+ try:
+ nodetype = Nodetype.published.get(
+ slug=kwargs['slug'],
+ creation_date__year=kwargs['year'],
+ creation_date__month=kwargs['month'],
+ creation_date__day=kwargs['day'])
+ if not nodetype.pingback_enabled:
+ return TARGET_IS_NOT_PINGABLE
+ except (KeyError, Nodetype.DoesNotExist):
+ return TARGET_IS_NOT_PINGABLE
+
+ soup = BeautifulSoup(document)
+ title = soup.find('title')
+ title = title and strip_tags(title) or _('No title')
+ description = generate_pingback_content(soup, target,
+ PINGBACK_CONTENT_LENGTH)
+
+ comment, created = comments.get_model().objects.get_or_create(
+ content_type=ContentType.objects.get_for_model(Nodetype),
+ object_pk=nodetype.pk, user_url=source, site=site,
+ defaults={'comment': description, 'user_name': title})
+ if created:
+ user = nodetype.authors.all()[0]
+ comment.flags.create(user=user, flag='pingback')
+ return 'Pingback from %s to %s registered.' % (source, target)
+ return PINGBACK_ALREADY_REGISTERED
+ except:
+ return UNDEFINED_ERROR
+
+
+@xmlrpc_func(returns='string[]', args=['string'])
+def pingback_extensions_get_pingbacks(target):
+ """pingback.extensions.getPingbacks(url) => '[url, url, ...]'
+
+ Returns an array of URLs that link to the specified url.
+
+ See: http://www.aquarionics.com/misc/archives/blogite/0198.html"""
+ site = Site.objects.get_current()
+
+ scheme, netloc, path, query, fragment = urlsplit(target)
+ if netloc != site.domain:
+ return TARGET_DOES_NOT_EXIST
+
+ try:
+ view, args, kwargs = resolve(path)
+ except Resolver404:
+ return TARGET_DOES_NOT_EXIST
+
+ try:
+ nodetype = Nodetype.published.get(
+ slug=kwargs['slug'],
+ creation_date__year=kwargs['year'],
+ creation_date__month=kwargs['month'],
+ creation_date__day=kwargs['day'])
+ except (KeyError, Nodetype.DoesNotExist):
+ return TARGET_IS_NOT_PINGABLE
+
+ return [pingback.user_url for pingback in nodetype.pingbacks]
diff --git a/build/lib.linux-i686-2.6/objectapp/__init__.py b/build/lib.linux-i686-2.6/objectapp/__init__.py
new file mode 100644
index 0000000..2a57f36
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/__init__.py
@@ -0,0 +1,55 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Objectapp"""
+__version__ = '0.3.dev'
+__license__ = 'BSD License'
+
+__author__ = 'Nagarjuna G.'
+__email__ = 'nagarjun@gnowledge.org'
+
+__url__ = 'http://github.com/gnowgi/django-gstudio'
diff --git a/build/lib.linux-i686-2.6/objectapp/admin/__init__.py b/build/lib.linux-i686-2.6/objectapp/admin/__init__.py
new file mode 100644
index 0000000..01c0450
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/admin/__init__.py
@@ -0,0 +1,79 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Admin of Objectapp"""
+from django.contrib import admin
+
+from objectapp.models import Gbobject
+from objectapp.models import Process
+from objectapp.models import System
+
+from objectapp.admin.gbobject import GbobjectAdmin
+from objectapp.admin.process import ProcessAdmin
+from objectapp.admin.system import SystemAdmin
+
+admin.site.register(Gbobject, GbobjectAdmin)
+admin.site.register(Process, ProcessAdmin)
+admin.site.register(System, SystemAdmin)
+
diff --git a/build/lib.linux-i686-2.6/objectapp/admin/forms.py b/build/lib.linux-i686-2.6/objectapp/admin/forms.py
new file mode 100644
index 0000000..c21e4e5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/admin/forms.py
@@ -0,0 +1,153 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Forms for Objectapp admin"""
+from django import forms
+from django.db.models import ManyToOneRel
+from django.db.models import ManyToManyRel
+from django.contrib.sites.models import Site
+from django.utils.translation import ugettext_lazy as _
+from django.contrib.admin.widgets import RelatedFieldWidgetWrapper
+
+import reversion
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.models import System
+from objectapp.models import Process
+from objectapp.models import Systemtype
+from gstudio.models import Edge
+from gstudio.models import Node
+from gstudio.models import Relation
+from gstudio.models import Attribute
+from gstudio.models import Processtype
+from gstudio.models import Nodetype
+from gstudio.models import Metatype
+
+from objectapp.admin.widgets import TreeNodeChoiceField
+from objectapp.admin.widgets import MPTTFilteredSelectMultiple
+from objectapp.admin.widgets import MPTTModelMultipleChoiceField
+
+
+class ProcessAdminForm(forms.ModelForm):
+
+ class Meta:
+ """SystemAdminForm's Meta"""
+ model = Process
+
+class SystemAdminForm(forms.ModelForm):
+
+ class Meta:
+ """SystemAdminForm's Meta"""
+ model = System
+
+
+
+class ObjecttypeAdminForm(forms.ModelForm):
+ """Form for Objecttype's Admin"""
+ parent = TreeNodeChoiceField(
+ label=_('parent Objecttype').capitalize(),
+ required=False, empty_label=_('No parent Objecttype'),
+ queryset=Objecttype.tree.all())
+
+ def __init__(self, *args, **kwargs):
+ super(ObjecttypeAdminForm, self).__init__(*args, **kwargs)
+ rel = ManyToOneRel(Objecttype, 'id')
+ self.fields['parent'].widget = RelatedFieldWidgetWrapper(
+ self.fields['parent'].widget, rel, self.admin_site)
+
+ def clean_parent(self):
+ """Check if Objecttype parent is not selfish"""
+ data = self.cleaned_data['parent']
+ if data == self.instance:
+ raise forms.ValidationError(
+ _('A Objecttype cannot be parent of itself.'))
+ return data
+
+ class Meta:
+ """ObjecttypeAdminForm's Meta"""
+ model = Objecttype
+
+
+class GbobjectAdminForm(forms.ModelForm):
+ """Form for Gbobject's Admin"""
+ objecttypes = MPTTModelMultipleChoiceField(
+ label=_('Objecttypes'), required=False,
+ queryset=Objecttype.objects.all(),
+ widget=MPTTFilteredSelectMultiple(_('objecttypes'), False,
+ attrs={'rows': '10'}))
+
+
+ def __init__(self, *args, **kwargs):
+ super(GbobjectAdminForm, self).__init__(*args, **kwargs)
+ rel = ManyToManyRel(Objecttype, 'id')
+
+ self.fields['objecttypes'].widget = RelatedFieldWidgetWrapper(
+ self.fields['objecttypes'].widget, rel, self.admin_site)
+
+
+ self.fields['sites'].initial = [Site.objects.get_current()]
+
+ class Meta:
+ """GbobjectAdminForm's Meta"""
+ model = Gbobject
diff --git a/build/lib.linux-i686-2.6/objectapp/admin/gbobject.py b/build/lib.linux-i686-2.6/objectapp/admin/gbobject.py
new file mode 100644
index 0000000..1d4e10b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/admin/gbobject.py
@@ -0,0 +1,379 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""GbobjectAdmin for Objectapp"""
+from datetime import datetime
+
+from django.forms import Media
+from django.contrib import admin
+from django.contrib.auth.models import User
+from django.utils.html import strip_tags
+from django.utils.text import truncate_words
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+from django.conf import settings as project_settings
+from django.utils.translation import ugettext_lazy as _
+from django.core.urlresolvers import reverse, NoReverseMatch
+import reversion
+from tagging.models import Tag
+
+from objectapp import settings
+from objectapp.managers import HIDDEN
+from objectapp.managers import PUBLISHED
+from objectapp.ping import DirectoryPinger
+from objectapp.admin.forms import GbobjectAdminForm
+
+
+class GbobjectAdmin(reversion.VersionAdmin):
+ """Admin for Gbobject model"""
+ form = GbobjectAdminForm
+ date_hierarchy = 'creation_date'
+ fieldsets = ((_('Content'), {'fields': ('title', 'altnames', 'objecttypes','content',
+ 'image', 'status')}),
+ (_('Dependency'), {'fields': ('prior_nodes', 'posterior_nodes',),
+ 'classes': ('collapse', 'collapse-closed')}),
+
+ (_('Options'), {'fields': ('featured', 'excerpt', 'template',
+ 'authors',
+ 'rurl',
+ 'creation_date',
+ 'start_publication',
+ 'end_publication'),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Privacy'), {'fields': ('password', 'login_required',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Discussion'), {'fields': ('comment_enabled',
+ 'pingback_enabled')}),
+ (_('Publication'), {'fields': ( 'tags',
+ 'sites', 'slug')}))
+ list_filter = ('objecttypes', 'authors', 'status', 'featured',
+ 'login_required', 'comment_enabled', 'pingback_enabled',
+ 'creation_date', 'start_publication',
+ 'end_publication', 'sites')
+ list_display = ('get_title', 'get_authors', 'get_objecttypes',
+ 'get_tags', 'get_sites',
+ 'get_comments_are_open', 'pingback_enabled',
+ 'get_is_actual', 'get_is_visible', 'get_link',
+ 'get_short_url', 'creation_date')
+ radio_fields = {'template': admin.VERTICAL}
+ filter_horizontal = ('objecttypes', 'authors')
+ prepopulated_fields = {'slug': ('title', )}
+ search_fields = ('title', 'excerpt', 'content', 'tags')
+ actions = ['make_mine', 'make_published', 'make_hidden',
+ 'close_comments', 'close_pingbacks',
+ 'ping_directories', 'make_tweet', 'put_on_top']
+ actions_on_top = True
+ actions_on_bottom = True
+
+ def __init__(self, model, admin_site):
+ self.form.admin_site = admin_site
+ super(GbobjectAdmin, self).__init__(model, admin_site)
+
+ # Custom Display
+ def get_title(self, gbobject):
+ """Return the title with word count and number of comments"""
+ title = _('%(title)s (%(word_count)i words)') % \
+ {'title': gbobject.title, 'word_count': gbobject.word_count}
+ comments = gbobject.comments.count()
+ if comments:
+ return _('%(title)s (%(comments)i comments)') % \
+ {'title': title, 'comments': comments}
+ return title
+ get_title.short_description = _('title')
+
+ def get_authors(self, gbobject):
+ """Return the authors in HTML"""
+ try:
+ authors = ['<a href="%s" target="blank">%s</a>' %
+ (reverse('objectapp_author_detail',
+ args=[author.username]),
+ author.username) for author in gbobject.authors.all()]
+ except NoReverseMatch:
+ authors = [author.username for author in gbobject.authors.all()]
+ return ', '.join(authors)
+ get_authors.allow_tags = True
+ get_authors.short_description = _('author(s)')
+
+ def get_objecttypes(self, gbobject):
+ """Return the objecttypes linked in HTML"""
+ try:
+ objecttypes = ['<a href="%s" target="blank">%s</a>' %
+ (Objecttype.get_absolute_url(), Objecttype.title)
+ for Objecttype in gbobject.objecttypes.all()]
+ except NoReverseMatch:
+ objecttypes = [Objecttype.title for Objecttype in
+ gbobject.objecttypes.all()]
+ return ', '.join(objecttypes)
+ get_objecttypes.allow_tags = True
+ get_objecttypes.short_description = _('Objecttype(s)')
+
+ def get_tags(self, gbobject):
+ """Return the tags linked in HTML"""
+ try:
+ return ', '.join(['<a href="%s" target="blank">%s</a>' %
+ (reverse('objectapp_tag_detail',
+ args=[tag.name]), tag.name)
+ for tag in Tag.objects.get_for_object(gbobject)])
+ except NoReverseMatch:
+ return gbobject.tags
+ get_tags.allow_tags = True
+ get_tags.short_description = _('tag(s)')
+
+ def get_sites(self, gbobject):
+ """Return the sites linked in HTML"""
+ return ', '.join(
+ ['<a href="http://%(domain)s" target="blank">%(name)s</a>' %
+ site.__dict__ for site in gbobject.sites.all()])
+ get_sites.allow_tags = True
+ get_sites.short_description = _('site(s)')
+
+ def get_comments_are_open(self, gbobject):
+ """Admin wrapper for gbobject.comments_are_open"""
+ return gbobject.comments_are_open
+ get_comments_are_open.boolean = True
+ get_comments_are_open.short_description = _('comment enabled')
+
+ def get_is_actual(self, gbobject):
+ """Admin wrapper for gbobject.is_actual"""
+ return gbobject.is_actual
+ get_is_actual.boolean = True
+ get_is_actual.short_description = _('is actual')
+
+ def get_is_visible(self, gbobject):
+ """Admin wrapper for gbobject.is_visible"""
+ return gbobject.is_visible
+ get_is_visible.boolean = True
+ get_is_visible.short_description = _('is visible')
+
+ def get_link(self, gbobject):
+ """Return a formated link to the gbobject"""
+ return u'<a href="%s" target="blank">%s</a>' % (
+ gbobject.get_absolute_url(), _('View'))
+ get_link.allow_tags = True
+ get_link.short_description = _('View on site')
+
+ def get_short_url(self, gbobject):
+ """Return the short url in HTML"""
+ short_url = gbobject.short_url
+ if not short_url:
+ return _('Unavailable')
+ return '<a href="%(url)s" target="blank">%(url)s</a>' % \
+ {'url': short_url}
+ get_short_url.allow_tags = True
+ get_short_url.short_description = _('short url')
+
+ # Custom Methods
+ def save_model(self, request, gbobject, form, change):
+ """Save the authors, update time, make an excerpt"""
+ if not form.cleaned_data.get('excerpt') and gbobject.status == PUBLISHED:
+ gbobject.excerpt = truncate_words(strip_tags(gbobject.content), 50)
+
+ if gbobject.pk and not request.user.has_perm('objectapp.can_change_author'):
+ form.cleaned_data['authors'] = gbobject.authors.all()
+
+ if not form.cleaned_data.get('authors'):
+ form.cleaned_data['authors'].append(request.user)
+
+ gbobject.last_update = datetime.now()
+ gbobject.save()
+
+ def queryset(self, request):
+ """Make special filtering by user permissions"""
+ queryset = super(GbobjectAdmin, self).queryset(request)
+ if request.user.has_perm('objectapp.can_view_all'):
+ return queryset
+ return request.user.gbobjects.all()
+
+ def formfield_for_manytomany(self, db_field, request, **kwargs):
+ """Filters the disposable authors"""
+ if db_field.name == 'authors':
+ if request.user.has_perm('objectapp.can_change_author'):
+ kwargs['queryset'] = User.objects.filter(is_staff=True)
+ else:
+ kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
+
+ return super(GbobjectAdmin, self).formfield_for_manytomany(
+ db_field, request, **kwargs)
+
+ def get_actions(self, request):
+ """Define user actions by permissions"""
+ actions = super(GbobjectAdmin, self).get_actions(request)
+ if not request.user.has_perm('objectapp.can_change_author') \
+ or not request.user.has_perm('objectapp.can_view_all'):
+ del actions['make_mine']
+ if not settings.PING_DIRECTORIES:
+ del actions['ping_directories']
+ if not settings.USE_TWITTER:
+ del actions['make_tweet']
+
+ return actions
+
+ # Custom Actions
+ def make_mine(self, request, queryset):
+ """Set the gbobjects to the user"""
+ for gbobject in queryset:
+ if request.user not in gbobject.authors.all():
+ gbobject.authors.add(request.user)
+ self.message_user(
+ request, _('The selected gbobjects now belong to you.'))
+ make_mine.short_description = _('Set the gbobjects to the user')
+
+ def make_published(self, request, queryset):
+ """Set gbobjects selected as published"""
+ queryset.update(status=PUBLISHED)
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(
+ request, _('The selected gbobjects are now marked as published.'))
+ make_published.short_description = _('Set gbobjects selected as published')
+
+ def make_hidden(self, request, queryset):
+ """Set gbobjects selected as hidden"""
+ queryset.update(status=HIDDEN)
+ self.message_user(
+ request, _('The selected gbobjects are now marked as hidden.'))
+ make_hidden.short_description = _('Set gbobjects selected as hidden')
+
+ def make_tweet(self, request, queryset):
+ """Post an update on Twitter"""
+ import tweepy
+ auth = tweepy.OAuthHandler(settings.TWITTER_CONSUMER_KEY,
+ settings.TWITTER_CONSUMER_SECRET)
+ auth.set_access_token(settings.TWITTER_ACCESS_KEY,
+ settings.TWITTER_ACCESS_SECRET)
+ api = tweepy.API(auth)
+ for gbobject in queryset:
+ short_url = gbobject.short_url
+ message = '%s %s' % (gbobject.title[:139 - len(short_url)], short_url)
+ api.update_status(message)
+ self.message_user(
+ request, _('The selected gbobjects have been tweeted.'))
+ make_tweet.short_description = _('Tweet gbobjects selected')
+
+ def close_comments(self, request, queryset):
+ """Close the comments for selected gbobjects"""
+ queryset.update(comment_enabled=False)
+ self.message_user(
+ request, _('Comments are now closed for selected gbobjects.'))
+ close_comments.short_description = _('Close the comments for '\
+ 'selected gbobjects')
+
+ def close_pingbacks(self, request, queryset):
+ """Close the pingbacks for selected gbobjects"""
+ queryset.update(pingback_enabled=False)
+ self.message_user(
+ request, _('Linkbacks are now closed for selected gbobjects.'))
+ close_pingbacks.short_description = _(
+ 'Close the linkbacks for selected gbobjects')
+
+ def put_on_top(self, request, queryset):
+ """Put the selected gbobjects on top at the current date"""
+ queryset.update(creation_date=datetime.now())
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(request, _(
+ 'The selected gbobjects are now set at the current date.'))
+ put_on_top.short_description = _(
+ 'Put the selected gbobjects on top at the current date')
+
+ def ping_directories(self, request, queryset, messages=True):
+ """Ping Directories for selected gbobjects"""
+ for directory in settings.PING_DIRECTORIES:
+ pinger = DirectoryPinger(directory, queryset)
+ pinger.join()
+ if messages:
+ success = 0
+ for result in pinger.results:
+ if not result.get('flerror', True):
+ success += 1
+ else:
+ self.message_user(request,
+ '%s : %s' % (directory,
+ result['message']))
+ if success:
+ self.message_user(
+ request,
+ _('%(directory)s directory succesfully ' \
+ 'pinged %(success)d gbobjects.') %
+ {'directory': directory, 'success': success})
+ ping_directories.short_description = _(
+ 'Ping Directories for selected gbobjects')
+
+ def get_urls(self):
+ gbobject_admin_urls = super(GbobjectAdmin, self).get_urls()
+ urls = patterns(
+ 'django.views.generic.simple',
+ url(r'^autocomplete_tags/$', 'direct_to_template',
+ {'template': 'admin/objectapp/gbobject/autocomplete_tags.js',
+ 'mimetype': 'application/javascript'},
+ name='objectapp_gbobject_autocomplete_tags'),
+ url(r'^wymeditor/$', 'direct_to_template',
+ {'template': 'admin/objectapp/gbobject/wymeditor.js',
+ 'mimetype': 'application/javascript'},
+ name='objectapp_gbobject_wymeditor'),
+ url(r'^markitup/$', 'direct_to_template',
+ {'template': 'admin/objectapp/gbobject/markitup.js',
+ 'mimetype': 'application/javascript'},
+ name='objectapp_gbobject_markitup'),)
+ return urls + gbobject_admin_urls
+
+ def _media(self):
+ STATIC_URL = '%sobjectapp/' % project_settings.STATIC_URL
+ media = super(GbobjectAdmin, self).media + Media(
+ css={'all': ('%scss/jquery.autocomplete.css' % STATIC_URL,)},
+ js=('%sjs/jquery.js' % STATIC_URL,
+ '%sjs/jquery.bgiframe.js' % STATIC_URL,
+ '%sjs/jquery.autocomplete.js' % STATIC_URL,
+ reverse('admin:objectapp_gbobject_autocomplete_tags'),))
+
+ if settings.WYSIWYG == 'wymeditor':
+ media += Media(
+ js=('%sjs/wymeditor/jquery.wymeditor.pack.js' % STATIC_URL,
+ '%sjs/wymeditor/plugins/hovertools/'
+ 'jquery.wymeditor.hovertools.js' % STATIC_URL,
+ reverse('admin:objectapp_gbobject_wymeditor')))
+ elif settings.WYSIWYG == 'tinymce':
+ from tinymce.widgets import TinyMCE
+ media += TinyMCE().media + Media(
+ js=(reverse('tinymce-js', args=('admin/objectapp/gbobject',)),))
+ elif settings.WYSIWYG == 'markitup':
+ media += Media(
+ js=('%sjs/markitup/jquery.markitup.js' % STATIC_URL,
+ '%sjs/markitup/sets/%s/set.js' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE),
+ reverse('admin:objectapp_gbobject_markitup')),
+ css={'all': (
+ '%sjs/markitup/skins/django/style.css' % STATIC_URL,
+ '%sjs/markitup/sets/%s/style.css' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE))})
+ return media
+ media = property(_media)
diff --git a/build/lib.linux-i686-2.6/objectapp/admin/process.py b/build/lib.linux-i686-2.6/objectapp/admin/process.py
new file mode 100644
index 0000000..21f9e07
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/admin/process.py
@@ -0,0 +1,373 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""GbobjectAdmin for Objectapp"""
+from datetime import datetime
+
+from django.forms import Media
+from django.contrib import admin
+from django.contrib.auth.models import User
+from django.utils.html import strip_tags
+from django.utils.text import truncate_words
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+from django.conf import settings as project_settings
+from django.utils.translation import ugettext_lazy as _
+from django.core.urlresolvers import reverse, NoReverseMatch
+import reversion
+from tagging.models import Tag
+
+from objectapp import settings
+from objectapp.managers import HIDDEN
+from objectapp.managers import PUBLISHED
+from objectapp.ping import DirectoryPinger
+from objectapp.admin.forms import ProcessAdminForm
+
+
+class ProcessAdmin(reversion.VersionAdmin):
+ """Admin for Process model"""
+ form = ProcessAdminForm
+ date_hierarchy = 'creation_date'
+ fieldsets = (
+ (_('Neighbourhood definition'), {'fields': ('title',
+ 'processtypes',
+ 'priorstate_attribute_set',
+ 'priorstate_relation_set',
+ 'poststate_attribute_set',
+ 'poststate_relation_set',
+ 'altnames' ,
+ 'slug',
+
+ 'status')}),
+
+ (_('Content'), {'fields': ('content', 'image',),
+ 'classes': ('collapse', 'collapse-closed')}),
+
+
+
+ (_('Dependency'), {'fields': ('prior_nodes', 'posterior_nodes',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Options'), {'fields': ('featured', 'excerpt', 'template',
+ 'authors',
+ 'creation_date',
+ 'start_publication',
+ 'end_publication'),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Privacy'), {'fields': ('password', 'login_required',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Publication'), {'fields': ('tags',
+ 'sites')}))
+ list_filter = ('objecttypes', 'authors', 'status', 'featured',
+ 'login_required', 'comment_enabled', 'pingback_enabled',
+ 'creation_date', 'start_publication',
+ 'end_publication', 'sites')
+ list_display = ('get_title', 'get_authors', 'get_objecttypes',
+ 'get_tags', 'get_sites',
+ 'get_comments_are_open', 'pingback_enabled',
+ 'get_is_actual', 'get_is_visible', 'get_link',
+ 'get_short_url', 'creation_date')
+ radio_fields = {'template': admin.VERTICAL}
+ filter_horizontal = ('objecttypes', 'authors')
+ prepopulated_fields = {'slug': ('title', )}
+ search_fields = ('title', 'excerpt', 'content', 'tags')
+ actions = ['make_mine', 'make_published', 'make_hidden',
+ 'close_comments', 'close_pingbacks',
+ 'ping_directories', 'make_tweet', 'put_on_top']
+ actions_on_top = True
+ actions_on_bottom = True
+
+ def __init__(self, model, admin_site):
+ self.form.admin_site = admin_site
+ super(ProcessAdmin, self).__init__(model, admin_site)
+
+ # Custom Display
+ def get_title(self, process):
+ """Return the title with word count and number of comments"""
+ title = _('%(title)s (%(word_count)i words)') % \
+ {'title': process.title, 'word_count': process.word_count}
+ comments = process.comments.count()
+ if comments:
+ return _('%(title)s (%(comments)i comments)') % \
+ {'title': title, 'comments': comments}
+ return title
+ get_title.short_description = _('title')
+
+ def get_authors(self, process):
+ """Return the authors in HTML"""
+ try:
+ authors = ['<a href="%s" target="blank">%s</a>' %
+ (reverse('objectapp_author_detail',
+ args=[author.username]),
+ author.username) for author in process.authors.all()]
+ except NoReverseMatch:
+ authors = [author.username for author in process.authors.all()]
+ return ', '.join(authors)
+ get_authors.allow_tags = True
+ get_authors.short_description = _('author(s)')
+
+ def get_objecttypes(self, process):
+ """Return the objecttypes linked in HTML"""
+ try:
+ objecttypes = ['<a href="%s" target="blank">%s</a>' %
+ (Objecttype.get_absolute_url(), Objecttype.title)
+ for Objecttype in process.objecttypes.all()]
+ except NoReverseMatch:
+ objecttypes = [Objecttype.title for Objecttype in
+ process.objecttypes.all()]
+ return ', '.join(objecttypes)
+ get_objecttypes.allow_tags = True
+ get_objecttypes.short_description = _('Objecttype(s)')
+
+ def get_tags(self, process):
+ """Return the tags linked in HTML"""
+ try:
+ return ', '.join(['<a href="%s" target="blank">%s</a>' %
+ (reverse('objectapp_tag_detail',
+ args=[tag.name]), tag.name)
+ for tag in Tag.objects.get_for_object(process)])
+ except NoReverseMatch:
+ return process.tags
+ get_tags.allow_tags = True
+ get_tags.short_description = _('tag(s)')
+
+ def get_sites(self, process):
+ """Return the sites linked in HTML"""
+ return ', '.join(
+ ['<a href="http://%(domain)s" target="blank">%(name)s</a>' %
+ site.__dict__ for site in process.sites.all()])
+ get_sites.allow_tags = True
+ get_sites.short_description = _('site(s)')
+
+ def get_comments_are_open(self, process):
+ """Admin wrapper for process.comments_are_open"""
+ return process.comments_are_open
+ get_comments_are_open.boolean = True
+ get_comments_are_open.short_description = _('comment enabled')
+
+ def get_is_actual(self, process):
+ """Admin wrapper for process.is_actual"""
+ return process.is_actual
+ get_is_actual.boolean = True
+ get_is_actual.short_description = _('is actual')
+
+ def get_is_visible(self, process):
+ """Admin wrapper for process.is_visible"""
+ return process.is_visible
+ get_is_visible.boolean = True
+ get_is_visible.short_description = _('is visible')
+
+ def get_link(self, process):
+ """Return a formated link to the process"""
+ return u'<a href="%s" target="blank">%s</a>' % (
+ process.get_absolute_url(), _('View'))
+ get_link.allow_tags = True
+ get_link.short_description = _('View on site')
+
+ def get_short_url(self, process):
+ """Return the short url in HTML"""
+ short_url = process.short_url
+ if not short_url:
+ return _('Unavailable')
+ return '<a href="%(url)s" target="blank">%(url)s</a>' % \
+ {'url': short_url}
+ get_short_url.allow_tags = True
+ get_short_url.short_description = _('short url')
+
+ # Custom Methods
+ def save_model(self, request, process, form, change):
+ """Save the authors, update time, make an excerpt"""
+ if not form.cleaned_data.get('excerpt') and process.status == PUBLISHED:
+ process.excerpt = truncate_words(strip_tags(process.content), 50)
+
+ if process.pk and not request.user.has_perm('objectapp.can_change_author'):
+ form.cleaned_data['authors'] = process.authors.all()
+
+ if not form.cleaned_data.get('authors'):
+ form.cleaned_data['authors'].append(request.user)
+
+ process.last_update = datetime.now()
+ process.save()
+
+ def queryset(self, request):
+ """Make special filtering by user permissions"""
+ queryset = super(ProcessAdmin, self).queryset(request)
+ if request.user.has_perm('objectapp.can_view_all'):
+ return queryset
+ return request.user.process.all()
+
+ def formfield_for_manytomany(self, db_field, request, **kwargs):
+ """Filters the disposable authors"""
+ if db_field.name == 'authors':
+ if request.user.has_perm('objectapp.can_change_author'):
+ kwargs['queryset'] = User.objects.filter(is_staff=True)
+ else:
+ kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
+
+ return super(ProcessAdmin, self).formfield_for_manytomany(
+ db_field, request, **kwargs)
+
+ def get_actions(self, request):
+ """Define user actions by permissions"""
+ actions = super(ProcessAdmin, self).get_actions(request)
+ if not request.user.has_perm('objectapp.can_change_author') \
+ or not request.user.has_perm('objectapp.can_view_all'):
+ del actions['make_mine']
+ if not settings.PING_DIRECTORIES:
+ del actions['ping_directories']
+ if not settings.USE_TWITTER:
+ del actions['make_tweet']
+
+ return actions
+
+ # Custom Actions
+ def make_mine(self, request, queryset):
+ """Set the processesto the user"""
+ for process in queryset:
+ if request.user not in process.authors.all():
+ process.authors.add(request.user)
+ self.message_user(
+ request, _('The selected processes now belong to you.'))
+ make_mine.short_description = _('Set the processes to the user')
+
+ def make_published(self, request, queryset):
+ """Set processes selected as published"""
+ queryset.update(status=PUBLISHED)
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(
+ request, _('The selected processes are now marked as published.'))
+ make_published.short_description = _('Set processes selected as published')
+
+ def make_hidden(self, request, queryset):
+ """Set systems selected as hidden"""
+ queryset.update(status=HIDDEN)
+ self.message_user(
+ request, _('The selected systems are now marked as hidden.'))
+ make_hidden.short_description = _('Set systems selected as hidden')
+
+ def make_tweet(self, request, queryset):
+ """Post an update on Twitter"""
+ import tweepy
+ auth = tweepy.OAuthHandler(settings.TWITTER_CONSUMER_KEY,
+ settings.TWITTER_CONSUMER_SECRET)
+ auth.set_access_token(settings.TWITTER_ACCESS_KEY,
+ settings.TWITTER_ACCESS_SECRET)
+ api = tweepy.API(auth)
+ for process in queryset:
+ short_url = process.short_url
+ message = '%s %s' % (process.title[:139 - len(short_url)], short_url)
+ api.update_status(message)
+ self.message_user(
+ request, _('The selected systems have been tweeted.'))
+ make_tweet.short_description = _('Tweet processes selected')
+
+ def close_comments(self, request, queryset):
+ """Close the comments for selected processes """
+ queryset.update(comment_enabled=False)
+ self.message_user(
+ request, _('Comments are now closed for selected processes.'))
+ close_comments.short_description = _('Close the comments for '\
+ 'selected processes')
+
+ def close_pingbacks(self, request, queryset):
+ """Close the pingbacks for selected processes """
+ queryset.update(pingback_enabled=False)
+ self.message_user(
+ request, _('Linkbacks are now closed for selected processes.'))
+ close_pingbacks.short_description = _(
+ 'Close the linkbacks for selected processes ')
+
+ def put_on_top(self, request, queryset):
+ """Put the selected processes on top at the current date"""
+ queryset.update(creation_date=datetime.now())
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(request, _(
+ 'The selected processes are now set at the current date.'))
+ put_on_top.short_description = _(
+ 'Put the selected processes on top at the current date')
+
+ def ping_directories(self, request, queryset, messages=True):
+ """Ping Directories for selected processes """
+ for directory in settings.PING_DIRECTORIES:
+ pinger = DirectoryPinger(directory, queryset)
+ pinger.join()
+ if messages:
+ success = 0
+ for result in pinger.results:
+ if not result.get('flerror', True):
+ success += 1
+ else:
+ self.message_user(request,
+ '%s : %s' % (directory,
+ result['message']))
+ if success:
+ self.message_user(
+ request,
+ _('%(directory)s directory succesfully ' \
+ 'pinged %(success)d processes.') %
+ {'directory': directory, 'success': success})
+ ping_directories.short_description = _(
+ 'Ping Directories for selected processes')
+
+ def get_urls(self):
+ process_admin_urls = super(ProcessAdmin, self).get_urls()
+ urls = patterns(
+ 'django.views.generic.simple',
+ url(r'^autocomplete_tags/$', 'direct_to_template',
+ {'template': 'admin/objectapp/process/autocomplete_tags.js',
+ 'mimetype': 'application/javascript'},
+ name='objectapp_process_autocomplete_tags'),
+ url(r'^wymeditor/$', 'direct_to_template',
+ {'template': 'admin/objectapp/process/wymeditor.js',
+ 'mimetype': 'application/javascript'},
+ name='objectapp_process_wymeditor'),
+ url(r'^markitup/$', 'direct_to_template',
+ {'template': 'admin/objectapp/process/markitup.js',
+ 'mimetype': 'application/javascript'},
+ name='objectapp_process_markitup'),)
+ return urls + process_admin_urls
+
+ def _media(self):
+ STATIC_URL = '%sobjectapp/' % project_settings.STATIC_URL
+ media = super(ProcessAdmin, self).media + Media(
+ css={'all': ('%scss/jquery.autocomplete.css' % STATIC_URL,)},
+ js=('%sjs/jquery.js' % STATIC_URL,
+ '%sjs/jquery.bgiframe.js' % STATIC_URL,
+ '%sjs/jquery.autocomplete.js' % STATIC_URL,
+ reverse('admin:objectapp_process_autocomplete_tags'),))
+
+ if settings.WYSIWYG == 'wymeditor':
+ media += Media(
+ js=('%sjs/wymeditor/jquery.wymeditor.pack.js' % STATIC_URL,
+ '%sjs/wymeditor/plugins/hovertools/'
+ 'jquery.wymeditor.hovertools.js' % STATIC_URL,
+ reverse('admin:objectapp_process_wymeditor')))
+ elif settings.WYSIWYG == 'tinymce':
+ from tinymce.widgets import TinyMCE
+ media += TinyMCE().media + Media(
+ js=(reverse('tinymce-js', args=('admin/objectapp/process',)),))
+ elif settings.WYSIWYG == 'markitup':
+ media += Media(
+ js=('%sjs/markitup/jquery.markitup.js' % STATIC_URL,
+ '%sjs/markitup/sets/%s/set.js' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE),
+ reverse('admin:objectapp_process_markitup')),
+ css={'all': (
+ '%sjs/markitup/skins/django/style.css' % STATIC_URL,
+ '%sjs/markitup/sets/%s/style.css' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE))})
+ return media
+ media = property(_media)
diff --git a/build/lib.linux-i686-2.6/objectapp/admin/system.py b/build/lib.linux-i686-2.6/objectapp/admin/system.py
new file mode 100644
index 0000000..387a26c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/admin/system.py
@@ -0,0 +1,356 @@
+"""GbobjectAdmin for Objectapp"""
+from datetime import datetime
+
+from django.forms import Media
+from django.contrib import admin
+from django.contrib.auth.models import User
+from django.utils.html import strip_tags
+from django.utils.text import truncate_words
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+from django.conf import settings as project_settings
+from django.utils.translation import ugettext_lazy as _
+from django.core.urlresolvers import reverse, NoReverseMatch
+import reversion
+from tagging.models import Tag
+
+from objectapp import settings
+from objectapp.managers import HIDDEN
+from objectapp.managers import PUBLISHED
+from objectapp.ping import DirectoryPinger
+from objectapp.admin.forms import SystemAdminForm
+
+
+class SystemAdmin(reversion.VersionAdmin):
+ """Admin for System model"""
+ form = SystemAdminForm
+ date_hierarchy = 'creation_date'
+ fieldsets = (
+ (_('Neighbourhood definition'), {'fields': ('title',
+ 'systemtypes',
+ 'gbobject_set',
+ 'relation_set',
+ 'attribute_set',
+ 'process_set',
+ 'system_set',
+ 'altnames' ,
+ 'slug',
+ 'status')}),
+
+ (_('Content'), {'fields': ('content', 'image',),
+ 'classes': ('collapse', 'collapse-closed')}),
+
+
+
+ (_('Dependency'), {'fields': ('prior_nodes', 'posterior_nodes',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Options'), {'fields': ('featured', 'excerpt', 'template',
+ 'authors',
+ 'creation_date',
+ 'start_publication',
+ 'end_publication'),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Privacy'), {'fields': ('password', 'login_required',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Publication'), {'fields': ('tags',
+ 'sites')}))
+ list_filter = ('objecttypes', 'authors', 'status', 'featured',
+ 'login_required', 'comment_enabled', 'pingback_enabled',
+ 'creation_date', 'start_publication',
+ 'end_publication', 'sites')
+ list_display = ('get_title', 'get_authors', 'get_objecttypes',
+ 'get_tags', 'get_sites',
+ 'get_comments_are_open', 'pingback_enabled',
+ 'get_is_actual', 'get_is_visible', 'get_link',
+ 'get_short_url', 'creation_date')
+ radio_fields = {'template': admin.VERTICAL}
+ filter_horizontal = ('objecttypes', 'authors')
+ prepopulated_fields = {'slug': ('title', )}
+ search_fields = ('title', 'excerpt', 'content', 'tags')
+ actions = ['make_mine', 'make_published', 'make_hidden',
+ 'close_comments', 'close_pingbacks',
+ 'ping_directories', 'make_tweet', 'put_on_top']
+ actions_on_top = True
+ actions_on_bottom = True
+
+ def __init__(self, model, admin_site):
+ self.form.admin_site = admin_site
+ super(SystemAdmin, self).__init__(model, admin_site)
+
+ # Custom Display
+ def get_title(self, system):
+ """Return the title with word count and number of comments"""
+ title = _('%(title)s (%(word_count)i words)') % \
+ {'title': system.title, 'word_count': system.word_count}
+ comments = system.comments.count()
+ if comments:
+ return _('%(title)s (%(comments)i comments)') % \
+ {'title': title, 'comments': comments}
+ return title
+ get_title.short_description = _('title')
+
+ def get_authors(self, system):
+ """Return the authors in HTML"""
+ try:
+ authors = ['<a href="%s" target="blank">%s</a>' %
+ (reverse('objectapp_author_detail',
+ args=[author.username]),
+ author.username) for author in system.authors.all()]
+ except NoReverseMatch:
+ authors = [author.username for author in system.authors.all()]
+ return ', '.join(authors)
+ get_authors.allow_tags = True
+ get_authors.short_description = _('author(s)')
+
+ def get_objecttypes(self, system):
+ """Return the objecttypes linked in HTML"""
+ try:
+ objecttypes = ['<a href="%s" target="blank">%s</a>' %
+ (Objecttype.get_absolute_url(), Objecttype.title)
+ for Objecttype in system.objecttypes.all()]
+ except NoReverseMatch:
+ objecttypes = [Objecttype.title for Objecttype in
+ system.objecttypes.all()]
+ return ', '.join(objecttypes)
+ get_objecttypes.allow_tags = True
+ get_objecttypes.short_description = _('Objecttype(s)')
+
+ def get_tags(self, system):
+ """Return the tags linked in HTML"""
+ try:
+ return ', '.join(['<a href="%s" target="blank">%s</a>' %
+ (reverse('objectapp_tag_detail',
+ args=[tag.name]), tag.name)
+ for tag in Tag.objects.get_for_object(system)])
+ except NoReverseMatch:
+ return system.tags
+ get_tags.allow_tags = True
+ get_tags.short_description = _('tag(s)')
+
+ def get_sites(self, system):
+ """Return the sites linked in HTML"""
+ return ', '.join(
+ ['<a href="http://%(domain)s" target="blank">%(name)s</a>' %
+ site.__dict__ for site in system.sites.all()])
+ get_sites.allow_tags = True
+ get_sites.short_description = _('site(s)')
+
+ def get_comments_are_open(self, system):
+ """Admin wrapper for system.comments_are_open"""
+ return system.comments_are_open
+ get_comments_are_open.boolean = True
+ get_comments_are_open.short_description = _('comment enabled')
+
+ def get_is_actual(self, system):
+ """Admin wrapper for system.is_actual"""
+ return system.is_actual
+ get_is_actual.boolean = True
+ get_is_actual.short_description = _('is actual')
+
+ def get_is_visible(self, system):
+ """Admin wrapper for system.is_visible"""
+ return system.is_visible
+ get_is_visible.boolean = True
+ get_is_visible.short_description = _('is visible')
+
+ def get_link(self, system):
+ """Return a formated link to the system"""
+ return u'<a href="%s" target="blank">%s</a>' % (
+ system.get_absolute_url(), _('View'))
+ get_link.allow_tags = True
+ get_link.short_description = _('View on site')
+
+ def get_short_url(self, system):
+ """Return the short url in HTML"""
+ short_url = system.short_url
+ if not short_url:
+ return _('Unavailable')
+ return '<a href="%(url)s" target="blank">%(url)s</a>' % \
+ {'url': short_url}
+ get_short_url.allow_tags = True
+ get_short_url.short_description = _('short url')
+
+ # Custom Methods
+ def save_model(self, request, system, form, change):
+ """Save the authors, update time, make an excerpt"""
+ if not form.cleaned_data.get('excerpt') and system.status == PUBLISHED:
+ system.excerpt = truncate_words(strip_tags(system.content), 50)
+
+ if system.pk and not request.user.has_perm('objectapp.can_change_author'):
+ form.cleaned_data['authors'] = system.authors.all()
+
+ if not form.cleaned_data.get('authors'):
+ form.cleaned_data['authors'].append(request.user)
+
+ system.last_update = datetime.now()
+ system.save()
+
+ def queryset(self, request):
+ """Make special filtering by user permissions"""
+ queryset = super(SystemAdmin, self).queryset(request)
+ if request.user.has_perm('objectapp.can_view_all'):
+ return queryset
+ return request.user.systems.all()
+
+ def formfield_for_manytomany(self, db_field, request, **kwargs):
+ """Filters the disposable authors"""
+ if db_field.name == 'authors':
+ if request.user.has_perm('objectapp.can_change_author'):
+ kwargs['queryset'] = User.objects.filter(is_staff=True)
+ else:
+ kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
+
+ return super(SystemAdmin, self).formfield_for_manytomany(
+ db_field, request, **kwargs)
+
+ def get_actions(self, request):
+ """Define user actions by permissions"""
+ actions = super(SystemAdmin, self).get_actions(request)
+ if not request.user.has_perm('objectapp.can_change_author') \
+ or not request.user.has_perm('objectapp.can_view_all'):
+ del actions['make_mine']
+ if not settings.PING_DIRECTORIES:
+ del actions['ping_directories']
+ if not settings.USE_TWITTER:
+ del actions['make_tweet']
+
+ return actions
+
+ # Custom Actions
+ def make_mine(self, request, queryset):
+ """Set the systems to the user"""
+ for system in queryset:
+ if request.user not in system.authors.all():
+ system.authors.add(request.user)
+ self.message_user(
+ request, _('The selected systems now belong to you.'))
+ make_mine.short_description = _('Set the systems to the user')
+
+ def make_published(self, request, queryset):
+ """Set systems selected as published"""
+ queryset.update(status=PUBLISHED)
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(
+ request, _('The selected systems are now marked as published.'))
+ make_published.short_description = _('Set systems selected as published')
+
+ def make_hidden(self, request, queryset):
+ """Set systems selected as hidden"""
+ queryset.update(status=HIDDEN)
+ self.message_user(
+ request, _('The selected systems are now marked as hidden.'))
+ make_hidden.short_description = _('Set systems selected as hidden')
+
+ def make_tweet(self, request, queryset):
+ """Post an update on Twitter"""
+ import tweepy
+ auth = tweepy.OAuthHandler(settings.TWITTER_CONSUMER_KEY,
+ settings.TWITTER_CONSUMER_SECRET)
+ auth.set_access_token(settings.TWITTER_ACCESS_KEY,
+ settings.TWITTER_ACCESS_SECRET)
+ api = tweepy.API(auth)
+ for system in queryset:
+ short_url = system.short_url
+ message = '%s %s' % (system.title[:139 - len(short_url)], short_url)
+ api.update_status(message)
+ self.message_user(
+ request, _('The selected systems have been tweeted.'))
+ make_tweet.short_description = _('Tweet systems selected')
+
+ def close_comments(self, request, queryset):
+ """Close the comments for selected systems"""
+ queryset.update(comment_enabled=False)
+ self.message_user(
+ request, _('Comments are now closed for selected systems.'))
+ close_comments.short_description = _('Close the comments for '\
+ 'selected systems')
+
+ def close_pingbacks(self, request, queryset):
+ """Close the pingbacks for selected systems"""
+ queryset.update(pingback_enabled=False)
+ self.message_user(
+ request, _('Linkbacks are now closed for selected systems.'))
+ close_pingbacks.short_description = _(
+ 'Close the linkbacks for selected systems')
+
+ def put_on_top(self, request, queryset):
+ """Put the selected systems on top at the current date"""
+ queryset.update(creation_date=datetime.now())
+ self.ping_directories(request, queryset, messages=False)
+ self.message_user(request, _(
+ 'The selected systems are now set at the current date.'))
+ put_on_top.short_description = _(
+ 'Put the selected systems on top at the current date')
+
+ def ping_directories(self, request, queryset, messages=True):
+ """Ping Directories for selected systems"""
+ for directory in settings.PING_DIRECTORIES:
+ pinger = DirectoryPinger(directory, queryset)
+ pinger.join()
+ if messages:
+ success = 0
+ for result in pinger.results:
+ if not result.get('flerror', True):
+ success += 1
+ else:
+ self.message_user(request,
+ '%s : %s' % (directory,
+ result['message']))
+ if success:
+ self.message_user(
+ request,
+ _('%(directory)s directory succesfully ' \
+ 'pinged %(success)d systems.') %
+ {'directory': directory, 'success': success})
+ ping_directories.short_description = _(
+ 'Ping Directories for selected systems')
+
+ def get_urls(self):
+ system_admin_urls = super(SystemAdmin, self).get_urls()
+ urls = patterns(
+ 'django.views.generic.simple',
+ url(r'^autocomplete_tags/$', 'direct_to_template',
+ {'template': 'admin/objectapp/system/autocomplete_tags.js',
+ 'mimetype': 'application/javascript'},
+ name='objectapp_system_autocomplete_tags'),
+ url(r'^wymeditor/$', 'direct_to_template',
+ {'template': 'admin/objectapp/system/wymeditor.js',
+ 'mimetype': 'application/javascript'},
+ name='objectapp_system_wymeditor'),
+ url(r'^markitup/$', 'direct_to_template',
+ {'template': 'admin/objectapp/system/markitup.js',
+ 'mimetype': 'application/javascript'},
+ name='objectapp_system_markitup'),)
+ return urls + system_admin_urls
+
+ def _media(self):
+ STATIC_URL = '%sobjectapp/' % project_settings.STATIC_URL
+ media = super(SystemAdmin, self).media + Media(
+ css={'all': ('%scss/jquery.autocomplete.css' % STATIC_URL,)},
+ js=('%sjs/jquery.js' % STATIC_URL,
+ '%sjs/jquery.bgiframe.js' % STATIC_URL,
+ '%sjs/jquery.autocomplete.js' % STATIC_URL,
+ reverse('admin:objectapp_system_autocomplete_tags'),))
+
+ if settings.WYSIWYG == 'wymeditor':
+ media += Media(
+ js=('%sjs/wymeditor/jquery.wymeditor.pack.js' % STATIC_URL,
+ '%sjs/wymeditor/plugins/hovertools/'
+ 'jquery.wymeditor.hovertools.js' % STATIC_URL,
+ reverse('admin:objectapp_system_wymeditor')))
+ elif settings.WYSIWYG == 'tinymce':
+ from tinymce.widgets import TinyMCE
+ media += TinyMCE().media + Media(
+ js=(reverse('tinymce-js', args=('admin/objectapp/system',)),))
+ elif settings.WYSIWYG == 'markitup':
+ media += Media(
+ js=('%sjs/markitup/jquery.markitup.js' % STATIC_URL,
+ '%sjs/markitup/sets/%s/set.js' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE),
+ reverse('admin:objectapp_system_markitup')),
+ css={'all': (
+ '%sjs/markitup/skins/django/style.css' % STATIC_URL,
+ '%sjs/markitup/sets/%s/style.css' % (
+ STATIC_URL, settings.MARKUP_LANGUAGE))})
+ return media
+ media = property(_media)
diff --git a/build/lib.linux-i686-2.6/objectapp/admin/widgets.py b/build/lib.linux-i686-2.6/objectapp/admin/widgets.py
new file mode 100644
index 0000000..68b98d1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/admin/widgets.py
@@ -0,0 +1,171 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Widgets for Objectapp admin"""
+from itertools import chain
+
+from django import forms
+from django.conf import settings
+from django.contrib.admin import widgets
+from django.utils.html import escape
+from django.utils.html import conditional_escape
+from django.utils.encoding import smart_unicode
+from django.utils.encoding import force_unicode
+
+
+class TreeNodeChoiceField(forms.ModelChoiceField):
+ """Duplicating the TreeNodeChoiceField bundled in django-mptt
+ to avoid conflict with the TreeNodeChoiceField bundled in django-cms..."""
+ def __init__(self, level_indicator=u'|--', *args, **kwargs):
+ self.level_indicator = level_indicator
+ if kwargs.get('required', True) and not 'empty_label' in kwargs:
+ kwargs['empty_label'] = None
+ super(TreeNodeChoiceField, self).__init__(*args, **kwargs)
+
+ def label_from_instance(self, obj):
+ """Creates labels which represent the tree level of each node
+ when generating option labels."""
+ return u'%s %s' % (self.level_indicator * getattr(
+ obj, obj._mptt_meta.level_attr), smart_unicode(obj))
+
+
+class MPTTModelChoiceIterator(forms.models.ModelChoiceIterator):
+ """MPTT version of ModelChoiceIterator"""
+ def choice(self, obj):
+ """Overriding choice method"""
+ tree_id = getattr(obj, self.queryset.model._mptt_meta.tree_id_attr, 0)
+ left = getattr(obj, self.queryset.model._mptt_meta.left_attr, 0)
+ return super(MPTTModelChoiceIterator,
+ self).choice(obj) + ((tree_id, left),)
+
+
+class MPTTModelMultipleChoiceField(forms.ModelMultipleChoiceField):
+ """MPTT version of ModelMultipleChoiceField"""
+ def __init__(self, level_indicator=u'|--', *args, **kwargs):
+ self.level_indicator = level_indicator
+ super(MPTTModelMultipleChoiceField, self).__init__(*args, **kwargs)
+
+ def label_from_instance(self, obj):
+ """Creates labels which represent the tree level of each node
+ when generating option labels."""
+ return u'%s %s' % (self.level_indicator * getattr(
+ obj, obj._mptt_meta.level_attr), smart_unicode(obj))
+
+ def _get_choices(self):
+ """Overriding _get_choices"""
+ if hasattr(self, '_choices'):
+ return self._choices
+ return MPTTModelChoiceIterator(self)
+
+ choices = property(_get_choices, forms.ChoiceField._set_choices)
+
+
+class MPTTFilteredSelectMultiple(widgets.FilteredSelectMultiple):
+ """MPTT version of FilteredSelectMultiple"""
+ def __init__(self, verbose_name, is_stacked, attrs=None, choices=()):
+ super(MPTTFilteredSelectMultiple, self).__init__(
+ verbose_name, is_stacked, attrs, choices)
+
+ def render_options(self, choices, selected_choices):
+ """
+ This is copy'n'pasted from django.forms.widgets Select(Widget)
+ change to the for loop and render_option so they will unpack
+ and use our extra tuple of mptt sort fields (if you pass in
+ some default choices for this field, make sure they have the
+ extra tuple too!)
+ """
+ def render_option(option_value, option_label, sort_fields):
+ """Inner scope render_option"""
+ option_value = force_unicode(option_value)
+ selected_html = (option_value in selected_choices) \
+ and u' selected="selected"' or ''
+ return u'<option value="%s" data-tree-id="%s" ' \
+ 'data-left-value="%s"%s>%s</option>' % (
+ escape(option_value),
+ sort_fields[0],
+ sort_fields[1],
+ selected_html,
+ conditional_escape(force_unicode(option_label)),
+ )
+ # Normalize to strings.
+ selected_choices = set([force_unicode(v) for v in selected_choices])
+ output = []
+ for option_value, option_label, sort_fields in chain(
+ self.choices, choices):
+ if isinstance(option_label, (list, tuple)):
+ output.append(u'<optgroup label="%s">' % escape(
+ force_unicode(option_value)))
+ for option in option_label:
+ output.append(render_option(*option))
+ output.append(u'</optgroup>')
+ else:
+ output.append(render_option(option_value, option_label,
+ sort_fields))
+ return u'\n'.join(output)
+
+ class Media:
+ """MPTTFilteredSelectMultiple's Media"""
+ js = (settings.ADMIN_MEDIA_PREFIX + 'js/core.js',
+ settings.STATIC_URL + 'objectapp/js/mptt_m2m_selectbox.js',
+ settings.ADMIN_MEDIA_PREFIX + 'js/SelectFilter2.js',)
diff --git a/build/lib.linux-i686-2.6/objectapp/comparison.py b/build/lib.linux-i686-2.6/objectapp/comparison.py
new file mode 100644
index 0000000..d79d78d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/comparison.py
@@ -0,0 +1,93 @@
+"""Comparison tools for Objectapp
+Based on clustered_models app"""
+from math import sqrt
+
+from objectapp.settings import F_MIN
+from objectapp.settings import F_MAX
+
+
+def pearson_score(list1, list2):
+ """Compute the pearson score between 2 lists of vectors"""
+ sum1 = sum(list1)
+ sum2 = sum(list2)
+ sum_sq1 = sum([pow(l, 2) for l in list1])
+ sum_sq2 = sum([pow(l, 2) for l in list2])
+
+ prod_sum = sum([list1[i] * list2[i] for i in range(len(list1))])
+
+ num = prod_sum - (sum1 * sum2 / len(list1))
+ den = sqrt((sum_sq1 - pow(sum1, 2) / len(list1)) *
+ (sum_sq2 - pow(sum2, 2) / len(list2)))
+ if den == 0:
+ return 0.0
+ return 1.0 - num / den
+
+
+class ClusteredModel(object):
+ """Wrapper around Model class
+ building a dataset of instances"""
+
+ def __init__(self, queryset, fields=['id']):
+ self.fields = fields
+ self.queryset = queryset
+
+ def dataset(self):
+ """Generate a dataset with the queryset
+ and specified fields"""
+ dataset = {}
+ for item in self.queryset.filter():
+ dataset[item] = ' '.join([unicode(item.__dict__[field])
+ for field in self.fields])
+ return dataset
+
+
+class VectorBuilder(object):
+ """Build a list of vectors based on datasets"""
+
+ def __init__(self, queryset, fields):
+ self.key = ''
+ self.columns = []
+ self.dataset = {}
+ self.clustered_model = ClusteredModel(queryset, fields)
+ self.build_dataset()
+
+ def build_dataset(self):
+ """Generate whole dataset"""
+ data = {}
+ words_total = {}
+
+ model_data = self.clustered_model.dataset()
+ for instance, words in model_data.items():
+ words_item_total = {}
+ for word in words.split():
+ words_total.setdefault(word, 0)
+ words_item_total.setdefault(word, 0)
+ words_total[word] += 1
+ words_item_total[word] += 1
+ data[instance] = words_item_total
+
+ top_words = []
+ for word, count in words_total.items():
+ frequency = float(count) / len(data)
+ if frequency > F_MIN and frequency < F_MAX:
+ top_words.append(word)
+
+ self.dataset = {}
+ self.columns = top_words
+ for instance in data.keys():
+ self.dataset[instance] = [data[instance].get(word, 0)
+ for word in top_words]
+ self.key = self.generate_key()
+
+ def generate_key(self):
+ """Generate key for this list of vectors"""
+ return self.clustered_model.queryset.count()
+
+ def flush(self):
+ """Flush the dataset"""
+ if self.key != self.generate_key():
+ self.build_dataset()
+
+ def __call__(self):
+ self.flush()
+ return self.columns, self.dataset
diff --git a/build/lib.linux-i686-2.6/objectapp/context_processors.py b/build/lib.linux-i686-2.6/objectapp/context_processors.py
new file mode 100644
index 0000000..a764c78
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/context_processors.py
@@ -0,0 +1,7 @@
+"""Context Processors for Objectapp"""
+from objectapp import __version__
+
+
+def version(request):
+ """Adds version of Objectapp to the context"""
+ return {'OBJECTAPP_VERSION': __version__}
diff --git a/build/lib.linux-i686-2.6/objectapp/feeds.py b/build/lib.linux-i686-2.6/objectapp/feeds.py
new file mode 100644
index 0000000..6c75a34
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/feeds.py
@@ -0,0 +1,398 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Feeds for Objectapp"""
+from urlparse import urljoin
+from BeautifulSoup import BeautifulSoup
+
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+from django.shortcuts import get_object_or_404
+from django.utils.feedgenerator import Atom1Feed
+from django.utils.translation import ugettext as _
+from django.contrib.syndication.views import Feed
+from django.core.urlresolvers import NoReverseMatch
+from django.core.exceptions import ObjectDoesNotExist
+
+from tagging.models import Tag
+from tagging.models import TaggedItem
+
+from objectapp.models import Gbobject
+from objectapp.settings import COPYRIGHT
+from objectapp.settings import PROTOCOL
+from objectapp.settings import FEEDS_FORMAT
+from objectapp.settings import FEEDS_MAX_ITEMS
+from objectapp.managers import gbobjects_published
+from objectapp.views.objecttypes import get_Objecttype_or_404
+from objectapp.templatetags.objectapp_tags import get_gravatar
+
+
+class ObjectappFeed(Feed):
+ """Base Feed for Objectapp"""
+ feed_copyright = COPYRIGHT
+
+ def __init__(self):
+ self.site = Site.objects.get_current()
+ self.site_url = '%s://%s' % (PROTOCOL, self.site.domain)
+ if FEEDS_FORMAT == 'atom':
+ self.feed_type = Atom1Feed
+ self.subtitle = self.description
+
+
+class GbobjectFeed(ObjectappFeed):
+ """Base Gbobject Feed"""
+ title_template = 'feeds/gbobject_title.html'
+ description_template = 'feeds/gbobject_description.html'
+
+ def item_pubdate(self, item):
+ """Publication date of an gbobject"""
+ return item.creation_date
+
+ def item_objecttypes(self, item):
+ """Gbobject's objecttypes"""
+ return [Objecttype.title for Objecttype in item.objecttypes.all()]
+
+ def item_author_name(self, item):
+ """Returns the first author of an gbobject"""
+ if item.authors.count():
+ self.item_author = item.authors.all()[0]
+ return self.item_author.username
+
+ def item_author_email(self, item):
+ """Returns the first author's email"""
+ return self.item_author.email
+
+ def item_author_link(self, item):
+ """Returns the author's URL"""
+ try:
+ author_url = reverse('objectapp_author_detail',
+ args=[self.item_author.username])
+ return self.site_url + author_url
+ except NoReverseMatch:
+ return self.site_url
+
+ def item_enclosure_url(self, item):
+ """Returns an image for enclosure"""
+ if item.image:
+ return item.image.url
+
+ img = BeautifulSoup(item.html_content).find('img')
+ if img:
+ return urljoin(self.site_url, img['src'])
+
+ def item_enclosure_length(self, item):
+ """Hardcoded enclosure length"""
+ return '100000'
+
+ def item_enclosure_mime_type(self, item):
+ """Hardcoded enclosure mimetype"""
+ return 'image/jpeg'
+
+
+class LatestGbobjects(GbobjectFeed):
+ """Feed for the latest gbobjects"""
+
+ def link(self):
+ """URL of latest gbobjects"""
+ return reverse('objectapp_gbobject_archive_index')
+
+ def items(self):
+ """Items are published gbobjects"""
+ return Gbobject.published.all()[:FEEDS_MAX_ITEMS]
+
+ def title(self):
+ """Title of the feed"""
+ return '%s - %s' % (self.site.name, _('Latest gbobjects'))
+
+ def description(self):
+ """Description of the feed"""
+ return _('The latest gbobjects for the site %s') % self.site.name
+
+
+class ObjecttypeGbobjects(GbobjectFeed):
+ """Feed filtered by a Objecttype"""
+
+ def get_object(self, request, path):
+ """Retrieve the Objecttype by his path"""
+ return get_Objecttype_or_404(path)
+
+ def items(self, obj):
+ """Items are the published gbobjects of the Objecttype"""
+ return obj.gbobjects_published()[:FEEDS_MAX_ITEMS]
+
+ def link(self, obj):
+ """URL of the Objecttype"""
+ return obj.get_absolute_url()
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Gbobjects for the Objecttype %s') % obj.title
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest gbobjects for the Objecttype %s') % obj.title
+
+
+class AuthorGbobjects(GbobjectFeed):
+ """Feed filtered by an author"""
+
+ def get_object(self, request, username):
+ """Retrieve the author by his username"""
+ return get_object_or_404(User, username=username)
+
+ def items(self, obj):
+ """Items are the published gbobjects of the author"""
+ return gbobjects_published(obj.gbobjects)[:FEEDS_MAX_ITEMS]
+
+ def link(self, obj):
+ """URL of the author"""
+ return reverse('objectapp_author_detail', args=[obj.username])
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Gbobjects for author %s') % obj.username
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest gbobjects by %s') % obj.username
+
+
+class TagGbobjects(GbobjectFeed):
+ """Feed filtered by a tag"""
+
+ def get_object(self, request, slug):
+ """Retrieve the tag by his name"""
+ return get_object_or_404(Tag, name=slug)
+
+ def items(self, obj):
+ """Items are the published gbobjects of the tag"""
+ return TaggedItem.objects.get_by_model(
+ Gbobject.published.all(), obj)[:FEEDS_MAX_ITEMS]
+
+ def link(self, obj):
+ """URL of the tag"""
+ return reverse('objectapp_tag_detail', args=[obj.name])
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Gbobjects for the tag %s') % obj.name
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest gbobjects for the tag %s') % obj.name
+
+
+class SearchGbobjects(GbobjectFeed):
+ """Feed filtered by a search pattern"""
+
+ def get_object(self, request):
+ """The GET parameter 'pattern' is the object"""
+ pattern = request.GET.get('pattern', '')
+ if len(pattern) < 3:
+ raise ObjectDoesNotExist
+ return pattern
+
+ def items(self, obj):
+ """Items are the published gbobjects founds"""
+ return Gbobject.published.search(obj)[:FEEDS_MAX_ITEMS]
+
+ def link(self, obj):
+ """URL of the search request"""
+ return '%s?pattern=%s' % (reverse('objectapp_gbobject_search'), obj)
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _("Results of the search for '%s'") % obj
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _("The gbobjects containing the pattern '%s'") % obj
+
+
+class GbobjectDiscussions(ObjectappFeed):
+ """Feed for discussions in an gbobject"""
+ title_template = 'feeds/discussion_title.html'
+ description_template = 'feeds/discussion_description.html'
+
+ def get_object(self, request, year, month, day, slug):
+ """Retrieve the discussions by gbobject's slug"""
+ return get_object_or_404(Gbobject.published, slug=slug,
+ creation_date__year=year,
+ creation_date__month=month,
+ creation_date__day=day)
+
+ def items(self, obj):
+ """Items are the discussions on the gbobject"""
+ return obj.discussions[:FEEDS_MAX_ITEMS]
+
+ def item_pubdate(self, item):
+ """Publication date of a discussion"""
+ return item.submit_date
+
+ def item_link(self, item):
+ """URL of the discussion"""
+ return item.get_absolute_url()
+
+ def link(self, obj):
+ """URL of the gbobject"""
+ return obj.get_absolute_url()
+
+ def item_author_name(self, item):
+ """Author of the discussion"""
+ return item.userinfo['name']
+
+ def item_author_email(self, item):
+ """Author's email of the discussion"""
+ return item.userinfo['email']
+
+ def item_author_link(self, item):
+ """Author's URL of the discussion"""
+ return item.userinfo['url']
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Discussions on %s') % obj.title
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest discussions for the gbobject %s') % obj.title
+
+
+class GbobjectComments(GbobjectDiscussions):
+ """Feed for comments in an gbobject"""
+ title_template = 'feeds/comment_title.html'
+ description_template = 'feeds/comment_description.html'
+
+ def items(self, obj):
+ """Items are the comments on the gbobject"""
+ return obj.comments[:FEEDS_MAX_ITEMS]
+
+ def item_link(self, item):
+ """URL of the comment"""
+ return item.get_absolute_url('#comment_%(id)s')
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Comments on %s') % obj.title
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest comments for the gbobject %s') % obj.title
+
+ def item_enclosure_url(self, item):
+ """Returns a gravatar image for enclosure"""
+ return get_gravatar(item.userinfo['email'])
+
+ def item_enclosure_length(self, item):
+ """Hardcoded enclosure length"""
+ return '100000'
+
+ def item_enclosure_mime_type(self, item):
+ """Hardcoded enclosure mimetype"""
+ return 'image/jpeg'
+
+
+class GbobjectPingbacks(GbobjectDiscussions):
+ """Feed for pingbacks in an gbobject"""
+ title_template = 'feeds/pingback_title.html'
+ description_template = 'feeds/pingback_description.html'
+
+ def items(self, obj):
+ """Items are the pingbacks on the gbobject"""
+ return obj.pingbacks[:FEEDS_MAX_ITEMS]
+
+ def item_link(self, item):
+ """URL of the pingback"""
+ return item.get_absolute_url('#pingback_%(id)s')
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Pingbacks on %s') % obj.title
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest pingbacks for the gbobject %s') % obj.title
+
+
+class GbobjectTrackbacks(GbobjectDiscussions):
+ """Feed for trackbacks in an gbobject"""
+ title_template = 'feeds/trackback_title.html'
+ description_template = 'feeds/trackback_description.html'
+
+ def items(self, obj):
+ """Items are the trackbacks on the gbobject"""
+ return obj.trackbacks[:FEEDS_MAX_ITEMS]
+
+ def item_link(self, item):
+ """URL of the trackback"""
+ return item.get_absolute_url('#trackback_%(id)s')
+
+ def title(self, obj):
+ """Title of the feed"""
+ return _('Trackbacks on %s') % obj.title
+
+ def description(self, obj):
+ """Description of the feed"""
+ return _('The latest trackbacks for the gbobject %s') % obj.title
diff --git a/build/lib.linux-i686-2.6/objectapp/fixtures/helloworld.json b/build/lib.linux-i686-2.6/objectapp/fixtures/helloworld.json
new file mode 100644
index 0000000..5ac204e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/fixtures/helloworld.json
@@ -0,0 +1,129 @@
+[
+ {
+ "pk": 2,
+ "model": "objectapp.Objecttype",
+ "fields": {
+ "rght": 2,
+ "description": "All gbobjects containing tests.",
+ "parent": null,
+ "slug": "tests",
+ "title": "Tests",
+ "level": 0,
+ "lft": 1,
+ "tree_id": 1
+ }
+ },
+ {
+ "pk": 1,
+ "model": "objectapp.Objecttype",
+ "fields": {
+ "rght": 2,
+ "description": "All uncategorized gbobjects.",
+ "parent": null,
+ "slug": "uncategorized",
+ "title": "Uncategorized",
+ "level": 0,
+ "lft": 1,
+ "tree_id": 2
+ }
+ },
+ {
+ "pk": 1,
+ "model": "objectapp.gbobject",
+ "fields": {
+ "status": 2,
+ "login_required": false,
+ "password": "",
+ "end_publication": "2042-12-31 00:00:00",
+ "comment_enabled": true,
+ "tags": "welcome, blog, test",
+ "image": "",
+ "title": "Hello World !",
+ "excerpt": "Welcome to the Objectapp blogging application written in Django.This is your first gbobject, don't hesite to archive or remove it.Or you can simply add a new gbobject.",
+ "sites": [
+ 1
+ ],
+ "related": [
+ 3
+ ],
+ "creation_date": "2010-01-01 00:00:00",
+ "content": "<p>Welcome to the Objectapp blogging application written in Django.</p><p>This is your first gbobject, don't hesite to <a title=\"Edit this gbobject.\" href=\"/admin/objectapp/gbobject/1/\">archive or remove it</a>.</p><p>Or you can simply <a title=\"Add a new gbobject.\" href=\"/admin/objectapp/gbobject/add/\">add a new gbobject</a>.</p>",
+ "start_publication": "2010-01-01 00:00:00",
+ "authors": [
+ 1
+ ],
+ "last_update": "2010-04-20 15:12:49",
+ "slug": "hello-world",
+ "objecttypes": [
+ 1
+ ]
+ }
+ },
+ {
+ "pk": 3,
+ "model": "objectapp.gbobject",
+ "fields": {
+ "status": 2,
+ "login_required": false,
+ "password": "",
+ "end_publication": "2042-12-31 00:00:00",
+ "comment_enabled": true,
+ "tags": "blog, test",
+ "image": "",
+ "title": "Lorem ipsum",
+ "excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut commodo mi at massa iaculis at facilisis sem viverra. Aliquam eget odio turpis. Sed luctus, diam sed vehicula auctor, orci tortor auctor turpis, quis bibendum enim odio sed neque. Sed eu justo vitae orci placerat suscipit eu tempus ligula. Ut condimentum, ...",
+ "sites": [
+ 1
+ ],
+ "related": [
+ 1,
+ 2
+ ],
+ "creation_date": "2009-03-15 00:00:00",
+ "content": "<div id=\"lipsum\"><p>\r\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Ut commodo mi\r\nat massa iaculis at facilisis sem viverra. Aliquam eget odio turpis.\r\nSed luctus, diam sed vehicula auctor, orci tortor auctor turpis, quis\r\nbibendum enim odio sed neque. Sed eu justo vitae orci placerat suscipit\r\neu tempus ligula. Ut condimentum, odio at dignissim egestas, est tortor\r\nlobortis dolor, vel feugiat massa magna non magna. Sed sit amet quam a\r\nturpis tristique auctor. Vestibulum nec sapien sed enim congue varius.\r\nUt vulputate adipiscing neque, a egestas purus euismod nec. Donec\r\nauctor nunc ac massa mattis quis commodo tortor luctus. Integer id sem\r\nnec nisl iaculis imperdiet. Vestibulum ante ipsum primis in faucibus\r\norci luctus et ultrices posuere cubilia Curae; Mauris bibendum augue\r\nvitae nisi volutpat a tempor purus sodales. Nunc quis justo nunc, at\r\ntristique quam. Fusce vitae nibh tellus, quis consequat nisl. Fusce mi\r\nnulla, sollicitudin a auctor et, posuere nec leo. Curabitur vehicula\r\nvelit vel lacus condimentum eget ullamcorper eros faucibus. Curabitur\r\nposuere, magna non rhoncus aliquet, ante sem cursus nibh, a mattis est\r\nlorem et lorem.\r\n</p><p>Nullam metus ligula, sagittis eu consectetur in, pharetra non purus.\r\nInteger non porta tortor. Fusce fringilla mi eget nibh sodales viverra.\r\nVivamus erat urna, pretium eu ornare non, sollicitudin eget urna.\r\nPraesent justo enim, hendrerit at porttitor in, adipiscing vel nulla.\r\nVivamus nunc nisl, fermentum eget tempor nec, convallis sed justo.\r\nPellentesque vel imperdiet leo. Class aptent taciti sociosqu ad litora\r\ntorquent per conubia nostra, per inceptos himenaeos. Etiam lacinia erat\r\nnon nisi sagittis eget mattis dui dictum. Donec id lorem eu quam\r\nfacilisis ultricies. Ut et dolor porta lectus adipiscing aliquam vel at\r\nodio. In hac habitasse platea dictumst. Sed mollis lacus tincidunt\r\nmassa placerat sed tincidunt tortor interdum. Nunc vulputate placerat\r\nnunc eget venenatis. In aliquam rutrum nulla, sed aliquet dolor ornare\r\ninterdum. Etiam fermentum mollis cursus.\r\n</p></div>",
+ "start_publication": "2010-01-01 00:00:00",
+ "authors": [
+ 1
+ ],
+ "last_update": "2010-04-20 15:26:02",
+ "slug": "lorem-ipsum",
+ "objecttypes": [
+ 2,
+ 1
+ ]
+ }
+ },
+ {
+ "pk": 2,
+ "model": "objectapp.gbobject",
+ "fields": {
+ "status": 2,
+ "login_required": false,
+ "password": "",
+ "end_publication": "2042-12-31 00:00:00",
+ "comment_enabled": true,
+ "tags": "html, test, ",
+ "image": "",
+ "title": "Testing HTML elements",
+ "excerpt": "The purpose of this HTML is to help determine what default settings are with CSS and to make sure that all possible HTML Elements are included in this HTML so as to not miss any possible Elements when designing a site.Heading 1Heading 2Heading 3Heading 4Heading 5Heading 6ParagraphLorem ipsum dolor sit ...",
+ "sites": [
+ 1
+ ],
+ "related": [
+ 3
+ ],
+ "creation_date": "2009-01-01 00:00:00",
+ "content": "<p>The\r\npurpose of this HTML is to help determine what default settings are\r\nwith CSS and to make sure that all possible HTML Elements are included\r\nin this HTML so as to not miss any possible Elements when designing a\r\nsite.</p><hr /><h1>Heading 1</h1><h2>Heading 2</h2><h3>Heading 3</h3><h4>Heading 4</h4><h5>Heading 5</h5><h6>Heading 6</h6><hr /><h2 id=\"paragraph\">Paragraph</h2><p>Lorem ipsum dolor sit amet, <a href=\"http://wp-themes.com/?p=36#\" title=\"test link\">test link</a>\r\nadipiscing elit. Nullam dignissim convallis est. Quisque aliquam. Donec\r\nfaucibus. Nunc iaculis suscipit dui. Nam sit amet sem. Aliquam libero\r\nnisi, imperdiet at, tincidunt nec, gravida vehicula, nisl. Praesent\r\nmattis, massa quis luctus fermentum, turpis mi volutpat justo, eu\r\nvolutpat enim diam eget metus. Maecenas ornare tortor. Donec sed tellus\r\neget sapien fringilla nonummy. Mauris a ante. Suspendisse quam sem,\r\nconsequat at, commodo vitae, feugiat in, nunc. Morbi imperdiet augue\r\nquis tellus.</p><p>Lorem ipsum dolor sit amet, <em>emphasis</em> consectetuer\r\nadipiscing elit. Nullam dignissim convallis est. Quisque aliquam. Donec\r\nfaucibus. Nunc iaculis suscipit dui. Nam sit amet sem. Aliquam libero\r\nnisi, imperdiet at, tincidunt nec, gravida vehicula, nisl. Praesent\r\nmattis, massa quis luctus fermentum, turpis mi volutpat justo, eu\r\nvolutpat enim diam eget metus. Maecenas ornare tortor. Donec sed tellus\r\neget sapien fringilla nonummy. Mauris a ante. Suspendisse quam sem,\r\nconsequat at, commodo vitae, feugiat in, nunc. Morbi imperdiet augue\r\nquis tellus.</p><hr /><h2 id=\"list_types\">List Types</h2><h3>Definition List</h3><dl><dt>Definition List Title</dt><dd>This is a definition list division.</dd></dl><h3>Ordered List</h3><ol><li>List Item 1</li><li>List Item 2</li><li>List Item 3</li></ol><h3>Unordered List</h3><ul><li>List Item 1</li><li>List Item 2</li><li>List Item 3</li></ul><hr /><h2 id=\"form_elements\">Forms</h2><fieldset><legend>Legend</legend><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam\r\ndignissim convallis est. Quisque aliquam. Donec faucibus. Nunc iaculis\r\nsuscipit dui. Nam sit amet sem. Aliquam libero nisi, imperdiet at,\r\ntincidunt nec, gravida vehicula, nisl. Praesent mattis, massa quis\r\nluctus fermentum, turpis mi volutpat justo, eu volutpat enim diam eget\r\nmetus.</p><form><h2>Form Element</h2><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam\r\ndignissim convallis est. Quisque aliquam. Donec faucibus. Nunc iaculis\r\nsuscipit dui.</p><p><label for=\"text_field\">Text Field:</label></p><input id=\"text_field\" type=\"text\" /><p><label for=\"text_area\">Text Area:</label><br /><textarea id=\"text_area\"></textarea></p><p><label for=\"select_element\">Select Element:</label></p><select name=\"select_element\"><optgroup label=\"Option Group 1\"></optgroup><option value=\"1\">Option 1</option><option value=\"2\">Option 2</option><option value=\"3\">Option 3</option><optgroup label=\"Option Group 2\"></optgroup><option value=\"1\">Option 1</option><option value=\"2\">Option 2</option><option value=\"3\">Option 3</option></select><p><label for=\"radio_buttons\">Radio Buttons:</label></p><input class=\"radio\" name=\"radio_button\" value=\"radio_1\" type=\"radio\" /> Radio 1<br /><input class=\"radio\" name=\"radio_button\" value=\"radio_2\" type=\"radio\" /> Radio 2<br /><input class=\"radio\" name=\"radio_button\" value=\"radio_3\" type=\"radio\" /> Radio 3<br /><p><label for=\"checkboxes\">Checkboxes:</label></p><input class=\"checkbox\" name=\"checkboxes\" value=\"check_1\" type=\"checkbox\" /> Radio 1<br /><input class=\"checkbox\" name=\"checkboxes\" value=\"check_2\" type=\"checkbox\" /> Radio 2<br /><input class=\"checkbox\" name=\"checkboxes\" value=\"check_3\" type=\"checkbox\" /> Radio 3<br /><p><label for=\"password\">Password:</label></p><input class=\"password\" name=\"password\" type=\"password\" /><p><label for=\"file\">File Input:</label></p><input class=\"file\" name=\"file\" type=\"file\" /><p><input class=\"button\" value=\"Clear\" type=\"reset\" /><input class=\"button\" value=\"Submit\" type=\"submit\" /></p></form></fieldset><hr /><h2 id=\"tables\">Tables</h2><table><tbody><tr><th>Table Header 1</th><th>Table Header 2</th><th>Table Header 3</th></tr><tr><td>Division 1</td><td>Division 2</td><td>Division 3</td></tr><tr class=\"even\"><td>Division 1</td><td>Division 2</td><td>Division 3</td></tr><tr><td>Division 1</td><td>Division 2</td><td>Division 3</td></tr></tbody></table><hr /><h2 id=\"misc\">Misc Stuff \u2013 abbr, acronym, pre, code, sub, sup, etc.</h2><p>Lorem <sup>superscript</sup> dolor <sub>subscript</sub> amet, consectetuer adipiscing elit. Nullam dignissim convallis est. Quisque aliquam. <cite>cite</cite>.\r\nNunc iaculis suscipit dui. Nam sit amet sem. Aliquam libero nisi,\r\nimperdiet at, tincidunt nec, gravida vehicula, nisl. Praesent mattis,\r\nmassa quis luctus fermentum, turpis mi volutpat justo, eu volutpat enim\r\ndiam eget metus. Maecenas ornare tortor. Donec sed tellus eget sapien\r\nfringilla nonummy. <acronym title=\"National Basketball Association\">NBA</acronym> Mauris a ante. Suspendisse quam sem, consequat at, commodo vitae, feugiat in, nunc. Morbi imperdiet augue quis tellus. <abbr title=\"Avenue\">AVE</abbr></p><pre>Lorem ipsum dolor sit amet,<br /> consectetuer adipiscing elit.<br /> Nullam dignissim convallis est.<br /> Quisque aliquam. Donec faucibus.<br />Nunc iaculis suscipit dui.<br />Nam sit amet sem.<br />Aliquam libero nisi, imperdiet at,<br /> tincidunt nec, gravida vehicula,<br /> nisl.<br />Praesent mattis, massa quis<br />luctus fermentum, turpis mi<br />volutpat justo, eu volutpat<br />enim diam eget metus.<br />Maecenas ornare tortor.<br />Donec sed tellus eget sapien<br /> fringilla nonummy.<br /><acronym title=\"National Basketball Association\">NBA</acronym>\r\nMauris a ante. Suspendisse\r\n quam sem, consequat at,\r\ncommodo vitae, feugiat in,\r\nnunc. Morbi imperdiet augue\r\n quis tellus.\r\n<abbr title=\"Avenue\">AVE</abbr></pre><blockquote><p>\r\n\t\u201cThis stylesheet is going to help so freaking much.\u201d <br />-Blockquote\r\n</p></blockquote>\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n ",
+ "start_publication": "2010-01-01 00:00:00",
+ "authors": [
+ 1
+ ],
+ "last_update": "2010-04-20 15:26:38",
+ "slug": "testing-html-elements",
+ "objecttypes": [
+ 2,
+ 1
+ ]
+ }
+ }
+]
diff --git a/build/lib.linux-i686-2.6/objectapp/forms.py b/build/lib.linux-i686-2.6/objectapp/forms.py
new file mode 100644
index 0000000..6f9df1a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/forms.py
@@ -0,0 +1,35 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+from objectapp.models import *
+from django.forms import ModelForm
+
+class GbobjectForm(ModelForm):
+
+ class Meta:
+ model = Gbobject
+
+class ProcessForm(ModelForm):
+
+ class Meta:
+ model = Process
+
+class SystemForm(ModelForm):
+
+ class Meta:
+ model = System
+
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/de/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/objectapp/locale/de/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..559f9ca
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/de/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/de/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/objectapp/locale/de/LC_MESSAGES/django.po
new file mode 100644
index 0000000..1a1c281
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/de/LC_MESSAGES/django.po
@@ -0,0 +1,1200 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Jannis Leidel <jannis@leidel.info>, 2011.
+# Julien Fache <fantomas42@gmail.com>, 2011.
+# madcad <mail@mad-cad.net>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-blog-objectapp\n"
+"Report-Msgid-Bugs-To: https://github.com/Fantomas42/django-blog-objectapp/issues\n"
+"POT-Creation-Date: 2011-04-12 13:21-0500\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n"
+"Language-Team: German (http://www.transifex.net/projects/p/django-blog-objectapp/team/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:102 plugins/cms_plugins.py:23
+#: templates/objectapp/gbobject_archive.html:4
+#: templates/objectapp/gbobject_archive.html:25 templates/objectapp/gbobject_list.html:19
+#: tests/feeds.py:115
+msgid "Latest gbobjects"
+msgstr "Neuste Einträge"
+
+#: feeds.py:106 tests/feeds.py:117
+#, python-format
+msgid "The latest gbobjects for the site %s"
+msgstr "Die neusten Einträge der Seite %s"
+
+#: feeds.py:126 tests/feeds.py:126
+#, python-format
+msgid "Gbobjects for the Objecttype %s"
+msgstr "Einträge der Kategorie %s"
+
+#: feeds.py:130 tests/feeds.py:128
+#, python-format
+msgid "The latest gbobjects for the Objecttype %s"
+msgstr "Die neusten Einträge in Kategorie %s"
+
+#: feeds.py:150 tests/feeds.py:137
+#, python-format
+msgid "Gbobjects for author %s"
+msgstr "Einträge für Autor %s"
+
+#: feeds.py:154 tests/feeds.py:139
+#, python-format
+msgid "The latest gbobjects by %s"
+msgstr "Die neuesten Einträge von %s"
+
+#: feeds.py:175 tests/feeds.py:149
+#, python-format
+msgid "Gbobjects for the tag %s"
+msgstr "Einträge für den Tag %s"
+
+#: feeds.py:179 tests/feeds.py:151
+#, python-format
+msgid "The latest gbobjects for the tag %s"
+msgstr "Die neuen Einträge für den Tag %s"
+
+#: feeds.py:199 tests/feeds.py:160
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:162
+#, python-format
+msgid "The gbobjects containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:245 tests/feeds.py:178
+#, python-format
+msgid "Discussions on %s"
+msgstr "Kommentare auf %s"
+
+#: feeds.py:249 tests/feeds.py:180
+#, python-format
+msgid "The latest discussions for the gbobject %s"
+msgstr "Die neusten Kommentare für die Einträge %s"
+
+#: feeds.py:267 tests/feeds.py:190
+#, python-format
+msgid "Comments on %s"
+msgstr "Kommentar für %s"
+
+#: feeds.py:271 tests/feeds.py:192
+#, python-format
+msgid "The latest comments for the gbobject %s"
+msgstr "Die neusten Kommentare für die Einträge %s"
+
+#: feeds.py:301 tests/feeds.py:206
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks für %s"
+
+#: feeds.py:305 tests/feeds.py:208
+#, python-format
+msgid "The latest pingbacks for the gbobject %s"
+msgstr "Die neusten Pingbacks für Eintrag %s"
+
+#: feeds.py:323 tests/feeds.py:218
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks für %s"
+
+#: feeds.py:327 tests/feeds.py:220
+#, python-format
+msgid "The latest trackbacks for the gbobject %s"
+msgstr "Die neusten Trackbacks für Eintrag %s"
+
+#: models.py:64 models.py:105 admin/gbobject.py:73
+msgid "title"
+msgstr "Titel"
+
+#: models.py:65 models.py:119
+msgid "used for publication"
+msgstr "Für die Veröffentlichung benutzt"
+
+#: models.py:67
+msgid "description"
+msgstr "Beschreibung"
+
+#: models.py:70 admin/forms.py:18
+msgid "parent Objecttype"
+msgstr "Übergeordnete Kategorie"
+
+#: models.py:95
+msgid "Objecttype"
+msgstr "Kategorie"
+
+#: models.py:96 models.py:114 admin/forms.py:47 plugins/models.py:24
+msgid "objecttypes"
+msgstr "Kategorien"
+
+#: models.py:101
+msgid "draft"
+msgstr "Entwurf"
+
+#: models.py:102
+msgid "hidden"
+msgstr "Versteckt"
+
+#: models.py:103
+msgid "published"
+msgstr "Veröffentlicht"
+
+#: models.py:107
+msgid "image"
+msgstr "Bild"
+
+#: models.py:108
+msgid "used for illustration"
+msgstr "Als Abbildung benutzt"
+
+#: models.py:109
+msgid "content"
+msgstr "Inhalt"
+
+#: models.py:110
+msgid "excerpt"
+msgstr "Auszug"
+
+#: models.py:111
+msgid "optional element"
+msgstr "Optionales Element"
+
+#: models.py:113 plugins/models.py:30
+msgid "tags"
+msgstr "Tags"
+
+#: models.py:116
+msgid "related gbobjects"
+msgstr "Verwandte Einträge"
+
+#: models.py:123 plugins/models.py:28
+msgid "authors"
+msgstr "Autoren"
+
+#: models.py:126
+msgid "featured"
+msgstr "empfohlenen"
+
+#: models.py:127 admin/gbobject.py:124
+msgid "comment enabled"
+msgstr "Kommentare aktiviert"
+
+#: models.py:128
+msgid "linkback enabled"
+msgstr "Linkback aktiviert"
+
+#: models.py:130
+msgid "creation date"
+msgstr "Erstellungsdatum"
+
+#: models.py:131
+msgid "last update"
+msgstr "Letzte Änderung"
+
+#: models.py:132
+msgid "start publication"
+msgstr "Veröffentlichungsbeginn"
+
+#: models.py:133
+msgid "date start publish"
+msgstr "Datum der ersten Veröffentlichung"
+
+#: models.py:135
+msgid "end publication"
+msgstr "Veröffentlichungsende"
+
+#: models.py:136
+msgid "date end publish"
+msgstr "Datum des Veröffentlichungsende"
+
+#: models.py:139
+msgid "sites publication"
+msgstr "Veröffentlich auf Seiten"
+
+#: models.py:141
+msgid "login required"
+msgstr "Anmeldung erfolderlich"
+
+#: models.py:142
+msgid "only authenticated users can view the gbobject"
+msgstr "Nur authentifizierte Benutzer können den Eintrag lesen "
+
+#: models.py:143
+msgid "password"
+msgstr "Passwort"
+
+#: models.py:144
+msgid "protect the gbobject with a password"
+msgstr "Eintrag mit Passwort schützen"
+
+#: models.py:146 plugins/models.py:34 plugins/models.py:58
+#: plugins/models.py:80
+msgid "template"
+msgstr "Template"
+
+#: models.py:149
+msgid "Default template"
+msgstr "Standard-Template"
+
+#: models.py:151
+msgid "template used to display the gbobject"
+msgstr "Template, mit dem dieser Eintrag dargestellt wird"
+
+#: models.py:285
+msgid "gbobject"
+msgstr "Eintrag"
+
+#: models.py:286 plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:57
+#: templates/objectapp/base.html:40
+msgid "gbobjects"
+msgstr "Einträge"
+
+#: moderator.py:45 moderator.py:72
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Neuer Kommentar zu \"%(title)s\""
+
+#: admin/Objecttype.py:30
+msgid "tree path"
+msgstr "Pfad"
+
+#: admin/gbobject.py:27 plugins/admin.py:17
+#: templates/admin/objectapp/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Inhalt"
+
+#: admin/gbobject.py:29 plugins/admin.py:19
+msgid "Options"
+msgstr "Optionen"
+
+#: admin/gbobject.py:34 plugins/admin.py:24
+msgid "Privacy"
+msgstr "Privatsphäre"
+
+#: admin/gbobject.py:36 plugins/admin.py:26
+msgid "Discussion"
+msgstr "Diskussion"
+
+#: admin/gbobject.py:38 plugins/admin.py:28
+msgid "Publication"
+msgstr "Veröffentlichung"
+
+#: admin/gbobject.py:66
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i Wörter)"
+
+#: admin/gbobject.py:70
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i Kommentare)"
+
+#: admin/gbobject.py:86
+msgid "author(s)"
+msgstr "Autor(en)"
+
+#: admin/gbobject.py:99
+msgid "Objecttype(s)"
+msgstr "Kategorie(n)"
+
+#: admin/gbobject.py:111
+msgid "tag(s)"
+msgstr "Tag(s)"
+
+#: admin/gbobject.py:118
+msgid "site(s)"
+msgstr "Seite(n)"
+
+#: admin/gbobject.py:130
+msgid "is actual"
+msgstr "Ist aktuell"
+
+#: admin/gbobject.py:136
+msgid "is visible"
+msgstr "Ist sichtbar"
+
+#: admin/gbobject.py:141
+msgid "View"
+msgstr ""
+
+#: admin/gbobject.py:143
+msgid "View on site"
+msgstr "Im Browser öffnen"
+
+#: admin/gbobject.py:149 templates/objectapp/_gbobject_detail.html:64
+msgid "Unavailable"
+msgstr "Nicht verfügbar"
+
+#: admin/gbobject.py:153
+msgid "short url"
+msgstr "Kurze URL"
+
+#: admin/gbobject.py:207
+msgid "The selected gbobjects now belong to you."
+msgstr ""
+
+#: admin/gbobject.py:208
+msgid "Set the gbobjects to the user"
+msgstr "Ausgewählte Einträge dem aktuellem Benutzer zuordnen"
+
+#: admin/gbobject.py:214
+msgid "The selected gbobjects are now marked as published."
+msgstr ""
+
+#: admin/gbobject.py:215
+msgid "Set gbobjects selected as published"
+msgstr "Ausgewählte Einträge als öffentlich markieren"
+
+#: admin/gbobject.py:220
+msgid "The selected gbobjects are now marked as hidden."
+msgstr ""
+
+#: admin/gbobject.py:221
+msgid "Set gbobjects selected as hidden"
+msgstr "Ausgewählte Einträge als unsichtbar markieren"
+
+#: admin/gbobject.py:234
+msgid "The selected gbobjects have been tweeted."
+msgstr ""
+
+#: admin/gbobject.py:235
+msgid "Tweet gbobjects selected"
+msgstr "Ausgewählte Einträge twittern"
+
+#: admin/gbobject.py:240
+msgid "Comments are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:241
+msgid "Close the comments for selected gbobjects"
+msgstr "Kommentare für ausgewählte Einträge deaktivieren"
+
+#: admin/gbobject.py:247
+msgid "Linkbacks are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:248
+msgid "Close the linkbacks for selected gbobjects"
+msgstr "Schließen der Linkbacks für die ausgewählte Einträge"
+
+#: admin/gbobject.py:254
+msgid "The selected gbobjects are now set at the current date."
+msgstr ""
+
+#: admin/gbobject.py:255
+msgid "Put the selected gbobjects on top at the current date"
+msgstr "Setzen Sie die ausgewählten Einträge auf das aktuelle Datum"
+
+#: admin/gbobject.py:272
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d gbobjects."
+msgstr ""
+"%(directory)s Verzeichnis erfolgreich angepingt %(success)d Einträge."
+
+#: admin/gbobject.py:275
+msgid "Ping Directories for selected gbobjects"
+msgstr "Verzeichnisdienste mit ausgewählten Einträgen anpingen"
+
+#: admin/forms.py:20
+msgid "No parent Objecttype"
+msgstr "Keine Hauptkategorie"
+
+#: admin/forms.py:35
+msgid "A Objecttype cannot be parent of itself."
+msgstr "Eine Kategorie kann auf selbst sein referenzieren."
+
+#: admin/forms.py:46 plugins/menu.py:70 templates/objectapp/base.html:22
+#: templates/objectapp/Objecttype_list.html:6 templates/objectapp/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:49
+msgid "Objecttypes"
+msgstr "Kategorien"
+
+#: plugins/cms_app.py:12
+msgid "Objectapp App Hook"
+msgstr "Objectapp App Hook"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Sortierung"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Fortgeschritten"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected gbobjects"
+msgstr "Ausgewählte Einträge"
+
+#: plugins/cms_plugins.py:116 templates/objectapp/base.html:59
+msgid "Random gbobjects"
+msgstr "Zufällige Einträge"
+
+#: plugins/menu.py:19
+msgid "Objectapp Gbobject Menu"
+msgstr "Objectapp Eintragsmenü"
+
+#: plugins/menu.py:65
+msgid "Objectapp Objecttype Menu"
+msgstr "Objectapp Kategorie Menü"
+
+#: plugins/menu.py:82
+msgid "Objectapp Author Menu"
+msgstr "Objectapp Autor Menü"
+
+#: plugins/menu.py:87 templates/objectapp/author_list.html:6
+#: templates/objectapp/base.html:26 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Autoren"
+
+#: plugins/menu.py:100
+msgid "Objectapp Tag Menu"
+msgstr "Objectapp Tag Menu"
+
+#: plugins/menu.py:105 templates/admin/objectapp/widgets/quickpost.html:25
+#: templates/objectapp/_gbobject_detail.html:47 templates/objectapp/base.html:34
+#: templates/objectapp/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Tags"
+
+#: plugins/models.py:16
+msgid "Gbobject list (default)"
+msgstr "Liste der Einträge (Standard)"
+
+#: plugins/models.py:17
+msgid "Gbobject detailed"
+msgstr "Eintragsdetail"
+
+#: plugins/models.py:27
+msgid "include subobjecttypes"
+msgstr "Unterkategorien mit einbeziehen"
+
+#: plugins/models.py:33 plugins/models.py:79
+msgid "number of gbobjects"
+msgstr "Anzahl der Einträge"
+
+#: plugins/models.py:36 plugins/models.py:60 plugins/models.py:82
+msgid "Template used to display the plugin"
+msgstr "Template zur Anzeige des Plugins"
+
+#: plugins/models.py:51 plugins/models.py:73 plugins/models.py:85
+#, python-format
+msgid "%s gbobjects"
+msgstr "%s Einträge"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Fehler 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Seite nicht gefunden"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+"Entschuldigung, aber die angeforderte Seite konnte nicht gefunden werden."
+
+#: templates/404.html:15 templates/500.html:20
+msgid "Useful links"
+msgstr "Nützliche Links"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:24
+#: templates/500.html.py:25
+msgid "Blog index"
+msgstr "Blog Index"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:29
+#: templates/500.html.py:30 templates/objectapp/sitemap.html:4
+#: templates/objectapp/sitemap.html.py:7 templates/objectapp/skeleton.html:36
+#: templates/objectapp/skeleton.html.py:37
+msgid "Sitemap"
+msgstr "Sitemap"
+
+#: templates/404.html:31 templates/500.html:36 templates/objectapp/base.html:47
+msgid "Recent gbobjects"
+msgstr "Neuste Einträge"
+
+#: templates/404.html:36 templates/500.html:41 templates/objectapp/base.html:10
+msgid "Search"
+msgstr "Suche"
+
+#: templates/404.html:40 templates/500.html:45 templates/objectapp/base.html:13
+msgid "Keywords..."
+msgstr "Schlüsselwörter..."
+
+#: templates/500.html:10
+msgid "Error 500"
+msgstr "Fehler 500"
+
+#: templates/500.html:13 templates/500.html.py:16
+msgid "Server error"
+msgstr "Server-Fehler"
+
+#: templates/500.html:18
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"e-mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Es ist ein Fehler aufgetreten. Der Server-Admin wurde umgehend benachrichtig"
+" und wird sich in Kürze um den Fehler kümmern. Wir danken für Ihr "
+"Verständnis."
+
+#: templates/admin/objectapp/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Inhalt"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:5
+#: templates/objectapp/_gbobject_detail.html:69
+msgid "Discussions"
+msgstr "Diskussionen"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:10
+#, python-format
+msgid "%(gbobjects)s gbobjects"
+msgstr " %(gbobjects)s Einträge"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s Kommentare"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:22
+#, python-format
+msgid "%(objecttypes)s objecttypes"
+msgstr " %(objecttypes)s Kategorien"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr " %(pingbacks)s Pingbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr " %(tags)s Tags"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr " %(trackbacks)s Trackbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr " %(authors)s Autoren"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr " %(rejects)s abgelehnt"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:7
+#: templates/objectapp/gbobject_detail.html:186
+#: templates/objectapp/gbobject_detail.html:187
+msgid "Edit the gbobject"
+msgstr "Eintrag bearbeiten"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:10
+#: templates/comments/objectapp_gbobject_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/objectapp/_gbobject_detail.html:18
+#: templates/objectapp/gbobject_detail.html:91
+#: templates/objectapp/gbobject_detail.html:126
+#: templates/objectapp/gbobject_detail.html:157
+msgid "on"
+msgstr "am"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:16
+#: templates/comments/objectapp/gbobject/form.html:19
+msgid "Preview"
+msgstr "Vorschau"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:23
+msgid "No draft gbobjects."
+msgstr "Kein Entwurfs Einträge."
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:32
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:33
+msgid "View all draft gbobjects"
+msgstr "Alle Eintragsentwürfe anziegen"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:11
+#: templates/objectapp/_gbobject_detail.html:24
+#: templates/objectapp/tags/recent_comments.html:7
+#: templates/objectapp/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "in"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:14
+#: templates/objectapp/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Ihre Meinung zu"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Kommentar bearbeiten"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:24
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:31
+#: templates/objectapp/_gbobject_detail.html:77
+#: templates/objectapp/gbobject_detail.html:107
+#: templates/objectapp/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Keine Kommentare vorhanden."
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:40
+#: templates/admin/objectapp/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Verwalten Sie die Kommentare"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "mache eine LinkBack auf"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Bearbeiten Sie den LinkBack"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:26
+#: templates/objectapp/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Keine Linkbacks."
+
+#: templates/admin/objectapp/widgets/content_stats.html:6
+#: templates/admin/objectapp/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Heute"
+
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:6
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:7
+msgid "Draft gbobjects"
+msgstr "Eintragsentwürfe"
+
+#: templates/admin/objectapp/widgets/quickpost.html:5
+#: templates/admin/objectapp/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Schnelles Veröffentlichen"
+
+#: templates/admin/objectapp/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Titel"
+
+#: templates/admin/objectapp/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Als Entwurf speichern"
+
+#: templates/admin/objectapp/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Zurücksetzen"
+
+#: templates/admin/objectapp/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Veröffentlichen"
+
+#: templates/admin/objectapp/widgets/recent_comments.html:6
+#: templates/admin/objectapp/widgets/recent_comments.html:7
+#: templates/objectapp/base.html:51
+msgid "Recent comments"
+msgstr "Neueste Kommentare"
+
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:6
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:7
+#: templates/objectapp/base.html:55
+msgid "Recent linkbacks"
+msgstr "Aktuelle Linkbacks"
+
+#: templates/comments/comment_notification_email.txt:1
+#: templates/comments/comment_reply_email.txt:1
+#: templates/objectapp/gbobject_list.html:19
+msgid "Author"
+msgstr "Autor"
+
+#: templates/comments/comment_notification_email.txt:2
+msgid "Email"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:3
+msgid "IP"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:5
+#: templates/comments/comment_reply_email.txt:3
+msgid "Comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:8
+#: templates/comments/comment_reply_email.txt:6
+msgid "View this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:10
+msgid "Flag this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:12
+msgid "Delete this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:14
+msgid "Approve this comment"
+msgstr ""
+
+#: templates/comments/objectapp_gbobject_preview.html:4
+msgid "Comment preview"
+msgstr "Kommentarvorschau"
+
+#: templates/comments/objectapp_gbobject_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Bitte korrigieren Sie folgenden Fehler."
+msgstr[1] "Bitte korrigieren Sie folgende Fehler."
+
+#: templates/comments/objectapp_gbobject_preview.html:12
+msgid "Preview of the comment"
+msgstr "Kommentarvorschau einblenden"
+
+#: templates/comments/objectapp/gbobject/form.html:7
+msgid "Post your comment"
+msgstr "Kommentar schreiben"
+
+#: templates/comments/objectapp/gbobject/form.html:18
+msgid "Post"
+msgstr "Abschicken"
+
+#: templates/comments/objectapp/gbobject/posted.html:4
+#: templates/comments/objectapp/gbobject/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Danke für Ihren Kommentar"
+
+#: templates/comments/objectapp/gbobject/posted.html:9
+#: templates/comments/objectapp/gbobject/posted.html:10
+msgid "Return to gbobject list"
+msgstr "Zur Liste der Einträge zurückkehren"
+
+#: templates/objectapp/_gbobject_detail.html:11
+msgid "Written by"
+msgstr "Geschrieben von"
+
+#: templates/objectapp/_gbobject_detail.html:15
+#, python-format
+msgid "Show %(author)s gbobjects"
+msgstr "Zeige Einträge von %(author)s"
+
+#: templates/objectapp/_gbobject_detail.html:20
+msgid "Written on"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:53
+msgid "No tags"
+msgstr "Keine Tags"
+
+#: templates/objectapp/_gbobject_detail.html:58
+msgid "Short url"
+msgstr "Kurze URL"
+
+#: templates/objectapp/_gbobject_detail.html:73
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] " %(comment_count)s Kommentar"
+msgstr[1] " %(comment_count)s Kommentare"
+
+#: templates/objectapp/_gbobject_detail.html:79
+msgid "Be first to comment!"
+msgstr "Schreiben den ersten Kommentar!"
+
+#: templates/objectapp/_gbobject_detail.html:82
+#: templates/objectapp/gbobject_detail.html:103
+#: templates/objectapp/gbobject_detail.html:109
+msgid "Comments are closed."
+msgstr "Kommentare deaktiviert."
+
+#: templates/objectapp/_gbobject_detail.html:89
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] " %(pingback_count)s Pingback"
+msgstr[1] " %(pingback_count)s Pingbacks"
+
+#: templates/objectapp/_gbobject_detail.html:96
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] " %(trackback_count)s Trackback"
+msgstr[1] " %(trackback_count)s Trackbacks"
+
+#: templates/objectapp/author_list.html:4 templates/objectapp/author_list.html:9
+msgid "Author list"
+msgstr "Autorenliste"
+
+#: templates/objectapp/author_list.html:18 templates/objectapp/Objecttype_list.html:14
+#: templates/objectapp/sitemap.html:55 templates/objectapp/tag_list.html:16
+#: templates/objectapp/tags/authors.html:8
+#: templates/objectapp/tags/objecttypes.html:6
+#, python-format
+msgid "%(gbobject_count)s gbobject"
+msgid_plural "%(gbobject_count)s gbobjects"
+msgstr[0] " %(gbobject_count)s Eintrag"
+msgstr[1] " %(gbobject_count)s Einträge"
+
+#: templates/objectapp/base.html:15
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for"
+" complex searchs."
+msgstr ""
+"Sie können, um Worte oder Sätze, \"Anführungszeichen\" für genaue Sätze "
+"und/oder die UND / ODER boolschen Operatoren mit Klammern für komplexe Suche"
+" kombiniert verwenden."
+
+#: templates/objectapp/base.html:30
+msgid "Calendar"
+msgstr "Kalender"
+
+#: templates/objectapp/base.html:63
+msgid "Popular gbobjects"
+msgstr "Beliebte Einträge"
+
+#: templates/objectapp/base.html:67 templates/objectapp/gbobject_archive_day.html:4
+#: templates/objectapp/gbobject_archive_day.html:6
+#: templates/objectapp/gbobject_archive_day.html:9
+#: templates/objectapp/gbobject_archive_month.html:4
+#: templates/objectapp/gbobject_archive_month.html:6
+#: templates/objectapp/gbobject_archive_month.html:9
+#: templates/objectapp/gbobject_archive_year.html:4
+#: templates/objectapp/gbobject_archive_year.html:6
+#: templates/objectapp/gbobject_archive_year.html:9
+#: templates/objectapp/tags/archives_gbobjects.html:5
+#: templates/objectapp/tags/archives_gbobjects_link.html:2
+#: templates/objectapp/tags/archives_gbobjects_tree.html:7
+#: templates/objectapp/tags/archives_gbobjects_tree.html:14
+#: templates/objectapp/tags/archives_gbobjects_tree.html:24
+msgid "Archives"
+msgstr "Archiv"
+
+#: templates/objectapp/base.html:72
+msgid "Tools"
+msgstr "Werkzeuge"
+
+#: templates/objectapp/base.html:76 templates/objectapp/base.html.py:77
+msgid "Dashboard"
+msgstr "Dashboard"
+
+#: templates/objectapp/base.html:83 templates/objectapp/base.html.py:84
+msgid "Post an gbobject"
+msgstr "Schreibe einen Eintrag"
+
+#: templates/objectapp/base.html:91 templates/objectapp/base.html.py:92
+msgid "Log out"
+msgstr "Abmelden"
+
+#: templates/objectapp/Objecttype_list.html:4 templates/objectapp/Objecttype_list.html:9
+msgid "Objecttype list"
+msgstr "Kategorieliste"
+
+#: templates/objectapp/gbobject_archive_month.html:13
+msgid "Daily archives"
+msgstr "Tagesarchiv"
+
+#: templates/objectapp/gbobject_archive_year.html:13
+#: templates/objectapp/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Monatliche Archive"
+
+#: templates/objectapp/gbobject_detail.html:10
+msgid "RSS Feed of discussions on"
+msgstr "RSS-Feed der Diskussionen auf"
+
+#: templates/objectapp/gbobject_detail.html:11
+msgid "RSS Feed of comments on"
+msgstr "RSS-Feed mit Kommentaren zu"
+
+#: templates/objectapp/gbobject_detail.html:12
+msgid "RSS Feed of pingbacks on"
+msgstr "RSS-Feed auf den Pingbacks"
+
+#: templates/objectapp/gbobject_detail.html:13
+msgid "RSS Feed of trackbacks on"
+msgstr "RSS-Feed auf Trackbacks ist an."
+
+#: templates/objectapp/gbobject_detail.html:29
+msgid "Next gbobject"
+msgstr "Nächster Eintrag"
+
+#: templates/objectapp/gbobject_detail.html:43
+msgid "Previous gbobject"
+msgstr "Vorheriger Eintrag"
+
+#: templates/objectapp/gbobject_detail.html:56
+msgid "Related gbobjects"
+msgstr "Verwandte Einträge"
+
+#: templates/objectapp/gbobject_detail.html:67
+msgid "Similar gbobjects"
+msgstr "Ähnliche Einträge"
+
+#: templates/objectapp/gbobject_detail.html:75
+msgid "Comments"
+msgstr "Kommentare"
+
+#: templates/objectapp/gbobject_detail.html:117
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/objectapp/gbobject_detail.html:139
+msgid "Pingbacks are open."
+msgstr "Pingbacks sind aktiviert."
+
+#: templates/objectapp/gbobject_detail.html:141
+msgid "Pingbacks are closed."
+msgstr "Pingbacks sind deaktiviert."
+
+#: templates/objectapp/gbobject_detail.html:148
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/objectapp/gbobject_detail.html:170
+msgid "Trackback URL"
+msgstr "Trackback-URL"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "Latest gbobjects for"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the Objecttype"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4 templates/objectapp/gbobject_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:9 templates/objectapp/gbobject_list.html:12
+#: templates/objectapp/gbobject_list.html:15 templates/objectapp/skeleton.html:40
+msgid "RSS Feed"
+msgstr "RSS-Feed"
+
+#: templates/objectapp/gbobject_list.html:19
+msgid "Objecttype"
+msgstr "Kategorie"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_list.html:30
+msgid "Tag"
+msgstr "Tag"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_search.html:4
+msgid "Page"
+msgstr "Seite"
+
+#: templates/objectapp/gbobject_list.html:34
+#, python-format
+msgid "Gbobjects by %(author)s"
+msgstr "Einträge von %(author)s"
+
+#: templates/objectapp/gbobject_list.html:45 templates/objectapp/sitemap.html:23
+#: templates/objectapp/sitemap.html.py:43
+#: templates/objectapp/cms/gbobject_detail.html:12
+#: templates/objectapp/cms/gbobject_list.html:9
+#: templates/objectapp/tags/featured_gbobjects.html:9
+#: templates/objectapp/tags/popular_gbobjects.html:13
+#: templates/objectapp/tags/random_gbobjects.html:9
+#: templates/objectapp/tags/recent_gbobjects.html:9
+msgid "No gbobjects yet."
+msgstr "Keine Einträge vorhanden."
+
+#: templates/objectapp/gbobject_list.html:51 templates/objectapp/gbobject_search.html:40
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Seite %(current_page)s von %(total_page)s "
+
+#: templates/objectapp/gbobject_list.html:56 templates/objectapp/gbobject_search.html:45
+msgid "More recent gbobjects"
+msgstr "Mehr neuste Einträge"
+
+#: templates/objectapp/gbobject_list.html:65 templates/objectapp/gbobject_search.html:54
+msgid "Gbobjects page"
+msgstr "Einträge der Seite"
+
+#: templates/objectapp/gbobject_list.html:72 templates/objectapp/gbobject_search.html:61
+msgid "More old gbobjects"
+msgstr "Mehr alte Einträge"
+
+#: templates/objectapp/gbobject_list.html:82 templates/objectapp/gbobject_list.html:83
+msgid "Edit the Objecttype"
+msgstr "Kategorie bearbeiten"
+
+#: templates/objectapp/gbobject_list.html:89 templates/objectapp/gbobject_list.html:90
+msgid "Edit the tag"
+msgstr "Tag bearbeiten"
+
+#: templates/objectapp/gbobject_list.html:96 templates/objectapp/gbobject_list.html:97
+msgid "Edit the author"
+msgstr "Autor bearbeiten"
+
+#: templates/objectapp/gbobject_search.html:4 templates/objectapp/gbobject_search.html:6
+#: templates/objectapp/gbobject_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/objectapp/gbobject_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "RSS-Feed mit Suchergebnissen zu"
+
+#: templates/objectapp/gbobject_search.html:22
+#, python-format
+msgid "%(gbobject_count)s gbobject found"
+msgid_plural "%(gbobject_count)s gbobjects found"
+msgstr[0] "%(gbobject_count)s Eintrag gefunden"
+msgstr[1] "%(gbobject_count)s Einträge gefunden"
+
+#: templates/objectapp/gbobject_search.html:34
+msgid "Nothing found."
+msgstr "Nichts gefunden."
+
+#: templates/objectapp/login.html:4 templates/objectapp/login.html.py:7
+msgid "Login required"
+msgstr "Anmeldung erforderlich"
+
+#: templates/objectapp/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+"Ihr Benutzername und Passwort stimmen nicht überein. Bitte versuchen Sie es "
+"erneut."
+
+#: templates/objectapp/login.html:16
+msgid "You need to be connected to view this gbobject."
+msgstr "Sie müssen eingeloggt sein um diesen Eintrag zu sehen."
+
+#: templates/objectapp/login.html:33
+msgid "Login"
+msgstr "Login"
+
+#: templates/objectapp/password.html:4 templates/objectapp/password.html.py:7
+msgid "Password required"
+msgstr "Passwort erforderlich"
+
+#: templates/objectapp/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "Das Kennwort ist ungültig. Bitte versuchen Sie es erneut."
+
+#: templates/objectapp/password.html:16
+msgid "You need to provide a password to view this gbobject."
+msgstr "Sie benötigen ein Passwort um diesen Eintrag lesen zu können."
+
+#: templates/objectapp/password.html:23
+msgid "Password"
+msgstr "Passwort"
+
+#: templates/objectapp/password.html:28
+msgid "Valid"
+msgstr "Gültig"
+
+#: templates/objectapp/sitemap.html:10
+msgid "Gbobjects per objecttypes"
+msgstr "Einträge pro Kategorien"
+
+#: templates/objectapp/sitemap.html:18 templates/objectapp/sitemap.html.py:38
+#: templates/objectapp/tags/popular_gbobjects.html:8
+msgid "comment"
+msgstr "Kommentar"
+
+#: templates/objectapp/sitemap.html:31
+msgid "All the gbobjects"
+msgstr "Alle Einträge"
+
+#: templates/objectapp/sitemap.html:60 templates/objectapp/tags/objecttypes.html:11
+msgid "No objecttypes yet."
+msgstr "Keine Kategorien vorhanden."
+
+#: templates/objectapp/skeleton.html:27 templates/objectapp/skeleton.html.py:39
+msgid "RSS Feed of latest gbobjects"
+msgstr "RSS-Feed der neuesten Einträge"
+
+#: templates/objectapp/tag_list.html:4 templates/objectapp/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Tag-Liste"
+
+#: templates/objectapp/wlwmanifest.xml:40
+msgid "View site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:41
+msgid "Admin. site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:53
+msgid "Manage comments"
+msgstr ""
+
+#: templates/objectapp/tags/archives_gbobjects.html:12
+#: templates/objectapp/tags/archives_gbobjects_tree.html:38
+msgid "No archives yet."
+msgstr "Kein Archiv vorhanden."
+
+#: templates/objectapp/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Keine Autoren vorhanden."
+
+#: templates/objectapp/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkback auf"
+
+#: templates/objectapp/tags/similar_gbobjects.html:9
+msgid "No similar gbobjects."
+msgstr "Keine ähnlichen Einträge."
+
+#: tests/views.py:165 views/search.py:18
+msgid "The pattern is too short"
+msgstr "Der Suchbegriff ist zu kurz"
+
+#: tests/views.py:168 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Kein Suchbegriff gegeben"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Benutzername ist falsch."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Kennwort ist ungültig."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Benutzerkonto nicht verfügbar."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "Benutzer kann nicht %s."
+
+#: xmlrpc/pingback.py:93
+msgid "No title"
+msgstr "Kein Titel"
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/es/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/objectapp/locale/es/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..50a02a9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/es/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/es/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/objectapp/locale/es/LC_MESSAGES/django.po
new file mode 100644
index 0000000..cd66c90
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/es/LC_MESSAGES/django.po
@@ -0,0 +1,1199 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# igalarzab <igalarzab@gmail.com>, 2011.
+# Julien Fache <fantomas42@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-blog-objectapp\n"
+"Report-Msgid-Bugs-To: https://github.com/Fantomas42/django-blog-objectapp/issues\n"
+"POT-Creation-Date: 2011-04-12 13:21-0500\n"
+"PO-Revision-Date: 2011-04-23 12:47+0000\n"
+"Last-Translator: igalarzab <igalarzab@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:102 plugins/cms_plugins.py:23
+#: templates/objectapp/gbobject_archive.html:4
+#: templates/objectapp/gbobject_archive.html:25 templates/objectapp/gbobject_list.html:19
+#: tests/feeds.py:115
+msgid "Latest gbobjects"
+msgstr "Últimas entradas"
+
+#: feeds.py:106 tests/feeds.py:117
+#, python-format
+msgid "The latest gbobjects for the site %s"
+msgstr "Las últimas entradas del sitio %s"
+
+#: feeds.py:126 tests/feeds.py:126
+#, python-format
+msgid "Gbobjects for the Objecttype %s"
+msgstr "Entradas de la categoría %s"
+
+#: feeds.py:130 tests/feeds.py:128
+#, python-format
+msgid "The latest gbobjects for the Objecttype %s"
+msgstr "Las últimas entradas de la categoría %s"
+
+#: feeds.py:150 tests/feeds.py:137
+#, python-format
+msgid "Gbobjects for author %s"
+msgstr "Entradas del autor %s"
+
+#: feeds.py:154 tests/feeds.py:139
+#, python-format
+msgid "The latest gbobjects by %s"
+msgstr "Las últimas entradas de %s"
+
+#: feeds.py:175 tests/feeds.py:149
+#, python-format
+msgid "Gbobjects for the tag %s"
+msgstr "Entradas del tag %s"
+
+#: feeds.py:179 tests/feeds.py:151
+#, python-format
+msgid "The latest gbobjects for the tag %s"
+msgstr "Las últimas entradas del tag %s"
+
+#: feeds.py:199 tests/feeds.py:160
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr "Resultados de la búsqueda '%s'"
+
+#: feeds.py:203 tests/feeds.py:162
+#, python-format
+msgid "The gbobjects containing the pattern '%s'"
+msgstr "Entradas que contienen el patron '%s'"
+
+#: feeds.py:245 tests/feeds.py:178
+#, python-format
+msgid "Discussions on %s"
+msgstr "Debate en %s"
+
+#: feeds.py:249 tests/feeds.py:180
+#, python-format
+msgid "The latest discussions for the gbobject %s"
+msgstr "Los últimos debates de la entrada %s"
+
+#: feeds.py:267 tests/feeds.py:190
+#, python-format
+msgid "Comments on %s"
+msgstr "Comentarios en %s"
+
+#: feeds.py:271 tests/feeds.py:192
+#, python-format
+msgid "The latest comments for the gbobject %s"
+msgstr "Los últimos comentarios de la entrada %s"
+
+#: feeds.py:301 tests/feeds.py:206
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks en %s"
+
+#: feeds.py:305 tests/feeds.py:208
+#, python-format
+msgid "The latest pingbacks for the gbobject %s"
+msgstr "Los últimos pingbacks de la entrada %s"
+
+#: feeds.py:323 tests/feeds.py:218
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks en %s"
+
+#: feeds.py:327 tests/feeds.py:220
+#, python-format
+msgid "The latest trackbacks for the gbobject %s"
+msgstr "Los últimos trackbacks de la entrada %s"
+
+#: models.py:64 models.py:105 admin/gbobject.py:73
+msgid "title"
+msgstr "título"
+
+#: models.py:65 models.py:119
+msgid "used for publication"
+msgstr "usado para la publicación"
+
+#: models.py:67
+msgid "description"
+msgstr "descripción"
+
+#: models.py:70 admin/forms.py:18
+msgid "parent Objecttype"
+msgstr "categoría padre"
+
+#: models.py:95
+msgid "Objecttype"
+msgstr "categoría"
+
+#: models.py:96 models.py:114 admin/forms.py:47 plugins/models.py:24
+msgid "objecttypes"
+msgstr "categorías"
+
+#: models.py:101
+msgid "draft"
+msgstr "borrador"
+
+#: models.py:102
+msgid "hidden"
+msgstr "oculto"
+
+#: models.py:103
+msgid "published"
+msgstr "publicado"
+
+#: models.py:107
+msgid "image"
+msgstr "imagen"
+
+#: models.py:108
+msgid "used for illustration"
+msgstr "utilizado como ilustración"
+
+#: models.py:109
+msgid "content"
+msgstr "contenido"
+
+#: models.py:110
+msgid "excerpt"
+msgstr "extracto"
+
+#: models.py:111
+msgid "optional element"
+msgstr "elemento opcional"
+
+#: models.py:113 plugins/models.py:30
+msgid "tags"
+msgstr "tags"
+
+#: models.py:116
+msgid "related gbobjects"
+msgstr "entradas relacionadas"
+
+#: models.py:123 plugins/models.py:28
+msgid "authors"
+msgstr "autores"
+
+#: models.py:126
+msgid "featured"
+msgstr "destacada"
+
+#: models.py:127 admin/gbobject.py:124
+msgid "comment enabled"
+msgstr "comentarios habilitados"
+
+#: models.py:128
+msgid "linkback enabled"
+msgstr "linkbacks habilitados"
+
+#: models.py:130
+msgid "creation date"
+msgstr "fecha de creación"
+
+#: models.py:131
+msgid "last update"
+msgstr "última actualización"
+
+#: models.py:132
+msgid "start publication"
+msgstr "comienzo de la publicación"
+
+#: models.py:133
+msgid "date start publish"
+msgstr "fecha de comienzo de la publicación"
+
+#: models.py:135
+msgid "end publication"
+msgstr "fin de la publicación"
+
+#: models.py:136
+msgid "date end publish"
+msgstr "Fecha de cierre de la publicación"
+
+#: models.py:139
+msgid "sites publication"
+msgstr "publicaciones del sitio"
+
+#: models.py:141
+msgid "login required"
+msgstr "identificación requerida"
+
+#: models.py:142
+msgid "only authenticated users can view the gbobject"
+msgstr "sólo los usuarios identificados pueden ver la entrada"
+
+#: models.py:143
+msgid "password"
+msgstr "contraseña"
+
+#: models.py:144
+msgid "protect the gbobject with a password"
+msgstr "protege la entrada con una contraseña"
+
+#: models.py:146 plugins/models.py:34 plugins/models.py:58
+#: plugins/models.py:80
+msgid "template"
+msgstr "plantilla"
+
+#: models.py:149
+msgid "Default template"
+msgstr "Plantilla predeterminada"
+
+#: models.py:151
+msgid "template used to display the gbobject"
+msgstr "plantilla usada para la entrada"
+
+#: models.py:285
+msgid "gbobject"
+msgstr "entrada"
+
+#: models.py:286 plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:57
+#: templates/objectapp/base.html:40
+msgid "gbobjects"
+msgstr "entradas"
+
+#: moderator.py:45 moderator.py:72
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Nuevo comentario en \"%(title)s\""
+
+#: admin/Objecttype.py:30
+msgid "tree path"
+msgstr "árbol de categorías"
+
+#: admin/gbobject.py:27 plugins/admin.py:17
+#: templates/admin/objectapp/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Contenido"
+
+#: admin/gbobject.py:29 plugins/admin.py:19
+msgid "Options"
+msgstr "Opciones"
+
+#: admin/gbobject.py:34 plugins/admin.py:24
+msgid "Privacy"
+msgstr "Privacidad"
+
+#: admin/gbobject.py:36 plugins/admin.py:26
+msgid "Discussion"
+msgstr "Debates"
+
+#: admin/gbobject.py:38 plugins/admin.py:28
+msgid "Publication"
+msgstr "Publicación"
+
+#: admin/gbobject.py:66
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i palabras)"
+
+#: admin/gbobject.py:70
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i comentarios)"
+
+#: admin/gbobject.py:86
+msgid "author(s)"
+msgstr "autor(es)"
+
+#: admin/gbobject.py:99
+msgid "Objecttype(s)"
+msgstr "categoría(s)"
+
+#: admin/gbobject.py:111
+msgid "tag(s)"
+msgstr "tag(s)"
+
+#: admin/gbobject.py:118
+msgid "site(s)"
+msgstr "sitio(s)"
+
+#: admin/gbobject.py:130
+msgid "is actual"
+msgstr "es actual?"
+
+#: admin/gbobject.py:136
+msgid "is visible"
+msgstr "es visible?"
+
+#: admin/gbobject.py:141
+msgid "View"
+msgstr "Ver"
+
+#: admin/gbobject.py:143
+msgid "View on site"
+msgstr "Ver en el sitio"
+
+#: admin/gbobject.py:149 templates/objectapp/_gbobject_detail.html:64
+msgid "Unavailable"
+msgstr "No disponible"
+
+#: admin/gbobject.py:153
+msgid "short url"
+msgstr "url corta"
+
+#: admin/gbobject.py:207
+msgid "The selected gbobjects now belong to you."
+msgstr "Las entradas seleccionadas ahora son tuyas."
+
+#: admin/gbobject.py:208
+msgid "Set the gbobjects to the user"
+msgstr "Asignar las entradas al usuario"
+
+#: admin/gbobject.py:214
+msgid "The selected gbobjects are now marked as published."
+msgstr "Las entradas seleccionadas han sido marcadas como publicadas."
+
+#: admin/gbobject.py:215
+msgid "Set gbobjects selected as published"
+msgstr "Publicar las entradas seleccionadas"
+
+#: admin/gbobject.py:220
+msgid "The selected gbobjects are now marked as hidden."
+msgstr "Las entradas seleccionadas han sido marcadas como ocultas."
+
+#: admin/gbobject.py:221
+msgid "Set gbobjects selected as hidden"
+msgstr "Ocultar las entradas seleccionadas"
+
+#: admin/gbobject.py:234
+msgid "The selected gbobjects have been tweeted."
+msgstr "Las entradas marcadas han sido twitteadas."
+
+#: admin/gbobject.py:235
+msgid "Tweet gbobjects selected"
+msgstr "Twittear las entradas seleccionadas"
+
+#: admin/gbobject.py:240
+msgid "Comments are now closed for selected gbobjects."
+msgstr "Los comentarios en las entradas marcadas han sido cerrados."
+
+#: admin/gbobject.py:241
+msgid "Close the comments for selected gbobjects"
+msgstr "Cerrar los comentarios de las entradas seleccionadas"
+
+#: admin/gbobject.py:247
+msgid "Linkbacks are now closed for selected gbobjects."
+msgstr "Los linkbacks en las entradas marcadas han sido cerrados."
+
+#: admin/gbobject.py:248
+msgid "Close the linkbacks for selected gbobjects"
+msgstr "Cerrar los linkbacks de las entradas seleccionadas"
+
+#: admin/gbobject.py:254
+msgid "The selected gbobjects are now set at the current date."
+msgstr ""
+"Las fechas de las entradas seleccionadas han sido puestas al momento actual."
+
+#: admin/gbobject.py:255
+msgid "Put the selected gbobjects on top at the current date"
+msgstr "Poner las fechas de las entradas seleccionadas al momento actual"
+
+#: admin/gbobject.py:272
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d gbobjects."
+msgstr ""
+"El directorio %(directory)s ha realizado un ping correctamente a %(success)d"
+" entradas."
+
+#: admin/gbobject.py:275
+msgid "Ping Directories for selected gbobjects"
+msgstr "Ping directorios para las entradas seleccionadas"
+
+#: admin/forms.py:20
+msgid "No parent Objecttype"
+msgstr "No hay categoría padre"
+
+#: admin/forms.py:35
+msgid "A Objecttype cannot be parent of itself."
+msgstr "Una categoría no puede ser padre de si misma."
+
+#: admin/forms.py:46 plugins/menu.py:70 templates/objectapp/base.html:22
+#: templates/objectapp/Objecttype_list.html:6 templates/objectapp/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:49
+msgid "Objecttypes"
+msgstr "Categorías"
+
+#: plugins/cms_app.py:12
+msgid "Objectapp App Hook"
+msgstr "Aplicación Objectapp"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Ordenaci´n"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Avanzado"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected gbobjects"
+msgstr "Entradas seleccionadas"
+
+#: plugins/cms_plugins.py:116 templates/objectapp/base.html:59
+msgid "Random gbobjects"
+msgstr "Entradas al azar"
+
+#: plugins/menu.py:19
+msgid "Objectapp Gbobject Menu"
+msgstr "Menú de entradas Objectapp "
+
+#: plugins/menu.py:65
+msgid "Objectapp Objecttype Menu"
+msgstr "Menú Categoría Objectapp"
+
+#: plugins/menu.py:82
+msgid "Objectapp Author Menu"
+msgstr "Menú Autor Objectapp"
+
+#: plugins/menu.py:87 templates/objectapp/author_list.html:6
+#: templates/objectapp/base.html:26 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Autores"
+
+#: plugins/menu.py:100
+msgid "Objectapp Tag Menu"
+msgstr "Menú Tag Objectapp"
+
+#: plugins/menu.py:105 templates/admin/objectapp/widgets/quickpost.html:25
+#: templates/objectapp/_gbobject_detail.html:47 templates/objectapp/base.html:34
+#: templates/objectapp/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Tags"
+
+#: plugins/models.py:16
+msgid "Gbobject list (default)"
+msgstr "Lista de entradas (por defecto)"
+
+#: plugins/models.py:17
+msgid "Gbobject detailed"
+msgstr "Detalle de la entrada"
+
+#: plugins/models.py:27
+msgid "include subobjecttypes"
+msgstr "incluir subcategorías"
+
+#: plugins/models.py:33 plugins/models.py:79
+msgid "number of gbobjects"
+msgstr "Número de entradas"
+
+#: plugins/models.py:36 plugins/models.py:60 plugins/models.py:82
+msgid "Template used to display the plugin"
+msgstr "Plantilla utilizada para mostrar el plugin "
+
+#: plugins/models.py:51 plugins/models.py:73 plugins/models.py:85
+#, python-format
+msgid "%s gbobjects"
+msgstr "%s entradas"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Error 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "La página solicitada no pudo ser encontrada."
+
+#: templates/404.html:15 templates/500.html:20
+msgid "Useful links"
+msgstr "Enlaces útiles"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:24
+#: templates/500.html.py:25
+msgid "Blog index"
+msgstr "Inicio del blog"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:29
+#: templates/500.html.py:30 templates/objectapp/sitemap.html:4
+#: templates/objectapp/sitemap.html.py:7 templates/objectapp/skeleton.html:36
+#: templates/objectapp/skeleton.html.py:37
+msgid "Sitemap"
+msgstr "Sitemap"
+
+#: templates/404.html:31 templates/500.html:36 templates/objectapp/base.html:47
+msgid "Recent gbobjects"
+msgstr "Entradas recientes"
+
+#: templates/404.html:36 templates/500.html:41 templates/objectapp/base.html:10
+msgid "Search"
+msgstr "Buscar"
+
+#: templates/404.html:40 templates/500.html:45 templates/objectapp/base.html:13
+msgid "Keywords..."
+msgstr "Palabras clave..."
+
+#: templates/500.html:10
+msgid "Error 500"
+msgstr "Error 500"
+
+#: templates/500.html:13 templates/500.html.py:16
+msgid "Server error"
+msgstr "Error del Servidor"
+
+#: templates/500.html:18
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"e-mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ha ocurrido un error. Ha sido reportado al administrador de la web por "
+"email. Intentaremos solucionarlo con la mayor brevedad posible. Gracias por "
+"tu paciencia."
+
+#: templates/admin/objectapp/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Contenido"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:5
+#: templates/objectapp/_gbobject_detail.html:69
+msgid "Discussions"
+msgstr "Debates"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:10
+#, python-format
+msgid "%(gbobjects)s gbobjects"
+msgstr "%(gbobjects)s entradas"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s comentarios"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:22
+#, python-format
+msgid "%(objecttypes)s objecttypes"
+msgstr "%(objecttypes)s categorías"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s pingbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s tags"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s trackbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s autores"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s rechazadas"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:7
+#: templates/objectapp/gbobject_detail.html:186
+#: templates/objectapp/gbobject_detail.html:187
+msgid "Edit the gbobject"
+msgstr "Editar la entrada"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:10
+#: templates/comments/objectapp_gbobject_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/objectapp/_gbobject_detail.html:18
+#: templates/objectapp/gbobject_detail.html:91
+#: templates/objectapp/gbobject_detail.html:126
+#: templates/objectapp/gbobject_detail.html:157
+msgid "on"
+msgstr "en"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:16
+#: templates/comments/objectapp/gbobject/form.html:19
+msgid "Preview"
+msgstr "Previsualizar"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:23
+msgid "No draft gbobjects."
+msgstr "No hay borradores."
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:32
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:33
+msgid "View all draft gbobjects"
+msgstr "Ver todos los borradores"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:11
+#: templates/objectapp/_gbobject_detail.html:24
+#: templates/objectapp/tags/recent_comments.html:7
+#: templates/objectapp/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "en"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:14
+#: templates/objectapp/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Comentarios en"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Editar el comentario"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:24
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Editar"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:31
+#: templates/objectapp/_gbobject_detail.html:77
+#: templates/objectapp/gbobject_detail.html:107
+#: templates/objectapp/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "No hay comentarios."
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:40
+#: templates/admin/objectapp/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Administra los comentarios"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "Crea un linkback en"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Edita el linkback"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:26
+#: templates/objectapp/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "No hay linkbacks."
+
+#: templates/admin/objectapp/widgets/content_stats.html:6
+#: templates/admin/objectapp/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Hoy"
+
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:6
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:7
+msgid "Draft gbobjects"
+msgstr "Borradores"
+
+#: templates/admin/objectapp/widgets/quickpost.html:5
+#: templates/admin/objectapp/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Publicación rápida"
+
+#: templates/admin/objectapp/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Título"
+
+#: templates/admin/objectapp/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Guardado como borrador"
+
+#: templates/admin/objectapp/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Resetear"
+
+#: templates/admin/objectapp/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Publicar"
+
+#: templates/admin/objectapp/widgets/recent_comments.html:6
+#: templates/admin/objectapp/widgets/recent_comments.html:7
+#: templates/objectapp/base.html:51
+msgid "Recent comments"
+msgstr "Comentarios recientes"
+
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:6
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:7
+#: templates/objectapp/base.html:55
+msgid "Recent linkbacks"
+msgstr "Linkbacks recientes"
+
+#: templates/comments/comment_notification_email.txt:1
+#: templates/comments/comment_reply_email.txt:1
+#: templates/objectapp/gbobject_list.html:19
+msgid "Author"
+msgstr "Autor"
+
+#: templates/comments/comment_notification_email.txt:2
+msgid "Email"
+msgstr "Email"
+
+#: templates/comments/comment_notification_email.txt:3
+msgid "IP"
+msgstr "IP"
+
+#: templates/comments/comment_notification_email.txt:5
+#: templates/comments/comment_reply_email.txt:3
+msgid "Comment"
+msgstr "Comentario"
+
+#: templates/comments/comment_notification_email.txt:8
+#: templates/comments/comment_reply_email.txt:6
+msgid "View this comment"
+msgstr "Ver este comentario"
+
+#: templates/comments/comment_notification_email.txt:10
+msgid "Flag this comment"
+msgstr "Marcar este comentario"
+
+#: templates/comments/comment_notification_email.txt:12
+msgid "Delete this comment"
+msgstr "Borrar este comentario"
+
+#: templates/comments/comment_notification_email.txt:14
+msgid "Approve this comment"
+msgstr "Aprobar este comentario"
+
+#: templates/comments/objectapp_gbobject_preview.html:4
+msgid "Comment preview"
+msgstr "Previsualizar el comentario"
+
+#: templates/comments/objectapp_gbobject_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Por favor corrije el siguiente error."
+msgstr[1] "Por favor corrige los siguientes errores."
+
+#: templates/comments/objectapp_gbobject_preview.html:12
+msgid "Preview of the comment"
+msgstr "Previsualización del comentario"
+
+#: templates/comments/objectapp/gbobject/form.html:7
+msgid "Post your comment"
+msgstr "Escribe un comentario"
+
+#: templates/comments/objectapp/gbobject/form.html:18
+msgid "Post"
+msgstr "Post"
+
+#: templates/comments/objectapp/gbobject/posted.html:4
+#: templates/comments/objectapp/gbobject/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Gracias por el comentario"
+
+#: templates/comments/objectapp/gbobject/posted.html:9
+#: templates/comments/objectapp/gbobject/posted.html:10
+msgid "Return to gbobject list"
+msgstr "Volver a la lista de entradas"
+
+#: templates/objectapp/_gbobject_detail.html:11
+msgid "Written by"
+msgstr "Escrito por"
+
+#: templates/objectapp/_gbobject_detail.html:15
+#, python-format
+msgid "Show %(author)s gbobjects"
+msgstr "Mostrar las entradas de %(author)s"
+
+#: templates/objectapp/_gbobject_detail.html:20
+msgid "Written on"
+msgstr "Escrito en"
+
+#: templates/objectapp/_gbobject_detail.html:53
+msgid "No tags"
+msgstr "Sin tags"
+
+#: templates/objectapp/_gbobject_detail.html:58
+msgid "Short url"
+msgstr "Url corta"
+
+#: templates/objectapp/_gbobject_detail.html:73
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s comentario"
+msgstr[1] "%(comment_count)s commentarios"
+
+#: templates/objectapp/_gbobject_detail.html:79
+msgid "Be first to comment!"
+msgstr "¡Se el primero en escribir un comentario!"
+
+#: templates/objectapp/_gbobject_detail.html:82
+#: templates/objectapp/gbobject_detail.html:103
+#: templates/objectapp/gbobject_detail.html:109
+msgid "Comments are closed."
+msgstr "Los comentarios están deshabilitados."
+
+#: templates/objectapp/_gbobject_detail.html:89
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingback"
+msgstr[1] "%(pingback_count)s pingbacks"
+
+#: templates/objectapp/_gbobject_detail.html:96
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackback"
+msgstr[1] "%(trackback_count)s trackbacks"
+
+#: templates/objectapp/author_list.html:4 templates/objectapp/author_list.html:9
+msgid "Author list"
+msgstr "Lista de autores"
+
+#: templates/objectapp/author_list.html:18 templates/objectapp/Objecttype_list.html:14
+#: templates/objectapp/sitemap.html:55 templates/objectapp/tag_list.html:16
+#: templates/objectapp/tags/authors.html:8
+#: templates/objectapp/tags/objecttypes.html:6
+#, python-format
+msgid "%(gbobject_count)s gbobject"
+msgid_plural "%(gbobject_count)s gbobjects"
+msgstr[0] "%(gbobject_count)s entrada"
+msgstr[1] "%(gbobject_count)s entradas"
+
+#: templates/objectapp/base.html:15
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for"
+" complex searchs."
+msgstr ""
+"Puedes usar - para excluir palabras o frases, &quot;comillas dobles&quot; "
+"para buscar frases exactas, y las operaciones booleanas AND/OR combinada con"
+" paréntesis para realizar búsquedas complejas."
+
+#: templates/objectapp/base.html:30
+msgid "Calendar"
+msgstr "Calendario"
+
+#: templates/objectapp/base.html:63
+msgid "Popular gbobjects"
+msgstr "Entradas populares"
+
+#: templates/objectapp/base.html:67 templates/objectapp/gbobject_archive_day.html:4
+#: templates/objectapp/gbobject_archive_day.html:6
+#: templates/objectapp/gbobject_archive_day.html:9
+#: templates/objectapp/gbobject_archive_month.html:4
+#: templates/objectapp/gbobject_archive_month.html:6
+#: templates/objectapp/gbobject_archive_month.html:9
+#: templates/objectapp/gbobject_archive_year.html:4
+#: templates/objectapp/gbobject_archive_year.html:6
+#: templates/objectapp/gbobject_archive_year.html:9
+#: templates/objectapp/tags/archives_gbobjects.html:5
+#: templates/objectapp/tags/archives_gbobjects_link.html:2
+#: templates/objectapp/tags/archives_gbobjects_tree.html:7
+#: templates/objectapp/tags/archives_gbobjects_tree.html:14
+#: templates/objectapp/tags/archives_gbobjects_tree.html:24
+msgid "Archives"
+msgstr "Archivos"
+
+#: templates/objectapp/base.html:72
+msgid "Tools"
+msgstr "Herramientas"
+
+#: templates/objectapp/base.html:76 templates/objectapp/base.html.py:77
+msgid "Dashboard"
+msgstr "Panel de control"
+
+#: templates/objectapp/base.html:83 templates/objectapp/base.html.py:84
+msgid "Post an gbobject"
+msgstr "Escribe una entrada"
+
+#: templates/objectapp/base.html:91 templates/objectapp/base.html.py:92
+msgid "Log out"
+msgstr "Desconectar"
+
+#: templates/objectapp/Objecttype_list.html:4 templates/objectapp/Objecttype_list.html:9
+msgid "Objecttype list"
+msgstr "Lista de categorías"
+
+#: templates/objectapp/gbobject_archive_month.html:13
+msgid "Daily archives"
+msgstr "Archivos diarios"
+
+#: templates/objectapp/gbobject_archive_year.html:13
+#: templates/objectapp/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Archivos Mensuales"
+
+#: templates/objectapp/gbobject_detail.html:10
+msgid "RSS Feed of discussions on"
+msgstr "Feed RSS de los debates en"
+
+#: templates/objectapp/gbobject_detail.html:11
+msgid "RSS Feed of comments on"
+msgstr "Feed RSS de comentarios en"
+
+#: templates/objectapp/gbobject_detail.html:12
+msgid "RSS Feed of pingbacks on"
+msgstr "Feed RSS de pingbacks en"
+
+#: templates/objectapp/gbobject_detail.html:13
+msgid "RSS Feed of trackbacks on"
+msgstr "Feed RSS de trackbacks en"
+
+#: templates/objectapp/gbobject_detail.html:29
+msgid "Next gbobject"
+msgstr "Siguiente entrada"
+
+#: templates/objectapp/gbobject_detail.html:43
+msgid "Previous gbobject"
+msgstr "Entrada anterior"
+
+#: templates/objectapp/gbobject_detail.html:56
+msgid "Related gbobjects"
+msgstr "Entradas relacionadas"
+
+#: templates/objectapp/gbobject_detail.html:67
+msgid "Similar gbobjects"
+msgstr "Entradas similares"
+
+#: templates/objectapp/gbobject_detail.html:75
+msgid "Comments"
+msgstr "Comentarios"
+
+#: templates/objectapp/gbobject_detail.html:117
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/objectapp/gbobject_detail.html:139
+msgid "Pingbacks are open."
+msgstr "Los pingbacks están abiertos."
+
+#: templates/objectapp/gbobject_detail.html:141
+msgid "Pingbacks are closed."
+msgstr "Los pingbacks están cerrados."
+
+#: templates/objectapp/gbobject_detail.html:148
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/objectapp/gbobject_detail.html:170
+msgid "Trackback URL"
+msgstr "URL del trackback"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "Latest gbobjects for"
+msgstr "Últimas entradas de"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the Objecttype"
+msgstr "la categoría"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the tag"
+msgstr "el tag"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the author"
+msgstr "el autor"
+
+#: templates/objectapp/gbobject_list.html:4 templates/objectapp/gbobject_search.html:6
+msgid "page"
+msgstr "página"
+
+#: templates/objectapp/gbobject_list.html:9 templates/objectapp/gbobject_list.html:12
+#: templates/objectapp/gbobject_list.html:15 templates/objectapp/skeleton.html:40
+msgid "RSS Feed"
+msgstr "Feed RSS"
+
+#: templates/objectapp/gbobject_list.html:19
+msgid "Objecttype"
+msgstr "Categoría"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_list.html:30
+msgid "Tag"
+msgstr "Tag"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_search.html:4
+msgid "Page"
+msgstr "Página"
+
+#: templates/objectapp/gbobject_list.html:34
+#, python-format
+msgid "Gbobjects by %(author)s"
+msgstr "Entradas de %(author)s"
+
+#: templates/objectapp/gbobject_list.html:45 templates/objectapp/sitemap.html:23
+#: templates/objectapp/sitemap.html.py:43
+#: templates/objectapp/cms/gbobject_detail.html:12
+#: templates/objectapp/cms/gbobject_list.html:9
+#: templates/objectapp/tags/featured_gbobjects.html:9
+#: templates/objectapp/tags/popular_gbobjects.html:13
+#: templates/objectapp/tags/random_gbobjects.html:9
+#: templates/objectapp/tags/recent_gbobjects.html:9
+msgid "No gbobjects yet."
+msgstr "No hay entradas."
+
+#: templates/objectapp/gbobject_list.html:51 templates/objectapp/gbobject_search.html:40
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Página %(current_page)s de %(total_page)s"
+
+#: templates/objectapp/gbobject_list.html:56 templates/objectapp/gbobject_search.html:45
+msgid "More recent gbobjects"
+msgstr "Entradas más recientes"
+
+#: templates/objectapp/gbobject_list.html:65 templates/objectapp/gbobject_search.html:54
+msgid "Gbobjects page"
+msgstr "Página de entradas"
+
+#: templates/objectapp/gbobject_list.html:72 templates/objectapp/gbobject_search.html:61
+msgid "More old gbobjects"
+msgstr "Entradas más antiguas"
+
+#: templates/objectapp/gbobject_list.html:82 templates/objectapp/gbobject_list.html:83
+msgid "Edit the Objecttype"
+msgstr "Editar la categoría"
+
+#: templates/objectapp/gbobject_list.html:89 templates/objectapp/gbobject_list.html:90
+msgid "Edit the tag"
+msgstr "Editar el tag"
+
+#: templates/objectapp/gbobject_list.html:96 templates/objectapp/gbobject_list.html:97
+msgid "Edit the author"
+msgstr "Editar el autor"
+
+#: templates/objectapp/gbobject_search.html:4 templates/objectapp/gbobject_search.html:6
+#: templates/objectapp/gbobject_search.html:14
+msgid "Search results for"
+msgstr "Resultados de la búsqueda para"
+
+#: templates/objectapp/gbobject_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "Feed RSS de la búsqueda de"
+
+#: templates/objectapp/gbobject_search.html:22
+#, python-format
+msgid "%(gbobject_count)s gbobject found"
+msgid_plural "%(gbobject_count)s gbobjects found"
+msgstr[0] "%(gbobject_count)s entrada encontrada"
+msgstr[1] "%(gbobject_count)s entradas encontradas"
+
+#: templates/objectapp/gbobject_search.html:34
+msgid "Nothing found."
+msgstr "No hubo resultados."
+
+#: templates/objectapp/login.html:4 templates/objectapp/login.html.py:7
+msgid "Login required"
+msgstr "Identificación requerida"
+
+#: templates/objectapp/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+"Tu nombre de usuario y contraseña no son correctos. Vuelve a intentarlo."
+
+#: templates/objectapp/login.html:16
+msgid "You need to be connected to view this gbobject."
+msgstr "Necesitas estar identificado para ver esta entrada."
+
+#: templates/objectapp/login.html:33
+msgid "Login"
+msgstr "Login"
+
+#: templates/objectapp/password.html:4 templates/objectapp/password.html.py:7
+msgid "Password required"
+msgstr "Contraseña requerida"
+
+#: templates/objectapp/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "La contraseña proporcionada no es válida. Vuelve a intentarlo."
+
+#: templates/objectapp/password.html:16
+msgid "You need to provide a password to view this gbobject."
+msgstr "Necesitas una contraseña para ver esta entrada."
+
+#: templates/objectapp/password.html:23
+msgid "Password"
+msgstr "Contraseña"
+
+#: templates/objectapp/password.html:28
+msgid "Valid"
+msgstr "Válido"
+
+#: templates/objectapp/sitemap.html:10
+msgid "Gbobjects per objecttypes"
+msgstr "Entradas de la categoría"
+
+#: templates/objectapp/sitemap.html:18 templates/objectapp/sitemap.html.py:38
+#: templates/objectapp/tags/popular_gbobjects.html:8
+msgid "comment"
+msgstr "comentario"
+
+#: templates/objectapp/sitemap.html:31
+msgid "All the gbobjects"
+msgstr "Todas las entradas"
+
+#: templates/objectapp/sitemap.html:60 templates/objectapp/tags/objecttypes.html:11
+msgid "No objecttypes yet."
+msgstr "No hay categorías."
+
+#: templates/objectapp/skeleton.html:27 templates/objectapp/skeleton.html.py:39
+msgid "RSS Feed of latest gbobjects"
+msgstr "Feed RSS de las últimas entradas"
+
+#: templates/objectapp/tag_list.html:4 templates/objectapp/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Lista de tags"
+
+#: templates/objectapp/wlwmanifest.xml:40
+msgid "View site"
+msgstr "Ver la web"
+
+#: templates/objectapp/wlwmanifest.xml:41
+msgid "Admin. site"
+msgstr "Panel de administración"
+
+#: templates/objectapp/wlwmanifest.xml:53
+msgid "Manage comments"
+msgstr "Administrar comentarios"
+
+#: templates/objectapp/tags/archives_gbobjects.html:12
+#: templates/objectapp/tags/archives_gbobjects_tree.html:38
+msgid "No archives yet."
+msgstr "No hay archivos."
+
+#: templates/objectapp/tags/authors.html:12
+msgid "No authors yet."
+msgstr "No hay autores."
+
+#: templates/objectapp/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkbacks en"
+
+#: templates/objectapp/tags/similar_gbobjects.html:9
+msgid "No similar gbobjects."
+msgstr "No hay entradas similares"
+
+#: tests/views.py:165 views/search.py:18
+msgid "The pattern is too short"
+msgstr "La cadena es muy corta"
+
+#: tests/views.py:168 views/search.py:22
+msgid "No pattern to search found"
+msgstr "No se encuentra cadena"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "El nombre de usuario es incorrecto."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "La contraseña es incorrecta."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "El nombre de usuario no está disponible."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "El usuario no puede ser %s."
+
+#: xmlrpc/pingback.py:93
+msgid "No title"
+msgstr "No hay título"
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/fr/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/objectapp/locale/fr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..ea0a795
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/fr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/fr/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/objectapp/locale/fr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..1e3e9fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/fr/LC_MESSAGES/django.po
@@ -0,0 +1,1199 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Julien Fache <fantomas42@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-blog-objectapp\n"
+"Report-Msgid-Bugs-To: https://github.com/Fantomas42/django-blog-objectapp/issues\n"
+"POT-Creation-Date: 2011-04-12 13:21-0500\n"
+"PO-Revision-Date: 2011-04-12 18:22+0000\n"
+"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+
+#: feeds.py:102 plugins/cms_plugins.py:23
+#: templates/objectapp/gbobject_archive.html:4
+#: templates/objectapp/gbobject_archive.html:25 templates/objectapp/gbobject_list.html:19
+#: tests/feeds.py:115
+msgid "Latest gbobjects"
+msgstr "Derniers articles"
+
+#: feeds.py:106 tests/feeds.py:117
+#, python-format
+msgid "The latest gbobjects for the site %s"
+msgstr "Les dernières actualités du site %s"
+
+#: feeds.py:126 tests/feeds.py:126
+#, python-format
+msgid "Gbobjects for the Objecttype %s"
+msgstr "Actualités pour la catégorie : %s"
+
+#: feeds.py:130 tests/feeds.py:128
+#, python-format
+msgid "The latest gbobjects for the Objecttype %s"
+msgstr "Les dernières actualités pour la catégorie : %s"
+
+#: feeds.py:150 tests/feeds.py:137
+#, python-format
+msgid "Gbobjects for author %s"
+msgstr "L'actualité par %s"
+
+#: feeds.py:154 tests/feeds.py:139
+#, python-format
+msgid "The latest gbobjects by %s"
+msgstr "Les dernières actualités par %s"
+
+#: feeds.py:175 tests/feeds.py:149
+#, python-format
+msgid "Gbobjects for the tag %s"
+msgstr "Actualités pour le tag : %s"
+
+#: feeds.py:179 tests/feeds.py:151
+#, python-format
+msgid "The latest gbobjects for the tag %s"
+msgstr "Les dernières actualités pour le tag : %s"
+
+#: feeds.py:199 tests/feeds.py:160
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr "Résultats de recherche pour '%s'"
+
+#: feeds.py:203 tests/feeds.py:162
+#, python-format
+msgid "The gbobjects containing the pattern '%s'"
+msgstr "Les dernières actualités contenant le motif '%s'"
+
+#: feeds.py:245 tests/feeds.py:178
+#, python-format
+msgid "Discussions on %s"
+msgstr "Discussions sur %s"
+
+#: feeds.py:249 tests/feeds.py:180
+#, python-format
+msgid "The latest discussions for the gbobject %s"
+msgstr "Les dernières discussions sur l'actualité : %s"
+
+#: feeds.py:267 tests/feeds.py:190
+#, python-format
+msgid "Comments on %s"
+msgstr "Commentaires sur : %s"
+
+#: feeds.py:271 tests/feeds.py:192
+#, python-format
+msgid "The latest comments for the gbobject %s"
+msgstr "Les derniers commentaires sur l'actualité : %s"
+
+#: feeds.py:301 tests/feeds.py:206
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks sur %s"
+
+#: feeds.py:305 tests/feeds.py:208
+#, python-format
+msgid "The latest pingbacks for the gbobject %s"
+msgstr "Les derniers pingbacks sur l'actualité : %s"
+
+#: feeds.py:323 tests/feeds.py:218
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks sur %s"
+
+#: feeds.py:327 tests/feeds.py:220
+#, python-format
+msgid "The latest trackbacks for the gbobject %s"
+msgstr "Les derniers trackbacks sur l'actualité : %s"
+
+#: models.py:64 models.py:105 admin/gbobject.py:73
+msgid "title"
+msgstr "titre"
+
+#: models.py:65 models.py:119
+msgid "used for publication"
+msgstr "Utilisé pour la publication."
+
+#: models.py:67
+msgid "description"
+msgstr "description"
+
+#: models.py:70 admin/forms.py:18
+msgid "parent Objecttype"
+msgstr "catégorie parente"
+
+#: models.py:95
+msgid "Objecttype"
+msgstr "catégorie"
+
+#: models.py:96 models.py:114 admin/forms.py:47 plugins/models.py:24
+msgid "objecttypes"
+msgstr "catégories"
+
+#: models.py:101
+msgid "draft"
+msgstr "Brouillon"
+
+#: models.py:102
+msgid "hidden"
+msgstr "Non publié"
+
+#: models.py:103
+msgid "published"
+msgstr "Publié"
+
+#: models.py:107
+msgid "image"
+msgstr "image"
+
+#: models.py:108
+msgid "used for illustration"
+msgstr "Utilisée comme illustration."
+
+#: models.py:109
+msgid "content"
+msgstr "contenu"
+
+#: models.py:110
+msgid "excerpt"
+msgstr "extrait"
+
+#: models.py:111
+msgid "optional element"
+msgstr "Elément optionnel."
+
+#: models.py:113 plugins/models.py:30
+msgid "tags"
+msgstr "tags"
+
+#: models.py:116
+msgid "related gbobjects"
+msgstr "articles associés"
+
+#: models.py:123 plugins/models.py:28
+msgid "authors"
+msgstr "auteurs"
+
+#: models.py:126
+msgid "featured"
+msgstr "favori ?"
+
+#: models.py:127 admin/gbobject.py:124
+msgid "comment enabled"
+msgstr "commentaires ?"
+
+#: models.py:128
+msgid "linkback enabled"
+msgstr "liens entrants ?"
+
+#: models.py:130
+msgid "creation date"
+msgstr "date de création"
+
+#: models.py:131
+msgid "last update"
+msgstr "mise à jour"
+
+#: models.py:132
+msgid "start publication"
+msgstr "démarrage"
+
+#: models.py:133
+msgid "date start publish"
+msgstr "Date utilisé pour démarrer la publication."
+
+#: models.py:135
+msgid "end publication"
+msgstr "arrêt"
+
+#: models.py:136
+msgid "date end publish"
+msgstr "Date utilisé pour arrêter la publication."
+
+#: models.py:139
+msgid "sites publication"
+msgstr "sites publiés"
+
+#: models.py:141
+msgid "login required"
+msgstr "identification requise"
+
+#: models.py:142
+msgid "only authenticated users can view the gbobject"
+msgstr "Seuls les visiteurs authentifiés peuvent voir l'article."
+
+#: models.py:143
+msgid "password"
+msgstr "mot de passe"
+
+#: models.py:144
+msgid "protect the gbobject with a password"
+msgstr "Protège l'article avec un mot de passe."
+
+#: models.py:146 plugins/models.py:34 plugins/models.py:58
+#: plugins/models.py:80
+msgid "template"
+msgstr "modèle"
+
+#: models.py:149
+msgid "Default template"
+msgstr "Modèle par défaut"
+
+#: models.py:151
+msgid "template used to display the gbobject"
+msgstr "Modèle utilisé pour afficher l'article."
+
+#: models.py:285
+msgid "gbobject"
+msgstr "article"
+
+#: models.py:286 plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:57
+#: templates/objectapp/base.html:40
+msgid "gbobjects"
+msgstr "articles"
+
+#: moderator.py:45 moderator.py:72
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Nouveau commentaire posté sur \"%(title)s\""
+
+#: admin/Objecttype.py:30
+msgid "tree path"
+msgstr "arborescense"
+
+#: admin/gbobject.py:27 plugins/admin.py:17
+#: templates/admin/objectapp/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Contenu"
+
+#: admin/gbobject.py:29 plugins/admin.py:19
+msgid "Options"
+msgstr "Options"
+
+#: admin/gbobject.py:34 plugins/admin.py:24
+msgid "Privacy"
+msgstr "Confidentialité"
+
+#: admin/gbobject.py:36 plugins/admin.py:26
+msgid "Discussion"
+msgstr "Discussion"
+
+#: admin/gbobject.py:38 plugins/admin.py:28
+msgid "Publication"
+msgstr "Publication"
+
+#: admin/gbobject.py:66
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i mots)"
+
+#: admin/gbobject.py:70
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i commentaires)"
+
+#: admin/gbobject.py:86
+msgid "author(s)"
+msgstr "auteur(s)"
+
+#: admin/gbobject.py:99
+msgid "Objecttype(s)"
+msgstr "Catégorie(s)"
+
+#: admin/gbobject.py:111
+msgid "tag(s)"
+msgstr "Tag(s)"
+
+#: admin/gbobject.py:118
+msgid "site(s)"
+msgstr "Site(s)"
+
+#: admin/gbobject.py:130
+msgid "is actual"
+msgstr "En cours ?"
+
+#: admin/gbobject.py:136
+msgid "is visible"
+msgstr "Visible ?"
+
+#: admin/gbobject.py:141
+msgid "View"
+msgstr "Consulter"
+
+#: admin/gbobject.py:143
+msgid "View on site"
+msgstr "Voir sur le site"
+
+#: admin/gbobject.py:149 templates/objectapp/_gbobject_detail.html:64
+msgid "Unavailable"
+msgstr "Indisponible"
+
+#: admin/gbobject.py:153
+msgid "short url"
+msgstr "url raccourcie"
+
+#: admin/gbobject.py:207
+msgid "The selected gbobjects now belong to you."
+msgstr "Les articles sélectionnés vous appartiennent désormais."
+
+#: admin/gbobject.py:208
+msgid "Set the gbobjects to the user"
+msgstr "Acquérir les articles"
+
+#: admin/gbobject.py:214
+msgid "The selected gbobjects are now marked as published."
+msgstr "Les articles sélectionnés sont désormais marqués comme publiés."
+
+#: admin/gbobject.py:215
+msgid "Set gbobjects selected as published"
+msgstr "Publier les articles sélectionnés"
+
+#: admin/gbobject.py:220
+msgid "The selected gbobjects are now marked as hidden."
+msgstr "Les articles sélectionnés sont désormais marqués comme cachés."
+
+#: admin/gbobject.py:221
+msgid "Set gbobjects selected as hidden"
+msgstr "Masquer les articles sélectionnés"
+
+#: admin/gbobject.py:234
+msgid "The selected gbobjects have been tweeted."
+msgstr "Les articles sélectionnés ont été twittés."
+
+#: admin/gbobject.py:235
+msgid "Tweet gbobjects selected"
+msgstr "Tweeter les articles sélectionnés"
+
+#: admin/gbobject.py:240
+msgid "Comments are now closed for selected gbobjects."
+msgstr ""
+"Les commentaires sont désormais fermés pour les articles sélectionnés."
+
+#: admin/gbobject.py:241
+msgid "Close the comments for selected gbobjects"
+msgstr "Fermer les commentaires pour les articles sélectionnés"
+
+#: admin/gbobject.py:247
+msgid "Linkbacks are now closed for selected gbobjects."
+msgstr ""
+"Les liens entrants sont désormais fermés pour les articles sélectionnés."
+
+#: admin/gbobject.py:248
+msgid "Close the linkbacks for selected gbobjects"
+msgstr "Fermer les liens entrants pour les articles sélectionnés"
+
+#: admin/gbobject.py:254
+msgid "The selected gbobjects are now set at the current date."
+msgstr "Les articles sélectionnés sont désormais à la date du jour."
+
+#: admin/gbobject.py:255
+msgid "Put the selected gbobjects on top at the current date"
+msgstr "Remonter les articles sélectionnés à la date du jour"
+
+#: admin/gbobject.py:272
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d gbobjects."
+msgstr "%(directory)s a été pingé avec succès pour %(success)d articles."
+
+#: admin/gbobject.py:275
+msgid "Ping Directories for selected gbobjects"
+msgstr "Pinger les articles dans les annuaires."
+
+#: admin/forms.py:20
+msgid "No parent Objecttype"
+msgstr "Aucune catégorie parente"
+
+#: admin/forms.py:35
+msgid "A Objecttype cannot be parent of itself."
+msgstr "Une catégorie ne peut être parente d'elle même."
+
+#: admin/forms.py:46 plugins/menu.py:70 templates/objectapp/base.html:22
+#: templates/objectapp/Objecttype_list.html:6 templates/objectapp/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:49
+msgid "Objecttypes"
+msgstr "Catégories"
+
+#: plugins/cms_app.py:12
+msgid "Objectapp App Hook"
+msgstr "Application Objectapp"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Répartition"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Avancé"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected gbobjects"
+msgstr "Selection d'articles"
+
+#: plugins/cms_plugins.py:116 templates/objectapp/base.html:59
+msgid "Random gbobjects"
+msgstr "Articles au hasard"
+
+#: plugins/menu.py:19
+msgid "Objectapp Gbobject Menu"
+msgstr "Menu Article Objectapp"
+
+#: plugins/menu.py:65
+msgid "Objectapp Objecttype Menu"
+msgstr "Menu Catégorie Objectapp"
+
+#: plugins/menu.py:82
+msgid "Objectapp Author Menu"
+msgstr "Menu Auteur Objectapp"
+
+#: plugins/menu.py:87 templates/objectapp/author_list.html:6
+#: templates/objectapp/base.html:26 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Auteurs"
+
+#: plugins/menu.py:100
+msgid "Objectapp Tag Menu"
+msgstr "Menu Tag Objectapp"
+
+#: plugins/menu.py:105 templates/admin/objectapp/widgets/quickpost.html:25
+#: templates/objectapp/_gbobject_detail.html:47 templates/objectapp/base.html:34
+#: templates/objectapp/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Tags"
+
+#: plugins/models.py:16
+msgid "Gbobject list (default)"
+msgstr "Article en liste (par défaut)"
+
+#: plugins/models.py:17
+msgid "Gbobject detailed"
+msgstr "Article détaillé"
+
+#: plugins/models.py:27
+msgid "include subobjecttypes"
+msgstr "inclure les sous-catégories ?"
+
+#: plugins/models.py:33 plugins/models.py:79
+msgid "number of gbobjects"
+msgstr "nombre d'articles"
+
+#: plugins/models.py:36 plugins/models.py:60 plugins/models.py:82
+msgid "Template used to display the plugin"
+msgstr "Modèle utilisé pour afficher le plugin."
+
+#: plugins/models.py:51 plugins/models.py:73 plugins/models.py:85
+#, python-format
+msgid "%s gbobjects"
+msgstr "%s articles"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Erreur 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Cette page n'a pas été trouvée"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Désolé, mais la page demandée est introuvable."
+
+#: templates/404.html:15 templates/500.html:20
+msgid "Useful links"
+msgstr "Liens utiles"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:24
+#: templates/500.html.py:25
+msgid "Blog index"
+msgstr "Accueil du blog"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:29
+#: templates/500.html.py:30 templates/objectapp/sitemap.html:4
+#: templates/objectapp/sitemap.html.py:7 templates/objectapp/skeleton.html:36
+#: templates/objectapp/skeleton.html.py:37
+msgid "Sitemap"
+msgstr "Carte du site"
+
+#: templates/404.html:31 templates/500.html:36 templates/objectapp/base.html:47
+msgid "Recent gbobjects"
+msgstr "Articles récents"
+
+#: templates/404.html:36 templates/500.html:41 templates/objectapp/base.html:10
+msgid "Search"
+msgstr "Recherche"
+
+#: templates/404.html:40 templates/500.html:45 templates/objectapp/base.html:13
+msgid "Keywords..."
+msgstr "Mots-clefs..."
+
+#: templates/500.html:10
+msgid "Error 500"
+msgstr "Erreur 500"
+
+#: templates/500.html:13 templates/500.html.py:16
+msgid "Server error"
+msgstr "Erreur du serveur"
+
+#: templates/500.html:18
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"e-mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Une erreur est survenue. Elle a été transmise par courriel aux "
+"administrateurs du site et sera corrigée dans les meilleurs délais. Merci "
+"pour votre patience."
+
+#: templates/admin/objectapp/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Contenus"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:5
+#: templates/objectapp/_gbobject_detail.html:69
+msgid "Discussions"
+msgstr "Discussions"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:10
+#, python-format
+msgid "%(gbobjects)s gbobjects"
+msgstr "%(gbobjects)s articles"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s commentaires"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:22
+#, python-format
+msgid "%(objecttypes)s objecttypes"
+msgstr "%(objecttypes)s catégories"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s pingbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s tags"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s trackbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s auteurs"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s rejetées"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:7
+#: templates/objectapp/gbobject_detail.html:186
+#: templates/objectapp/gbobject_detail.html:187
+msgid "Edit the gbobject"
+msgstr "Editer l'article"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:10
+#: templates/comments/objectapp_gbobject_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/objectapp/_gbobject_detail.html:18
+#: templates/objectapp/gbobject_detail.html:91
+#: templates/objectapp/gbobject_detail.html:126
+#: templates/objectapp/gbobject_detail.html:157
+msgid "on"
+msgstr "le"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:16
+#: templates/comments/objectapp/gbobject/form.html:19
+msgid "Preview"
+msgstr "Prévisualiser"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:23
+msgid "No draft gbobjects."
+msgstr "Aucun brouillon actuellement"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:32
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:33
+msgid "View all draft gbobjects"
+msgstr "Voir tous les articles en brouillon"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:11
+#: templates/objectapp/_gbobject_detail.html:24
+#: templates/objectapp/tags/recent_comments.html:7
+#: templates/objectapp/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "sous"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:14
+#: templates/objectapp/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Commentaire sur"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Editer le commentaire"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:24
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Editer"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:31
+#: templates/objectapp/_gbobject_detail.html:77
+#: templates/objectapp/gbobject_detail.html:107
+#: templates/objectapp/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Pas de commentaires."
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:40
+#: templates/admin/objectapp/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Gérer les commentaires"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "a fait un lien sur"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Editer le lien entrant"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:26
+#: templates/objectapp/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Aucun lien entrant actuellement"
+
+#: templates/admin/objectapp/widgets/content_stats.html:6
+#: templates/admin/objectapp/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Aujourd'hui"
+
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:6
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:7
+msgid "Draft gbobjects"
+msgstr "Brouillons en cours"
+
+#: templates/admin/objectapp/widgets/quickpost.html:5
+#: templates/admin/objectapp/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Publication rapide"
+
+#: templates/admin/objectapp/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Titre"
+
+#: templates/admin/objectapp/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Enregistrer en brouillon"
+
+#: templates/admin/objectapp/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Réinitialiser"
+
+#: templates/admin/objectapp/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Publier"
+
+#: templates/admin/objectapp/widgets/recent_comments.html:6
+#: templates/admin/objectapp/widgets/recent_comments.html:7
+#: templates/objectapp/base.html:51
+msgid "Recent comments"
+msgstr "Derniers commentaires"
+
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:6
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:7
+#: templates/objectapp/base.html:55
+msgid "Recent linkbacks"
+msgstr "Derniers liens entrants"
+
+#: templates/comments/comment_notification_email.txt:1
+#: templates/comments/comment_reply_email.txt:1
+#: templates/objectapp/gbobject_list.html:19
+msgid "Author"
+msgstr "Auteur"
+
+#: templates/comments/comment_notification_email.txt:2
+msgid "Email"
+msgstr "Email"
+
+#: templates/comments/comment_notification_email.txt:3
+msgid "IP"
+msgstr "IP"
+
+#: templates/comments/comment_notification_email.txt:5
+#: templates/comments/comment_reply_email.txt:3
+msgid "Comment"
+msgstr "Commentaire"
+
+#: templates/comments/comment_notification_email.txt:8
+#: templates/comments/comment_reply_email.txt:6
+msgid "View this comment"
+msgstr "Voir ce commentaire"
+
+#: templates/comments/comment_notification_email.txt:10
+msgid "Flag this comment"
+msgstr "Signaler ce commentaire"
+
+#: templates/comments/comment_notification_email.txt:12
+msgid "Delete this comment"
+msgstr "Supprimer ce commentaire"
+
+#: templates/comments/comment_notification_email.txt:14
+msgid "Approve this comment"
+msgstr "Approuver ce commentaire"
+
+#: templates/comments/objectapp_gbobject_preview.html:4
+msgid "Comment preview"
+msgstr "Prévisualiser le commentaire"
+
+#: templates/comments/objectapp_gbobject_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Veuillez corriger l'erreur suivante."
+msgstr[1] "Veuillez corriger les erreurs suivantes. "
+
+#: templates/comments/objectapp_gbobject_preview.html:12
+msgid "Preview of the comment"
+msgstr "Prévisualisation du commentaire"
+
+#: templates/comments/objectapp/gbobject/form.html:7
+msgid "Post your comment"
+msgstr "Poster un commentaire"
+
+#: templates/comments/objectapp/gbobject/form.html:18
+msgid "Post"
+msgstr "Poster"
+
+#: templates/comments/objectapp/gbobject/posted.html:4
+#: templates/comments/objectapp/gbobject/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Merci pour votre commentaire"
+
+#: templates/comments/objectapp/gbobject/posted.html:9
+#: templates/comments/objectapp/gbobject/posted.html:10
+msgid "Return to gbobject list"
+msgstr "Retourner à la liste des articles"
+
+#: templates/objectapp/_gbobject_detail.html:11
+msgid "Written by"
+msgstr "Ecrit par"
+
+#: templates/objectapp/_gbobject_detail.html:15
+#, python-format
+msgid "Show %(author)s gbobjects"
+msgstr "Voir les articles de %(author)s"
+
+#: templates/objectapp/_gbobject_detail.html:20
+msgid "Written on"
+msgstr "Ecrit le"
+
+#: templates/objectapp/_gbobject_detail.html:53
+msgid "No tags"
+msgstr "Pas de tags"
+
+#: templates/objectapp/_gbobject_detail.html:58
+msgid "Short url"
+msgstr "Url raccourcie"
+
+#: templates/objectapp/_gbobject_detail.html:73
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s commentaire "
+msgstr[1] "%(comment_count)s commentaires"
+
+#: templates/objectapp/_gbobject_detail.html:79
+msgid "Be first to comment!"
+msgstr "Soyez le premier à commenter !"
+
+#: templates/objectapp/_gbobject_detail.html:82
+#: templates/objectapp/gbobject_detail.html:103
+#: templates/objectapp/gbobject_detail.html:109
+msgid "Comments are closed."
+msgstr "Les commentaires sont fermés."
+
+#: templates/objectapp/_gbobject_detail.html:89
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingback"
+msgstr[1] "%(pingback_count)s pingbacks"
+
+#: templates/objectapp/_gbobject_detail.html:96
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackback"
+msgstr[1] "%(trackback_count)s trackbacks"
+
+#: templates/objectapp/author_list.html:4 templates/objectapp/author_list.html:9
+msgid "Author list"
+msgstr "Liste des auteurs"
+
+#: templates/objectapp/author_list.html:18 templates/objectapp/Objecttype_list.html:14
+#: templates/objectapp/sitemap.html:55 templates/objectapp/tag_list.html:16
+#: templates/objectapp/tags/authors.html:8
+#: templates/objectapp/tags/objecttypes.html:6
+#, python-format
+msgid "%(gbobject_count)s gbobject"
+msgid_plural "%(gbobject_count)s gbobjects"
+msgstr[0] "%(gbobject_count)s article"
+msgstr[1] "%(gbobject_count)s articles"
+
+#: templates/objectapp/base.html:15
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for"
+" complex searchs."
+msgstr ""
+"Vous pouvez utiliser le - pour exclure des mots ou des expressions, les "
+"&quot;double guillemets&quot; pour les expressions exactes et les opérateurs"
+" booléens AND/OR combinés avec des parenthèses pour les recherches "
+"complexes."
+
+#: templates/objectapp/base.html:30
+msgid "Calendar"
+msgstr "Calendrier"
+
+#: templates/objectapp/base.html:63
+msgid "Popular gbobjects"
+msgstr "Articles populaires"
+
+#: templates/objectapp/base.html:67 templates/objectapp/gbobject_archive_day.html:4
+#: templates/objectapp/gbobject_archive_day.html:6
+#: templates/objectapp/gbobject_archive_day.html:9
+#: templates/objectapp/gbobject_archive_month.html:4
+#: templates/objectapp/gbobject_archive_month.html:6
+#: templates/objectapp/gbobject_archive_month.html:9
+#: templates/objectapp/gbobject_archive_year.html:4
+#: templates/objectapp/gbobject_archive_year.html:6
+#: templates/objectapp/gbobject_archive_year.html:9
+#: templates/objectapp/tags/archives_gbobjects.html:5
+#: templates/objectapp/tags/archives_gbobjects_link.html:2
+#: templates/objectapp/tags/archives_gbobjects_tree.html:7
+#: templates/objectapp/tags/archives_gbobjects_tree.html:14
+#: templates/objectapp/tags/archives_gbobjects_tree.html:24
+msgid "Archives"
+msgstr "Archives"
+
+#: templates/objectapp/base.html:72
+msgid "Tools"
+msgstr "Outils"
+
+#: templates/objectapp/base.html:76 templates/objectapp/base.html.py:77
+msgid "Dashboard"
+msgstr "Tableau de bord"
+
+#: templates/objectapp/base.html:83 templates/objectapp/base.html.py:84
+msgid "Post an gbobject"
+msgstr "Poster un article"
+
+#: templates/objectapp/base.html:91 templates/objectapp/base.html.py:92
+msgid "Log out"
+msgstr "Déconnexion"
+
+#: templates/objectapp/Objecttype_list.html:4 templates/objectapp/Objecttype_list.html:9
+msgid "Objecttype list"
+msgstr "Liste des catégories"
+
+#: templates/objectapp/gbobject_archive_month.html:13
+msgid "Daily archives"
+msgstr "Archives journalières"
+
+#: templates/objectapp/gbobject_archive_year.html:13
+#: templates/objectapp/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Archives mensuelles"
+
+#: templates/objectapp/gbobject_detail.html:10
+msgid "RSS Feed of discussions on"
+msgstr "Flux RSS des discussions sur"
+
+#: templates/objectapp/gbobject_detail.html:11
+msgid "RSS Feed of comments on"
+msgstr "Flux RSS des commentaires sur"
+
+#: templates/objectapp/gbobject_detail.html:12
+msgid "RSS Feed of pingbacks on"
+msgstr "Flux RSS des pingbacks sur"
+
+#: templates/objectapp/gbobject_detail.html:13
+msgid "RSS Feed of trackbacks on"
+msgstr "Flux RSS des trackbacks sur"
+
+#: templates/objectapp/gbobject_detail.html:29
+msgid "Next gbobject"
+msgstr "Article suivant"
+
+#: templates/objectapp/gbobject_detail.html:43
+msgid "Previous gbobject"
+msgstr "Article précédent"
+
+#: templates/objectapp/gbobject_detail.html:56
+msgid "Related gbobjects"
+msgstr "Articles associés"
+
+#: templates/objectapp/gbobject_detail.html:67
+msgid "Similar gbobjects"
+msgstr "Articles similaires"
+
+#: templates/objectapp/gbobject_detail.html:75
+msgid "Comments"
+msgstr "Commentaires"
+
+#: templates/objectapp/gbobject_detail.html:117
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/objectapp/gbobject_detail.html:139
+msgid "Pingbacks are open."
+msgstr "Les pingbacks sont ouverts."
+
+#: templates/objectapp/gbobject_detail.html:141
+msgid "Pingbacks are closed."
+msgstr "Les pingbacks sont fermés."
+
+#: templates/objectapp/gbobject_detail.html:148
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/objectapp/gbobject_detail.html:170
+msgid "Trackback URL"
+msgstr "URL de Trackback"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "Latest gbobjects for"
+msgstr "Derniers articles pour"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the Objecttype"
+msgstr "la catégorie"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the tag"
+msgstr "le tag"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the author"
+msgstr "l'auteur"
+
+#: templates/objectapp/gbobject_list.html:4 templates/objectapp/gbobject_search.html:6
+msgid "page"
+msgstr "page"
+
+#: templates/objectapp/gbobject_list.html:9 templates/objectapp/gbobject_list.html:12
+#: templates/objectapp/gbobject_list.html:15 templates/objectapp/skeleton.html:40
+msgid "RSS Feed"
+msgstr "Flux RSS"
+
+#: templates/objectapp/gbobject_list.html:19
+msgid "Objecttype"
+msgstr "Catégorie"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_list.html:30
+msgid "Tag"
+msgstr "Tag"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_search.html:4
+msgid "Page"
+msgstr "Page"
+
+#: templates/objectapp/gbobject_list.html:34
+#, python-format
+msgid "Gbobjects by %(author)s"
+msgstr "L'actualité par %(author)s"
+
+#: templates/objectapp/gbobject_list.html:45 templates/objectapp/sitemap.html:23
+#: templates/objectapp/sitemap.html.py:43
+#: templates/objectapp/cms/gbobject_detail.html:12
+#: templates/objectapp/cms/gbobject_list.html:9
+#: templates/objectapp/tags/featured_gbobjects.html:9
+#: templates/objectapp/tags/popular_gbobjects.html:13
+#: templates/objectapp/tags/random_gbobjects.html:9
+#: templates/objectapp/tags/recent_gbobjects.html:9
+msgid "No gbobjects yet."
+msgstr "Pas encore d'articles."
+
+#: templates/objectapp/gbobject_list.html:51 templates/objectapp/gbobject_search.html:40
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Page %(current_page)s sur %(total_page)s"
+
+#: templates/objectapp/gbobject_list.html:56 templates/objectapp/gbobject_search.html:45
+msgid "More recent gbobjects"
+msgstr "Articles plus récents"
+
+#: templates/objectapp/gbobject_list.html:65 templates/objectapp/gbobject_search.html:54
+msgid "Gbobjects page"
+msgstr "Articles page"
+
+#: templates/objectapp/gbobject_list.html:72 templates/objectapp/gbobject_search.html:61
+msgid "More old gbobjects"
+msgstr "Articles plus anciens"
+
+#: templates/objectapp/gbobject_list.html:82 templates/objectapp/gbobject_list.html:83
+msgid "Edit the Objecttype"
+msgstr "Editer la catégorie"
+
+#: templates/objectapp/gbobject_list.html:89 templates/objectapp/gbobject_list.html:90
+msgid "Edit the tag"
+msgstr "Editer le tag"
+
+#: templates/objectapp/gbobject_list.html:96 templates/objectapp/gbobject_list.html:97
+msgid "Edit the author"
+msgstr "Editer l'auteur"
+
+#: templates/objectapp/gbobject_search.html:4 templates/objectapp/gbobject_search.html:6
+#: templates/objectapp/gbobject_search.html:14
+msgid "Search results for"
+msgstr "Résultats de recherche pour"
+
+#: templates/objectapp/gbobject_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "Flux RSS des résultats de recherche pour"
+
+#: templates/objectapp/gbobject_search.html:22
+#, python-format
+msgid "%(gbobject_count)s gbobject found"
+msgid_plural "%(gbobject_count)s gbobjects found"
+msgstr[0] "%(gbobject_count)s article trouvé."
+msgstr[1] "%(gbobject_count)s articles trouvés."
+
+#: templates/objectapp/gbobject_search.html:34
+msgid "Nothing found."
+msgstr "Aucun article trouvé."
+
+#: templates/objectapp/login.html:4 templates/objectapp/login.html.py:7
+msgid "Login required"
+msgstr "Identification requise"
+
+#: templates/objectapp/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+"Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez "
+"réessayer."
+
+#: templates/objectapp/login.html:16
+msgid "You need to be connected to view this gbobject."
+msgstr "Vous devez être identifé pour voir cet article."
+
+#: templates/objectapp/login.html:33
+msgid "Login"
+msgstr "Connexion"
+
+#: templates/objectapp/password.html:4 templates/objectapp/password.html.py:7
+msgid "Password required"
+msgstr "Mot de passe requis"
+
+#: templates/objectapp/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "Le mot de passe fournis est non valide. Veuillez réessayer."
+
+#: templates/objectapp/password.html:16
+msgid "You need to provide a password to view this gbobject."
+msgstr "Vous devez fournir un mot de passe pour voir cet article."
+
+#: templates/objectapp/password.html:23
+msgid "Password"
+msgstr "Mot de passe"
+
+#: templates/objectapp/password.html:28
+msgid "Valid"
+msgstr "Valider"
+
+#: templates/objectapp/sitemap.html:10
+msgid "Gbobjects per objecttypes"
+msgstr "Articles par catégories"
+
+#: templates/objectapp/sitemap.html:18 templates/objectapp/sitemap.html.py:38
+#: templates/objectapp/tags/popular_gbobjects.html:8
+msgid "comment"
+msgstr "commentaire"
+
+#: templates/objectapp/sitemap.html:31
+msgid "All the gbobjects"
+msgstr "Tous les articles"
+
+#: templates/objectapp/sitemap.html:60 templates/objectapp/tags/objecttypes.html:11
+msgid "No objecttypes yet."
+msgstr "Pas encore de catégories."
+
+#: templates/objectapp/skeleton.html:27 templates/objectapp/skeleton.html.py:39
+msgid "RSS Feed of latest gbobjects"
+msgstr "Flux RSS des derniers articles"
+
+#: templates/objectapp/tag_list.html:4 templates/objectapp/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Liste des tags"
+
+#: templates/objectapp/wlwmanifest.xml:40
+msgid "View site"
+msgstr "Voir le site"
+
+#: templates/objectapp/wlwmanifest.xml:41
+msgid "Admin. site"
+msgstr "Admin. site"
+
+#: templates/objectapp/wlwmanifest.xml:53
+msgid "Manage comments"
+msgstr "Gérer les commentaires"
+
+#: templates/objectapp/tags/archives_gbobjects.html:12
+#: templates/objectapp/tags/archives_gbobjects_tree.html:38
+msgid "No archives yet."
+msgstr "Pas encore d'archives."
+
+#: templates/objectapp/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Pas encore d'auteurs."
+
+#: templates/objectapp/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Pingback sur"
+
+#: templates/objectapp/tags/similar_gbobjects.html:9
+msgid "No similar gbobjects."
+msgstr "Pas d'articles similaires."
+
+#: tests/views.py:165 views/search.py:18
+msgid "The pattern is too short"
+msgstr "Le motif de recherche est trop court !"
+
+#: tests/views.py:168 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Aucun motif de recherche !"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Le nom d'utilisateur est incorrect."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Le mot de passe est invalide."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Compte utilisateur non valable."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "L'utilisateur ne peut %s."
+
+#: xmlrpc/pingback.py:93
+msgid "No title"
+msgstr "Aucun titre"
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/hu/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/objectapp/locale/hu/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..931a52f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/hu/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/hu/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/objectapp/locale/hu/LC_MESSAGES/django.po
new file mode 100644
index 0000000..0d13597
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/hu/LC_MESSAGES/django.po
@@ -0,0 +1,1194 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Frank Kruchio <fkruchio@gmail.com>, 2011.
+# judit <judit.nz@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-blog-objectapp\n"
+"Report-Msgid-Bugs-To: https://github.com/Fantomas42/django-blog-objectapp/issues\n"
+"POT-Creation-Date: 2011-04-12 13:21-0500\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:102 plugins/cms_plugins.py:23
+#: templates/objectapp/gbobject_archive.html:4
+#: templates/objectapp/gbobject_archive.html:25 templates/objectapp/gbobject_list.html:19
+#: tests/feeds.py:115
+msgid "Latest gbobjects"
+msgstr "Legújabb bejegyzések"
+
+#: feeds.py:106 tests/feeds.py:117
+#, python-format
+msgid "The latest gbobjects for the site %s"
+msgstr "A legfrissebb bejegyzések az oldalon:%s"
+
+#: feeds.py:126 tests/feeds.py:126
+#, python-format
+msgid "Gbobjects for the Objecttype %s"
+msgstr "Bejegyzés a kategóriában:%s"
+
+#: feeds.py:130 tests/feeds.py:128
+#, python-format
+msgid "The latest gbobjects for the Objecttype %s"
+msgstr "A legfrissebb bejegyzések a kategóriában:%s"
+
+#: feeds.py:150 tests/feeds.py:137
+#, python-format
+msgid "Gbobjects for author %s"
+msgstr "Bejegyzés szerzője:%s"
+
+#: feeds.py:154 tests/feeds.py:139
+#, python-format
+msgid "The latest gbobjects by %s"
+msgstr "A legfrissebb bejegyzések:%s"
+
+#: feeds.py:175 tests/feeds.py:149
+#, python-format
+msgid "Gbobjects for the tag %s"
+msgstr "Bejegyzés ezzel a címkével:%s"
+
+#: feeds.py:179 tests/feeds.py:151
+#, python-format
+msgid "The latest gbobjects for the tag %s"
+msgstr "A legfrissebb bejegyzések ezzel a címkével:%s"
+
+#: feeds.py:199 tests/feeds.py:160
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:162
+#, python-format
+msgid "The gbobjects containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:245 tests/feeds.py:178
+#, python-format
+msgid "Discussions on %s"
+msgstr "Beszélgetések:%s"
+
+#: feeds.py:249 tests/feeds.py:180
+#, python-format
+msgid "The latest discussions for the gbobject %s"
+msgstr "A bejegyzés legutóbbi beszélgetései :%s"
+
+#: feeds.py:267 tests/feeds.py:190
+#, python-format
+msgid "Comments on %s"
+msgstr "Megjegyzések:%s"
+
+#: feeds.py:271 tests/feeds.py:192
+#, python-format
+msgid "The latest comments for the gbobject %s"
+msgstr "A bejegyzés legfrissebb hozzászólásai:%s"
+
+#: feeds.py:301 tests/feeds.py:206
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks:%s"
+
+#: feeds.py:305 tests/feeds.py:208
+#, python-format
+msgid "The latest pingbacks for the gbobject %s"
+msgstr "Legújabb Pingbacks ebben a bejegyzésben :%s"
+
+#: feeds.py:323 tests/feeds.py:218
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks:%s"
+
+#: feeds.py:327 tests/feeds.py:220
+#, python-format
+msgid "The latest trackbacks for the gbobject %s"
+msgstr "A legújabb trackbacks ebben a bejegyzésben:%s"
+
+#: models.py:64 models.py:105 admin/gbobject.py:73
+msgid "title"
+msgstr "cím"
+
+#: models.py:65 models.py:119
+msgid "used for publication"
+msgstr "közzétételhez használva"
+
+#: models.py:67
+msgid "description"
+msgstr "leírás"
+
+#: models.py:70 admin/forms.py:18
+msgid "parent Objecttype"
+msgstr "főkategória"
+
+#: models.py:95
+msgid "Objecttype"
+msgstr "kategória"
+
+#: models.py:96 models.py:114 admin/forms.py:47 plugins/models.py:24
+msgid "objecttypes"
+msgstr "kategóriák"
+
+#: models.py:101
+msgid "draft"
+msgstr "tervezet"
+
+#: models.py:102
+msgid "hidden"
+msgstr "rejtett"
+
+#: models.py:103
+msgid "published"
+msgstr "közzétett"
+
+#: models.py:107
+msgid "image"
+msgstr "kép"
+
+#: models.py:108
+msgid "used for illustration"
+msgstr "illusztrációhoz használva"
+
+#: models.py:109
+msgid "content"
+msgstr "tartalom"
+
+#: models.py:110
+msgid "excerpt"
+msgstr "idézet"
+
+#: models.py:111
+msgid "optional element"
+msgstr "választható elem"
+
+#: models.py:113 plugins/models.py:30
+msgid "tags"
+msgstr "címkék"
+
+#: models.py:116
+msgid "related gbobjects"
+msgstr "kapcsolatos bejegyzések"
+
+#: models.py:123 plugins/models.py:28
+msgid "authors"
+msgstr "szerzők"
+
+#: models.py:126
+msgid "featured"
+msgstr "Kiemelt"
+
+#: models.py:127 admin/gbobject.py:124
+msgid "comment enabled"
+msgstr "megjegyzés engedélyezve"
+
+#: models.py:128
+msgid "linkback enabled"
+msgstr "linkback engedélyezve"
+
+#: models.py:130
+msgid "creation date"
+msgstr "létrehozás dátuma"
+
+#: models.py:131
+msgid "last update"
+msgstr "utolsó frissítés"
+
+#: models.py:132
+msgid "start publication"
+msgstr "közzététel indítása"
+
+#: models.py:133
+msgid "date start publish"
+msgstr "közzététel dátuma"
+
+#: models.py:135
+msgid "end publication"
+msgstr "közzététel vége"
+
+#: models.py:136
+msgid "date end publish"
+msgstr "közzététel befejezésének dátuma"
+
+#: models.py:139
+msgid "sites publication"
+msgstr "oldalak közzététele"
+
+#: models.py:141
+msgid "login required"
+msgstr "bejelentkezés szükséges"
+
+#: models.py:142
+msgid "only authenticated users can view the gbobject"
+msgstr "a bejegyzést csak hitelesített felhasználók tekinthetik meg"
+
+#: models.py:143
+msgid "password"
+msgstr "jelszó"
+
+#: models.py:144
+msgid "protect the gbobject with a password"
+msgstr "cikk levédése jelszóval"
+
+#: models.py:146 plugins/models.py:34 plugins/models.py:58
+#: plugins/models.py:80
+msgid "template"
+msgstr "sablon"
+
+#: models.py:149
+msgid "Default template"
+msgstr "Alapértelmezett sablon"
+
+#: models.py:151
+msgid "template used to display the gbobject"
+msgstr "bejegyzéshez használt sablon"
+
+#: models.py:285
+msgid "gbobject"
+msgstr "bejegyzés"
+
+#: models.py:286 plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:57
+#: templates/objectapp/base.html:40
+msgid "gbobjects"
+msgstr "bejegyzések"
+
+#: moderator.py:45 moderator.py:72
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[ %(site)s ] Új hozzászólás érkezett \" %(title)s \""
+
+#: admin/Objecttype.py:30
+msgid "tree path"
+msgstr "fa útvonal"
+
+#: admin/gbobject.py:27 plugins/admin.py:17
+#: templates/admin/objectapp/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Tartalom"
+
+#: admin/gbobject.py:29 plugins/admin.py:19
+msgid "Options"
+msgstr "Opciók"
+
+#: admin/gbobject.py:34 plugins/admin.py:24
+msgid "Privacy"
+msgstr "Adatvédelem"
+
+#: admin/gbobject.py:36 plugins/admin.py:26
+msgid "Discussion"
+msgstr "Hozzászólás"
+
+#: admin/gbobject.py:38 plugins/admin.py:28
+msgid "Publication"
+msgstr "Közzététel"
+
+#: admin/gbobject.py:66
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr " %(title)s (%(word_count)i szavak)"
+
+#: admin/gbobject.py:70
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr " %(title)s (%(comments)i hozzászólások)"
+
+#: admin/gbobject.py:86
+msgid "author(s)"
+msgstr "szerző(k)"
+
+#: admin/gbobject.py:99
+msgid "Objecttype(s)"
+msgstr "kategória(ák)"
+
+#: admin/gbobject.py:111
+msgid "tag(s)"
+msgstr "tag(ek)"
+
+#: admin/gbobject.py:118
+msgid "site(s)"
+msgstr "helyszín(ek)"
+
+#: admin/gbobject.py:130
+msgid "is actual"
+msgstr "a tényleges"
+
+#: admin/gbobject.py:136
+msgid "is visible"
+msgstr "látható"
+
+#: admin/gbobject.py:141
+msgid "View"
+msgstr ""
+
+#: admin/gbobject.py:143
+msgid "View on site"
+msgstr "Nézd meg a helyszínen"
+
+#: admin/gbobject.py:149 templates/objectapp/_gbobject_detail.html:64
+msgid "Unavailable"
+msgstr "Nem érhető el"
+
+#: admin/gbobject.py:153
+msgid "short url"
+msgstr "Rövid url"
+
+#: admin/gbobject.py:207
+msgid "The selected gbobjects now belong to you."
+msgstr ""
+
+#: admin/gbobject.py:208
+msgid "Set the gbobjects to the user"
+msgstr "Állítsa be a bejegyzéseket a felhasználónak"
+
+#: admin/gbobject.py:214
+msgid "The selected gbobjects are now marked as published."
+msgstr ""
+
+#: admin/gbobject.py:215
+msgid "Set gbobjects selected as published"
+msgstr "Állítsa be a kiválasztott bejegyzéseket közzétettnek"
+
+#: admin/gbobject.py:220
+msgid "The selected gbobjects are now marked as hidden."
+msgstr ""
+
+#: admin/gbobject.py:221
+msgid "Set gbobjects selected as hidden"
+msgstr "Állítsa be a kiválasztott bejegyzéseket rejtettnek"
+
+#: admin/gbobject.py:234
+msgid "The selected gbobjects have been tweeted."
+msgstr ""
+
+#: admin/gbobject.py:235
+msgid "Tweet gbobjects selected"
+msgstr "Tweet a kiválasztott bejegyzéseket"
+
+#: admin/gbobject.py:240
+msgid "Comments are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:241
+msgid "Close the comments for selected gbobjects"
+msgstr "Zárja be a megjegyzéseket a kiválasztott bejegyzéseken"
+
+#: admin/gbobject.py:247
+msgid "Linkbacks are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:248
+msgid "Close the linkbacks for selected gbobjects"
+msgstr "Zárja be a hivatkozásokat a kiválasztott bejegyzéseken"
+
+#: admin/gbobject.py:254
+msgid "The selected gbobjects are now set at the current date."
+msgstr ""
+
+#: admin/gbobject.py:255
+msgid "Put the selected gbobjects on top at the current date"
+msgstr "Tegye a kiválasztott bejegyzéseket az aktuális dátum tetejére"
+
+#: admin/gbobject.py:272
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d gbobjects."
+msgstr "%(directory)s könyvtár sikeresen elért %(success)d bejegyzést."
+
+#: admin/gbobject.py:275
+msgid "Ping Directories for selected gbobjects"
+msgstr "Ping Könyvtárak a kiválasztott bejegyzésekhez"
+
+#: admin/forms.py:20
+msgid "No parent Objecttype"
+msgstr "Nem főkategória"
+
+#: admin/forms.py:35
+msgid "A Objecttype cannot be parent of itself."
+msgstr "A kategória nem lehet önmaga szülője."
+
+#: admin/forms.py:46 plugins/menu.py:70 templates/objectapp/base.html:22
+#: templates/objectapp/Objecttype_list.html:6 templates/objectapp/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:49
+msgid "Objecttypes"
+msgstr "Kategóriák"
+
+#: plugins/cms_app.py:12
+msgid "Objectapp App Hook"
+msgstr "Objectapp Program Horog"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Besorolás"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Részletes"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected gbobjects"
+msgstr "Kiválasztott bejegyzések"
+
+#: plugins/cms_plugins.py:116 templates/objectapp/base.html:59
+msgid "Random gbobjects"
+msgstr "Véletlen bejegyzések"
+
+#: plugins/menu.py:19
+msgid "Objectapp Gbobject Menu"
+msgstr "Objectapp Belépés Menü"
+
+#: plugins/menu.py:65
+msgid "Objectapp Objecttype Menu"
+msgstr "Objectapp Kategória Menü"
+
+#: plugins/menu.py:82
+msgid "Objectapp Author Menu"
+msgstr "Objectapp Szerző Menü"
+
+#: plugins/menu.py:87 templates/objectapp/author_list.html:6
+#: templates/objectapp/base.html:26 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Szerzők"
+
+#: plugins/menu.py:100
+msgid "Objectapp Tag Menu"
+msgstr "Objectapp Címke Menü"
+
+#: plugins/menu.py:105 templates/admin/objectapp/widgets/quickpost.html:25
+#: templates/objectapp/_gbobject_detail.html:47 templates/objectapp/base.html:34
+#: templates/objectapp/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Címkék"
+
+#: plugins/models.py:16
+msgid "Gbobject list (default)"
+msgstr "Nevezési lista (alapértelmezett)"
+
+#: plugins/models.py:17
+msgid "Gbobject detailed"
+msgstr "Bejegyzés részletezve"
+
+#: plugins/models.py:27
+msgid "include subobjecttypes"
+msgstr "Alkategóriák"
+
+#: plugins/models.py:33 plugins/models.py:79
+msgid "number of gbobjects"
+msgstr "bejegyzések száma"
+
+#: plugins/models.py:36 plugins/models.py:60 plugins/models.py:82
+msgid "Template used to display the plugin"
+msgstr "Segédprogram megjelenítéséhez használt sablon"
+
+#: plugins/models.py:51 plugins/models.py:73 plugins/models.py:85
+#, python-format
+msgid "%s gbobjects"
+msgstr "%s bejegyzések"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "404-es hiba"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Az oldal nem található"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Sajnáljuk, de a kért oldal nem található."
+
+#: templates/404.html:15 templates/500.html:20
+msgid "Useful links"
+msgstr "Hasznos linkek"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:24
+#: templates/500.html.py:25
+msgid "Blog index"
+msgstr "Blog-index"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:29
+#: templates/500.html.py:30 templates/objectapp/sitemap.html:4
+#: templates/objectapp/sitemap.html.py:7 templates/objectapp/skeleton.html:36
+#: templates/objectapp/skeleton.html.py:37
+msgid "Sitemap"
+msgstr "Oldaltérkép"
+
+#: templates/404.html:31 templates/500.html:36 templates/objectapp/base.html:47
+msgid "Recent gbobjects"
+msgstr "Legutóbbi bejegyzések"
+
+#: templates/404.html:36 templates/500.html:41 templates/objectapp/base.html:10
+msgid "Search"
+msgstr "Keresés"
+
+#: templates/404.html:40 templates/500.html:45 templates/objectapp/base.html:13
+msgid "Keywords..."
+msgstr "Kulcsszavak ..."
+
+#: templates/500.html:10
+msgid "Error 500"
+msgstr "500-as hiba"
+
+#: templates/500.html:13 templates/500.html.py:16
+msgid "Server error"
+msgstr "Szerver hiba"
+
+#: templates/500.html:18
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"e-mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Hiba történt. A hibát a rendszeradminisztrátorok e-mailben jelezték, és "
+"hamarosan elháritják. Köszönjük a türelmét."
+
+#: templates/admin/objectapp/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Tartalma"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:5
+#: templates/objectapp/_gbobject_detail.html:69
+msgid "Discussions"
+msgstr "Fórum"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:10
+#, python-format
+msgid "%(gbobjects)s gbobjects"
+msgstr " %(gbobjects)s bejegyzések"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s észrevételek"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:22
+#, python-format
+msgid "%(objecttypes)s objecttypes"
+msgstr " %(objecttypes)s kategóriák"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr " %(pingbacks)s pingbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr " %(tags)s címkék"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr " %(trackbacks)s trackbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr " %(authors)s szerzők"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr " %(rejects)s elutasítva"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:7
+#: templates/objectapp/gbobject_detail.html:186
+#: templates/objectapp/gbobject_detail.html:187
+msgid "Edit the gbobject"
+msgstr "Módosítsa a bejegyzést"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:10
+#: templates/comments/objectapp_gbobject_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/objectapp/_gbobject_detail.html:18
+#: templates/objectapp/gbobject_detail.html:91
+#: templates/objectapp/gbobject_detail.html:126
+#: templates/objectapp/gbobject_detail.html:157
+msgid "on"
+msgstr "-án / -én"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:16
+#: templates/comments/objectapp/gbobject/form.html:19
+msgid "Preview"
+msgstr "Előnézet"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:23
+msgid "No draft gbobjects."
+msgstr "Nincsenek piszkozatok."
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:32
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:33
+msgid "View all draft gbobjects"
+msgstr "Az összes piszkozat megtekintése"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:11
+#: templates/objectapp/_gbobject_detail.html:24
+#: templates/objectapp/tags/recent_comments.html:7
+#: templates/objectapp/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "ban"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:14
+#: templates/objectapp/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Hozzászólva"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Megjegyzés szerkesztése"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:24
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Szerkesztés"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:31
+#: templates/objectapp/_gbobject_detail.html:77
+#: templates/objectapp/gbobject_detail.html:107
+#: templates/objectapp/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Nincs még hozzászólás."
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:40
+#: templates/admin/objectapp/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Hozzászólás kezelése"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "LinkBack készült"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "LinkBack szerkesztése"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:26
+#: templates/objectapp/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Nincs még LinkBack"
+
+#: templates/admin/objectapp/widgets/content_stats.html:6
+#: templates/admin/objectapp/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Ma"
+
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:6
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:7
+msgid "Draft gbobjects"
+msgstr "Bejegyzés tervezetek"
+
+#: templates/admin/objectapp/widgets/quickpost.html:5
+#: templates/admin/objectapp/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Gyors közzététel"
+
+#: templates/admin/objectapp/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Cím"
+
+#: templates/admin/objectapp/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Mentés piszkozatként"
+
+#: templates/admin/objectapp/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Visszaállítás"
+
+#: templates/admin/objectapp/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Közzététel"
+
+#: templates/admin/objectapp/widgets/recent_comments.html:6
+#: templates/admin/objectapp/widgets/recent_comments.html:7
+#: templates/objectapp/base.html:51
+msgid "Recent comments"
+msgstr "Friss hozzászólások"
+
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:6
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:7
+#: templates/objectapp/base.html:55
+msgid "Recent linkbacks"
+msgstr "Friss LinkBacks"
+
+#: templates/comments/comment_notification_email.txt:1
+#: templates/comments/comment_reply_email.txt:1
+#: templates/objectapp/gbobject_list.html:19
+msgid "Author"
+msgstr "Szerző"
+
+#: templates/comments/comment_notification_email.txt:2
+msgid "Email"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:3
+msgid "IP"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:5
+#: templates/comments/comment_reply_email.txt:3
+msgid "Comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:8
+#: templates/comments/comment_reply_email.txt:6
+msgid "View this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:10
+msgid "Flag this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:12
+msgid "Delete this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:14
+msgid "Approve this comment"
+msgstr ""
+
+#: templates/comments/objectapp_gbobject_preview.html:4
+msgid "Comment preview"
+msgstr "Hozzászólás előnézete"
+
+#: templates/comments/objectapp_gbobject_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Kérjük, javítsa ki a következő hibát."
+msgstr[1] "Kérjük, javítsa ki a következő hibákat."
+
+#: templates/comments/objectapp_gbobject_preview.html:12
+msgid "Preview of the comment"
+msgstr "A megjegyzés előnézete"
+
+#: templates/comments/objectapp/gbobject/form.html:7
+msgid "Post your comment"
+msgstr "Küldd el a hozzászólást!"
+
+#: templates/comments/objectapp/gbobject/form.html:18
+msgid "Post"
+msgstr "Küldés"
+
+#: templates/comments/objectapp/gbobject/posted.html:4
+#: templates/comments/objectapp/gbobject/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Köszönöm a megjegyzést"
+
+#: templates/comments/objectapp/gbobject/posted.html:9
+#: templates/comments/objectapp/gbobject/posted.html:10
+msgid "Return to gbobject list"
+msgstr "Vissza a bejegyzési listára"
+
+#: templates/objectapp/_gbobject_detail.html:11
+msgid "Written by"
+msgstr "Írta:"
+
+#: templates/objectapp/_gbobject_detail.html:15
+#, python-format
+msgid "Show %(author)s gbobjects"
+msgstr "Mutasd %(author)s bejegyzéseit"
+
+#: templates/objectapp/_gbobject_detail.html:20
+msgid "Written on"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:53
+msgid "No tags"
+msgstr "Nincs címke"
+
+#: templates/objectapp/_gbobject_detail.html:58
+msgid "Short url"
+msgstr "Rövid url"
+
+#: templates/objectapp/_gbobject_detail.html:73
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s hozzászólása"
+msgstr[1] "%(comment_count)s hozzászólásai"
+
+#: templates/objectapp/_gbobject_detail.html:79
+msgid "Be first to comment!"
+msgstr "Legyen Ön az első hozzászóló!"
+
+#: templates/objectapp/_gbobject_detail.html:82
+#: templates/objectapp/gbobject_detail.html:103
+#: templates/objectapp/gbobject_detail.html:109
+msgid "Comments are closed."
+msgstr "Hozzászólások lezárva."
+
+#: templates/objectapp/_gbobject_detail.html:89
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingback"
+msgstr[1] "%(pingback_count)s pingbacks"
+
+#: templates/objectapp/_gbobject_detail.html:96
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackback"
+msgstr[1] "%(trackback_count)s trackbacks"
+
+#: templates/objectapp/author_list.html:4 templates/objectapp/author_list.html:9
+msgid "Author list"
+msgstr "Szerző lista"
+
+#: templates/objectapp/author_list.html:18 templates/objectapp/Objecttype_list.html:14
+#: templates/objectapp/sitemap.html:55 templates/objectapp/tag_list.html:16
+#: templates/objectapp/tags/authors.html:8
+#: templates/objectapp/tags/objecttypes.html:6
+#, python-format
+msgid "%(gbobject_count)s gbobject"
+msgid_plural "%(gbobject_count)s gbobjects"
+msgstr[0] "%(gbobject_count)s bejegyzés"
+msgstr[1] "%(gbobject_count)s bejegyzések"
+
+#: templates/objectapp/base.html:15
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for"
+" complex searchs."
+msgstr ""
+"Használhatja a - jelet, hogy kizárjon szavakat vagy kifejezéseket, "
+"&quot;kettős idézőjelet&quot; pontos kifejezések kereséséhez, és az AND/OR "
+"logikai operátorokat zárójelekkel kombinálva az összetett kereséseknél."
+
+#: templates/objectapp/base.html:30
+msgid "Calendar"
+msgstr "Naptár"
+
+#: templates/objectapp/base.html:63
+msgid "Popular gbobjects"
+msgstr "Népszerű bejegyzések"
+
+#: templates/objectapp/base.html:67 templates/objectapp/gbobject_archive_day.html:4
+#: templates/objectapp/gbobject_archive_day.html:6
+#: templates/objectapp/gbobject_archive_day.html:9
+#: templates/objectapp/gbobject_archive_month.html:4
+#: templates/objectapp/gbobject_archive_month.html:6
+#: templates/objectapp/gbobject_archive_month.html:9
+#: templates/objectapp/gbobject_archive_year.html:4
+#: templates/objectapp/gbobject_archive_year.html:6
+#: templates/objectapp/gbobject_archive_year.html:9
+#: templates/objectapp/tags/archives_gbobjects.html:5
+#: templates/objectapp/tags/archives_gbobjects_link.html:2
+#: templates/objectapp/tags/archives_gbobjects_tree.html:7
+#: templates/objectapp/tags/archives_gbobjects_tree.html:14
+#: templates/objectapp/tags/archives_gbobjects_tree.html:24
+msgid "Archives"
+msgstr "Arhívum"
+
+#: templates/objectapp/base.html:72
+msgid "Tools"
+msgstr "Eszközök"
+
+#: templates/objectapp/base.html:76 templates/objectapp/base.html.py:77
+msgid "Dashboard"
+msgstr "Műszerfal"
+
+#: templates/objectapp/base.html:83 templates/objectapp/base.html.py:84
+msgid "Post an gbobject"
+msgstr "Adj hozzá egy bejegyzést"
+
+#: templates/objectapp/base.html:91 templates/objectapp/base.html.py:92
+msgid "Log out"
+msgstr "Kijelentkezés"
+
+#: templates/objectapp/Objecttype_list.html:4 templates/objectapp/Objecttype_list.html:9
+msgid "Objecttype list"
+msgstr "Kategória lista"
+
+#: templates/objectapp/gbobject_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/objectapp/gbobject_archive_year.html:13
+#: templates/objectapp/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Havi arhívum"
+
+#: templates/objectapp/gbobject_detail.html:10
+msgid "RSS Feed of discussions on"
+msgstr "RSS Feed-megbeszélések a témáról"
+
+#: templates/objectapp/gbobject_detail.html:11
+msgid "RSS Feed of comments on"
+msgstr "RSS Feed észrevételek a témáról"
+
+#: templates/objectapp/gbobject_detail.html:12
+msgid "RSS Feed of pingbacks on"
+msgstr "RSS Feed pingbacks a témáról"
+
+#: templates/objectapp/gbobject_detail.html:13
+msgid "RSS Feed of trackbacks on"
+msgstr "RSS Feed trackback a témáról"
+
+#: templates/objectapp/gbobject_detail.html:29
+msgid "Next gbobject"
+msgstr "Következő bejegyzés"
+
+#: templates/objectapp/gbobject_detail.html:43
+msgid "Previous gbobject"
+msgstr "Előző bejegyzés"
+
+#: templates/objectapp/gbobject_detail.html:56
+msgid "Related gbobjects"
+msgstr "Kapcsolódó bejegyzések"
+
+#: templates/objectapp/gbobject_detail.html:67
+msgid "Similar gbobjects"
+msgstr "Hasonló bejegyzések"
+
+#: templates/objectapp/gbobject_detail.html:75
+msgid "Comments"
+msgstr "Hozzászólások"
+
+#: templates/objectapp/gbobject_detail.html:117
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/objectapp/gbobject_detail.html:139
+msgid "Pingbacks are open."
+msgstr "Pingbacks nyitva."
+
+#: templates/objectapp/gbobject_detail.html:141
+msgid "Pingbacks are closed."
+msgstr "Pingbacks zárva."
+
+#: templates/objectapp/gbobject_detail.html:148
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/objectapp/gbobject_detail.html:170
+msgid "Trackback URL"
+msgstr "Trackback URL"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "Latest gbobjects for"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the Objecttype"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4 templates/objectapp/gbobject_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:9 templates/objectapp/gbobject_list.html:12
+#: templates/objectapp/gbobject_list.html:15 templates/objectapp/skeleton.html:40
+msgid "RSS Feed"
+msgstr "RSS Feed"
+
+#: templates/objectapp/gbobject_list.html:19
+msgid "Objecttype"
+msgstr "Kategória"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_list.html:30
+msgid "Tag"
+msgstr "Címke"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_search.html:4
+msgid "Page"
+msgstr "Oldal"
+
+#: templates/objectapp/gbobject_list.html:34
+#, python-format
+msgid "Gbobjects by %(author)s"
+msgstr "Bejegyzés szerzője %(author)s "
+
+#: templates/objectapp/gbobject_list.html:45 templates/objectapp/sitemap.html:23
+#: templates/objectapp/sitemap.html.py:43
+#: templates/objectapp/cms/gbobject_detail.html:12
+#: templates/objectapp/cms/gbobject_list.html:9
+#: templates/objectapp/tags/featured_gbobjects.html:9
+#: templates/objectapp/tags/popular_gbobjects.html:13
+#: templates/objectapp/tags/random_gbobjects.html:9
+#: templates/objectapp/tags/recent_gbobjects.html:9
+msgid "No gbobjects yet."
+msgstr "Nincs még bejegyzés."
+
+#: templates/objectapp/gbobject_list.html:51 templates/objectapp/gbobject_search.html:40
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "%(current_page)s . oldal a %(total_page)s -ból/-ből"
+
+#: templates/objectapp/gbobject_list.html:56 templates/objectapp/gbobject_search.html:45
+msgid "More recent gbobjects"
+msgstr "Mégtöbb új bejegyzés"
+
+#: templates/objectapp/gbobject_list.html:65 templates/objectapp/gbobject_search.html:54
+msgid "Gbobjects page"
+msgstr "Bejegyzések oldal"
+
+#: templates/objectapp/gbobject_list.html:72 templates/objectapp/gbobject_search.html:61
+msgid "More old gbobjects"
+msgstr "Mégtöbb régi bejegyzés"
+
+#: templates/objectapp/gbobject_list.html:82 templates/objectapp/gbobject_list.html:83
+msgid "Edit the Objecttype"
+msgstr "Kategória szerkesztése"
+
+#: templates/objectapp/gbobject_list.html:89 templates/objectapp/gbobject_list.html:90
+msgid "Edit the tag"
+msgstr "Címke szerkesztése"
+
+#: templates/objectapp/gbobject_list.html:96 templates/objectapp/gbobject_list.html:97
+msgid "Edit the author"
+msgstr "Szerző kijavítása"
+
+#: templates/objectapp/gbobject_search.html:4 templates/objectapp/gbobject_search.html:6
+#: templates/objectapp/gbobject_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/objectapp/gbobject_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "A találatok RSS Feed-je"
+
+#: templates/objectapp/gbobject_search.html:22
+#, python-format
+msgid "%(gbobject_count)s gbobject found"
+msgid_plural "%(gbobject_count)s gbobjects found"
+msgstr[0] "%(gbobject_count)s bejegyzést találtam"
+msgstr[1] " %(gbobject_count)s bejegyzést találtam"
+
+#: templates/objectapp/gbobject_search.html:34
+msgid "Nothing found."
+msgstr "Nincs találat."
+
+#: templates/objectapp/login.html:4 templates/objectapp/login.html.py:7
+msgid "Login required"
+msgstr "Bejelentkezés szükséges"
+
+#: templates/objectapp/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr "Felhasználóneve és jelszava nem egyezik. Kérjük, próbálja újra."
+
+#: templates/objectapp/login.html:16
+msgid "You need to be connected to view this gbobject."
+msgstr "A bejegyzés megtekintéséhez be kell jelentkeznie."
+
+#: templates/objectapp/login.html:33
+msgid "Login"
+msgstr "Bejelentkezés"
+
+#: templates/objectapp/password.html:4 templates/objectapp/password.html.py:7
+msgid "Password required"
+msgstr "Jelszó szükséges"
+
+#: templates/objectapp/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "A megadott jelszó nem érvényes. Kérjük, próbálja újra."
+
+#: templates/objectapp/password.html:16
+msgid "You need to provide a password to view this gbobject."
+msgstr "Meg kell adnia egy jelszót, hogy megtekinthesse ezt a bejegyzést."
+
+#: templates/objectapp/password.html:23
+msgid "Password"
+msgstr "Jelszó"
+
+#: templates/objectapp/password.html:28
+msgid "Valid"
+msgstr "Érvényes"
+
+#: templates/objectapp/sitemap.html:10
+msgid "Gbobjects per objecttypes"
+msgstr "Bejegyzések egyes kategóriákban"
+
+#: templates/objectapp/sitemap.html:18 templates/objectapp/sitemap.html.py:38
+#: templates/objectapp/tags/popular_gbobjects.html:8
+msgid "comment"
+msgstr "megjegyzés"
+
+#: templates/objectapp/sitemap.html:31
+msgid "All the gbobjects"
+msgstr "Az összes bejegyzés"
+
+#: templates/objectapp/sitemap.html:60 templates/objectapp/tags/objecttypes.html:11
+msgid "No objecttypes yet."
+msgstr "Nincs még kategória."
+
+#: templates/objectapp/skeleton.html:27 templates/objectapp/skeleton.html.py:39
+msgid "RSS Feed of latest gbobjects"
+msgstr "RSS link a legutóbbi bejegyzésekhez"
+
+#: templates/objectapp/tag_list.html:4 templates/objectapp/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Címke lista"
+
+#: templates/objectapp/wlwmanifest.xml:40
+msgid "View site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:41
+msgid "Admin. site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:53
+msgid "Manage comments"
+msgstr ""
+
+#: templates/objectapp/tags/archives_gbobjects.html:12
+#: templates/objectapp/tags/archives_gbobjects_tree.html:38
+msgid "No archives yet."
+msgstr "Nincsenek még arhívumok."
+
+#: templates/objectapp/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Nincsenek még szerzők."
+
+#: templates/objectapp/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkback létrehozása"
+
+#: templates/objectapp/tags/similar_gbobjects.html:9
+msgid "No similar gbobjects."
+msgstr "Nincsenek hasonló bejegyzések."
+
+#: tests/views.py:165 views/search.py:18
+msgid "The pattern is too short"
+msgstr "A megadott kifejezés túl rövid"
+
+#: tests/views.py:168 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Nincs találat a megadott kifejezésre"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Felhasználónév helytelen."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Jelszó érvénytelen."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Ez a felhasználói név már foglalt."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "A felhasználó nem %s."
+
+#: xmlrpc/pingback.py:93
+msgid "No title"
+msgstr "Nincs cím"
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/it/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/objectapp/locale/it/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..0cec5fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/it/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/it/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/objectapp/locale/it/LC_MESSAGES/django.po
new file mode 100644
index 0000000..8c37e7c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/it/LC_MESSAGES/django.po
@@ -0,0 +1,1196 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# babu <marco.badan@gmail.com>, 2011.
+# Julien Fache <fantomas42@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-blog-objectapp\n"
+"Report-Msgid-Bugs-To: https://github.com/Fantomas42/django-blog-objectapp/issues\n"
+"POT-Creation-Date: 2011-04-12 13:21-0500\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:102 plugins/cms_plugins.py:23
+#: templates/objectapp/gbobject_archive.html:4
+#: templates/objectapp/gbobject_archive.html:25 templates/objectapp/gbobject_list.html:19
+#: tests/feeds.py:115
+msgid "Latest gbobjects"
+msgstr "Ultimi articoli"
+
+#: feeds.py:106 tests/feeds.py:117
+#, python-format
+msgid "The latest gbobjects for the site %s"
+msgstr "Gli ultimi articoli del sito %s"
+
+#: feeds.py:126 tests/feeds.py:126
+#, python-format
+msgid "Gbobjects for the Objecttype %s"
+msgstr "Articoli per la categoria %s"
+
+#: feeds.py:130 tests/feeds.py:128
+#, python-format
+msgid "The latest gbobjects for the Objecttype %s"
+msgstr "Gli ultimi articoli per la categoria %s"
+
+#: feeds.py:150 tests/feeds.py:137
+#, python-format
+msgid "Gbobjects for author %s"
+msgstr "Articoli di %s"
+
+#: feeds.py:154 tests/feeds.py:139
+#, python-format
+msgid "The latest gbobjects by %s"
+msgstr "Gli ultimi articoli di %s"
+
+#: feeds.py:175 tests/feeds.py:149
+#, python-format
+msgid "Gbobjects for the tag %s"
+msgstr "Articoli taggati come %s"
+
+#: feeds.py:179 tests/feeds.py:151
+#, python-format
+msgid "The latest gbobjects for the tag %s"
+msgstr "Ultimi articoli taggati come %s"
+
+#: feeds.py:199 tests/feeds.py:160
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:162
+#, python-format
+msgid "The gbobjects containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:245 tests/feeds.py:178
+#, python-format
+msgid "Discussions on %s"
+msgstr "Discussioni su %s"
+
+#: feeds.py:249 tests/feeds.py:180
+#, python-format
+msgid "The latest discussions for the gbobject %s"
+msgstr "Ultime discussioni sull'articolo %s"
+
+#: feeds.py:267 tests/feeds.py:190
+#, python-format
+msgid "Comments on %s"
+msgstr "Commenti su : %s"
+
+#: feeds.py:271 tests/feeds.py:192
+#, python-format
+msgid "The latest comments for the gbobject %s"
+msgstr "Ultimi commenti sull'articolo %s"
+
+#: feeds.py:301 tests/feeds.py:206
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingback su %s"
+
+#: feeds.py:305 tests/feeds.py:208
+#, python-format
+msgid "The latest pingbacks for the gbobject %s"
+msgstr "Ultimi pingback sull'articolo %s"
+
+#: feeds.py:323 tests/feeds.py:218
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackback su %s"
+
+#: feeds.py:327 tests/feeds.py:220
+#, python-format
+msgid "The latest trackbacks for the gbobject %s"
+msgstr "Ultimi trackback sull'articolo %s"
+
+#: models.py:64 models.py:105 admin/gbobject.py:73
+msgid "title"
+msgstr "titolo"
+
+#: models.py:65 models.py:119
+msgid "used for publication"
+msgstr "usata per la pubblicazione"
+
+#: models.py:67
+msgid "description"
+msgstr "descrizione"
+
+#: models.py:70 admin/forms.py:18
+msgid "parent Objecttype"
+msgstr "categoria padre"
+
+#: models.py:95
+msgid "Objecttype"
+msgstr "categoria"
+
+#: models.py:96 models.py:114 admin/forms.py:47 plugins/models.py:24
+msgid "objecttypes"
+msgstr "categorie"
+
+#: models.py:101
+msgid "draft"
+msgstr "bozza"
+
+#: models.py:102
+msgid "hidden"
+msgstr "non pubblicato"
+
+#: models.py:103
+msgid "published"
+msgstr "pubblicato"
+
+#: models.py:107
+msgid "image"
+msgstr "immagine"
+
+#: models.py:108
+msgid "used for illustration"
+msgstr "usata come illustrazione"
+
+#: models.py:109
+msgid "content"
+msgstr "contenuto"
+
+#: models.py:110
+msgid "excerpt"
+msgstr "estratto"
+
+#: models.py:111
+msgid "optional element"
+msgstr "elemento opzionale"
+
+#: models.py:113 plugins/models.py:30
+msgid "tags"
+msgstr "tag"
+
+#: models.py:116
+msgid "related gbobjects"
+msgstr "articoli correlati"
+
+#: models.py:123 plugins/models.py:28
+msgid "authors"
+msgstr "autori"
+
+#: models.py:126
+msgid "featured"
+msgstr ""
+
+#: models.py:127 admin/gbobject.py:124
+msgid "comment enabled"
+msgstr "commenti abilitati"
+
+#: models.py:128
+msgid "linkback enabled"
+msgstr "linkback abilitati"
+
+#: models.py:130
+msgid "creation date"
+msgstr "data di creazione"
+
+#: models.py:131
+msgid "last update"
+msgstr "ultimo aggiornamento"
+
+#: models.py:132
+msgid "start publication"
+msgstr "inizio pubblicazione"
+
+#: models.py:133
+msgid "date start publish"
+msgstr "data inizio pubblicazione"
+
+#: models.py:135
+msgid "end publication"
+msgstr "fine pubblicazione"
+
+#: models.py:136
+msgid "date end publish"
+msgstr "data fine pubblicazione"
+
+#: models.py:139
+msgid "sites publication"
+msgstr "pubblicato sui siti"
+
+#: models.py:141
+msgid "login required"
+msgstr "richiesta identificazione"
+
+#: models.py:142
+msgid "only authenticated users can view the gbobject"
+msgstr "solo i visitatori autenticati possono vedere l'articolo"
+
+#: models.py:143
+msgid "password"
+msgstr "password"
+
+#: models.py:144
+msgid "protect the gbobject with a password"
+msgstr "proteggi l'articolo con una password"
+
+#: models.py:146 plugins/models.py:34 plugins/models.py:58
+#: plugins/models.py:80
+msgid "template"
+msgstr "template"
+
+#: models.py:149
+msgid "Default template"
+msgstr "Template di default"
+
+#: models.py:151
+msgid "template used to display the gbobject"
+msgstr "Template utilizzato per visualizzare l'articolo"
+
+#: models.py:285
+msgid "gbobject"
+msgstr "articolo"
+
+#: models.py:286 plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:57
+#: templates/objectapp/base.html:40
+msgid "gbobjects"
+msgstr "articoli"
+
+#: moderator.py:45 moderator.py:72
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Nuovo commento inviato su \"%(title)s\""
+
+#: admin/Objecttype.py:30
+msgid "tree path"
+msgstr "alberatura"
+
+#: admin/gbobject.py:27 plugins/admin.py:17
+#: templates/admin/objectapp/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Contenuto"
+
+#: admin/gbobject.py:29 plugins/admin.py:19
+msgid "Options"
+msgstr "Opzioni"
+
+#: admin/gbobject.py:34 plugins/admin.py:24
+msgid "Privacy"
+msgstr "Privacy"
+
+#: admin/gbobject.py:36 plugins/admin.py:26
+msgid "Discussion"
+msgstr "Discussione"
+
+#: admin/gbobject.py:38 plugins/admin.py:28
+msgid "Publication"
+msgstr "Pubblicazione"
+
+#: admin/gbobject.py:66
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i parole)"
+
+#: admin/gbobject.py:70
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i commenti)"
+
+#: admin/gbobject.py:86
+msgid "author(s)"
+msgstr "autore(i)"
+
+#: admin/gbobject.py:99
+msgid "Objecttype(s)"
+msgstr "Categoria(e)"
+
+#: admin/gbobject.py:111
+msgid "tag(s)"
+msgstr "Tag"
+
+#: admin/gbobject.py:118
+msgid "site(s)"
+msgstr "Site(s)"
+
+#: admin/gbobject.py:130
+msgid "is actual"
+msgstr "in corso"
+
+#: admin/gbobject.py:136
+msgid "is visible"
+msgstr "visibile ?"
+
+#: admin/gbobject.py:141
+msgid "View"
+msgstr ""
+
+#: admin/gbobject.py:143
+msgid "View on site"
+msgstr "Guarda sul sito"
+
+#: admin/gbobject.py:149 templates/objectapp/_gbobject_detail.html:64
+msgid "Unavailable"
+msgstr "Non disponibile"
+
+#: admin/gbobject.py:153
+msgid "short url"
+msgstr "url breve"
+
+#: admin/gbobject.py:207
+msgid "The selected gbobjects now belong to you."
+msgstr ""
+
+#: admin/gbobject.py:208
+msgid "Set the gbobjects to the user"
+msgstr "Attribuisci gli articoli all'utente"
+
+#: admin/gbobject.py:214
+msgid "The selected gbobjects are now marked as published."
+msgstr ""
+
+#: admin/gbobject.py:215
+msgid "Set gbobjects selected as published"
+msgstr "Pubblica gli articoli selezionati"
+
+#: admin/gbobject.py:220
+msgid "The selected gbobjects are now marked as hidden."
+msgstr ""
+
+#: admin/gbobject.py:221
+msgid "Set gbobjects selected as hidden"
+msgstr "Nascondi gli articoli selezionati"
+
+#: admin/gbobject.py:234
+msgid "The selected gbobjects have been tweeted."
+msgstr ""
+
+#: admin/gbobject.py:235
+msgid "Tweet gbobjects selected"
+msgstr "Manda un tweet per gli articoli selezionati"
+
+#: admin/gbobject.py:240
+msgid "Comments are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:241
+msgid "Close the comments for selected gbobjects"
+msgstr "Chiudi i commenti per gli articoli selezionati"
+
+#: admin/gbobject.py:247
+msgid "Linkbacks are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:248
+msgid "Close the linkbacks for selected gbobjects"
+msgstr "Chiudi i linkback per gli articoli selezionati"
+
+#: admin/gbobject.py:254
+msgid "The selected gbobjects are now set at the current date."
+msgstr ""
+
+#: admin/gbobject.py:255
+msgid "Put the selected gbobjects on top at the current date"
+msgstr ""
+
+#: admin/gbobject.py:272
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d gbobjects."
+msgstr ""
+"La directory %(directory)s è stata pingata con successo per %(success)d "
+"articoli."
+
+#: admin/gbobject.py:275
+msgid "Ping Directories for selected gbobjects"
+msgstr "Pinga le directory per gli articoli selezionati"
+
+#: admin/forms.py:20
+msgid "No parent Objecttype"
+msgstr "Nessuna categoria padre"
+
+#: admin/forms.py:35
+msgid "A Objecttype cannot be parent of itself."
+msgstr "Una categoria non può essere categoria padre di se stessa."
+
+#: admin/forms.py:46 plugins/menu.py:70 templates/objectapp/base.html:22
+#: templates/objectapp/Objecttype_list.html:6 templates/objectapp/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:49
+msgid "Objecttypes"
+msgstr "Catégories"
+
+#: plugins/cms_app.py:12
+msgid "Objectapp App Hook"
+msgstr "Applicazione Objectapp"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Ordinamento"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Avanzato"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected gbobjects"
+msgstr "Articoli selezionati"
+
+#: plugins/cms_plugins.py:116 templates/objectapp/base.html:59
+msgid "Random gbobjects"
+msgstr "Articoli random"
+
+#: plugins/menu.py:19
+msgid "Objectapp Gbobject Menu"
+msgstr "Menu Articoli Objectapp"
+
+#: plugins/menu.py:65
+msgid "Objectapp Objecttype Menu"
+msgstr "Menu Categorie Objectapp"
+
+#: plugins/menu.py:82
+msgid "Objectapp Author Menu"
+msgstr "Menu Auteur Objectapp"
+
+#: plugins/menu.py:87 templates/objectapp/author_list.html:6
+#: templates/objectapp/base.html:26 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Autori"
+
+#: plugins/menu.py:100
+msgid "Objectapp Tag Menu"
+msgstr "Menu Tag Objectapp"
+
+#: plugins/menu.py:105 templates/admin/objectapp/widgets/quickpost.html:25
+#: templates/objectapp/_gbobject_detail.html:47 templates/objectapp/base.html:34
+#: templates/objectapp/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Tag"
+
+#: plugins/models.py:16
+msgid "Gbobject list (default)"
+msgstr "Elenco di articoli (default)"
+
+#: plugins/models.py:17
+msgid "Gbobject detailed"
+msgstr "Dettaglio articolo"
+
+#: plugins/models.py:27
+msgid "include subobjecttypes"
+msgstr "sottocategorie incluse"
+
+#: plugins/models.py:33 plugins/models.py:79
+msgid "number of gbobjects"
+msgstr "numero di articoli"
+
+#: plugins/models.py:36 plugins/models.py:60 plugins/models.py:82
+msgid "Template used to display the plugin"
+msgstr "Modello utilizzato per visualizzare il plugin"
+
+#: plugins/models.py:51 plugins/models.py:73 plugins/models.py:85
+#, python-format
+msgid "%s gbobjects"
+msgstr "%s articoli"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Errore 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Pagina non trovata"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Spiacente, ma la pagina richiesta è introvabile."
+
+#: templates/404.html:15 templates/500.html:20
+msgid "Useful links"
+msgstr "Link utili"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:24
+#: templates/500.html.py:25
+msgid "Blog index"
+msgstr "Indice del blog"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:29
+#: templates/500.html.py:30 templates/objectapp/sitemap.html:4
+#: templates/objectapp/sitemap.html.py:7 templates/objectapp/skeleton.html:36
+#: templates/objectapp/skeleton.html.py:37
+msgid "Sitemap"
+msgstr "Mappa del site"
+
+#: templates/404.html:31 templates/500.html:36 templates/objectapp/base.html:47
+msgid "Recent gbobjects"
+msgstr "Articoli recenti"
+
+#: templates/404.html:36 templates/500.html:41 templates/objectapp/base.html:10
+msgid "Search"
+msgstr "Ricerca"
+
+#: templates/404.html:40 templates/500.html:45 templates/objectapp/base.html:13
+msgid "Keywords..."
+msgstr "Parole chiave..."
+
+#: templates/500.html:10
+msgid "Error 500"
+msgstr "Errore 500"
+
+#: templates/500.html:13 templates/500.html.py:16
+msgid "Server error"
+msgstr "Errore del server"
+
+#: templates/500.html:18
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"e-mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"C'è stato un errore. E' stato riportato agli amministratori del sito per "
+"email e dovrebbe venire risolto a breve. Grazie per la tua pazienza."
+
+#: templates/admin/objectapp/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Contenuti"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:5
+#: templates/objectapp/_gbobject_detail.html:69
+msgid "Discussions"
+msgstr "Discussioni"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:10
+#, python-format
+msgid "%(gbobjects)s gbobjects"
+msgstr ""
+"%(gbobjects)s articoli\n"
+" "
+
+#: templates/admin/objectapp/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s commenti"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:22
+#, python-format
+msgid "%(objecttypes)s objecttypes"
+msgstr "%(objecttypes)s categorie"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s pingback"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s tag"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s trackback"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s autori"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s respinti"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:7
+#: templates/objectapp/gbobject_detail.html:186
+#: templates/objectapp/gbobject_detail.html:187
+msgid "Edit the gbobject"
+msgstr "Modifica l'articolo"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:10
+#: templates/comments/objectapp_gbobject_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/objectapp/_gbobject_detail.html:18
+#: templates/objectapp/gbobject_detail.html:91
+#: templates/objectapp/gbobject_detail.html:126
+#: templates/objectapp/gbobject_detail.html:157
+msgid "on"
+msgstr "il"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:16
+#: templates/comments/objectapp/gbobject/form.html:19
+msgid "Preview"
+msgstr "Anteprima"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:23
+msgid "No draft gbobjects."
+msgstr "Nessun articolo in draft."
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:32
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:33
+msgid "View all draft gbobjects"
+msgstr "articoli correlati"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:11
+#: templates/objectapp/_gbobject_detail.html:24
+#: templates/objectapp/tags/recent_comments.html:7
+#: templates/objectapp/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "su"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:14
+#: templates/objectapp/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Commenti su"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Modifica il commento"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:24
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Modifica"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:31
+#: templates/objectapp/_gbobject_detail.html:77
+#: templates/objectapp/gbobject_detail.html:107
+#: templates/objectapp/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Nessun commento."
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:40
+#: templates/admin/objectapp/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Gestisci i commenti"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Modifica il LinkBack"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:26
+#: templates/objectapp/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Ancora nessun linkback."
+
+#: templates/admin/objectapp/widgets/content_stats.html:6
+#: templates/admin/objectapp/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Oggi"
+
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:6
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:7
+msgid "Draft gbobjects"
+msgstr "Articoli in draft"
+
+#: templates/admin/objectapp/widgets/quickpost.html:5
+#: templates/admin/objectapp/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Pubblicazione veloce"
+
+#: templates/admin/objectapp/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Titolo"
+
+#: templates/admin/objectapp/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Salva come bozza"
+
+#: templates/admin/objectapp/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Pubblica"
+
+#: templates/admin/objectapp/widgets/recent_comments.html:6
+#: templates/admin/objectapp/widgets/recent_comments.html:7
+#: templates/objectapp/base.html:51
+msgid "Recent comments"
+msgstr "Commenti recenti"
+
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:6
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:7
+#: templates/objectapp/base.html:55
+msgid "Recent linkbacks"
+msgstr "Linkback recenti"
+
+#: templates/comments/comment_notification_email.txt:1
+#: templates/comments/comment_reply_email.txt:1
+#: templates/objectapp/gbobject_list.html:19
+msgid "Author"
+msgstr "Autore"
+
+#: templates/comments/comment_notification_email.txt:2
+msgid "Email"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:3
+msgid "IP"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:5
+#: templates/comments/comment_reply_email.txt:3
+msgid "Comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:8
+#: templates/comments/comment_reply_email.txt:6
+msgid "View this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:10
+msgid "Flag this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:12
+msgid "Delete this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:14
+msgid "Approve this comment"
+msgstr ""
+
+#: templates/comments/objectapp_gbobject_preview.html:4
+msgid "Comment preview"
+msgstr "Anteprima commento"
+
+#: templates/comments/objectapp_gbobject_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Prego correggi l'errore seguente."
+msgstr[1] "Prego correggi gli errori seguenti."
+
+#: templates/comments/objectapp_gbobject_preview.html:12
+msgid "Preview of the comment"
+msgstr "Anteprima del commento"
+
+#: templates/comments/objectapp/gbobject/form.html:7
+msgid "Post your comment"
+msgstr "Invia un commento"
+
+#: templates/comments/objectapp/gbobject/form.html:18
+msgid "Post"
+msgstr "Invia"
+
+#: templates/comments/objectapp/gbobject/posted.html:4
+#: templates/comments/objectapp/gbobject/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Grazie per il tuo commento"
+
+#: templates/comments/objectapp/gbobject/posted.html:9
+#: templates/comments/objectapp/gbobject/posted.html:10
+msgid "Return to gbobject list"
+msgstr "Torna all'elenco degli articoli"
+
+#: templates/objectapp/_gbobject_detail.html:11
+msgid "Written by"
+msgstr "Scritto da"
+
+#: templates/objectapp/_gbobject_detail.html:15
+#, python-format
+msgid "Show %(author)s gbobjects"
+msgstr "Mostra gli articoli di %(author)s"
+
+#: templates/objectapp/_gbobject_detail.html:20
+msgid "Written on"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:53
+msgid "No tags"
+msgstr "Nessun tag"
+
+#: templates/objectapp/_gbobject_detail.html:58
+msgid "Short url"
+msgstr "Url breve"
+
+#: templates/objectapp/_gbobject_detail.html:73
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s commento"
+msgstr[1] "%(comment_count)s commenti"
+
+#: templates/objectapp/_gbobject_detail.html:79
+msgid "Be first to comment!"
+msgstr "Sarai il primo a commentare!"
+
+#: templates/objectapp/_gbobject_detail.html:82
+#: templates/objectapp/gbobject_detail.html:103
+#: templates/objectapp/gbobject_detail.html:109
+msgid "Comments are closed."
+msgstr "I commenti sono terminati."
+
+#: templates/objectapp/_gbobject_detail.html:89
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingback"
+msgstr[1] "%(pingback_count)s pingback"
+
+#: templates/objectapp/_gbobject_detail.html:96
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackback"
+msgstr[1] "%(trackback_count)s trackback"
+
+#: templates/objectapp/author_list.html:4 templates/objectapp/author_list.html:9
+msgid "Author list"
+msgstr "Elenco degli autori"
+
+#: templates/objectapp/author_list.html:18 templates/objectapp/Objecttype_list.html:14
+#: templates/objectapp/sitemap.html:55 templates/objectapp/tag_list.html:16
+#: templates/objectapp/tags/authors.html:8
+#: templates/objectapp/tags/objecttypes.html:6
+#, python-format
+msgid "%(gbobject_count)s gbobject"
+msgid_plural "%(gbobject_count)s gbobjects"
+msgstr[0] "%(gbobject_count)s articolo"
+msgstr[1] "%(gbobject_count)s articoli"
+
+#: templates/objectapp/base.html:15
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for"
+" complex searchs."
+msgstr ""
+
+#: templates/objectapp/base.html:30
+msgid "Calendar"
+msgstr "Calendario"
+
+#: templates/objectapp/base.html:63
+msgid "Popular gbobjects"
+msgstr "Articoli popolari"
+
+#: templates/objectapp/base.html:67 templates/objectapp/gbobject_archive_day.html:4
+#: templates/objectapp/gbobject_archive_day.html:6
+#: templates/objectapp/gbobject_archive_day.html:9
+#: templates/objectapp/gbobject_archive_month.html:4
+#: templates/objectapp/gbobject_archive_month.html:6
+#: templates/objectapp/gbobject_archive_month.html:9
+#: templates/objectapp/gbobject_archive_year.html:4
+#: templates/objectapp/gbobject_archive_year.html:6
+#: templates/objectapp/gbobject_archive_year.html:9
+#: templates/objectapp/tags/archives_gbobjects.html:5
+#: templates/objectapp/tags/archives_gbobjects_link.html:2
+#: templates/objectapp/tags/archives_gbobjects_tree.html:7
+#: templates/objectapp/tags/archives_gbobjects_tree.html:14
+#: templates/objectapp/tags/archives_gbobjects_tree.html:24
+msgid "Archives"
+msgstr "Archivi"
+
+#: templates/objectapp/base.html:72
+msgid "Tools"
+msgstr "Strumenti"
+
+#: templates/objectapp/base.html:76 templates/objectapp/base.html.py:77
+msgid "Dashboard"
+msgstr "Dashboard"
+
+#: templates/objectapp/base.html:83 templates/objectapp/base.html.py:84
+msgid "Post an gbobject"
+msgstr "Posta un articolo"
+
+#: templates/objectapp/base.html:91 templates/objectapp/base.html.py:92
+msgid "Log out"
+msgstr "Esci"
+
+#: templates/objectapp/Objecttype_list.html:4 templates/objectapp/Objecttype_list.html:9
+msgid "Objecttype list"
+msgstr "Elenco delle categorie"
+
+#: templates/objectapp/gbobject_archive_month.html:13
+msgid "Daily archives"
+msgstr "Archivi giornalieri"
+
+#: templates/objectapp/gbobject_archive_year.html:13
+#: templates/objectapp/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Archivio mensile"
+
+#: templates/objectapp/gbobject_detail.html:10
+msgid "RSS Feed of discussions on"
+msgstr "Feed RSS delle discussioni su"
+
+#: templates/objectapp/gbobject_detail.html:11
+msgid "RSS Feed of comments on"
+msgstr "Feed RSS dei commenti su"
+
+#: templates/objectapp/gbobject_detail.html:12
+msgid "RSS Feed of pingbacks on"
+msgstr "Feed RSS dei pingback su"
+
+#: templates/objectapp/gbobject_detail.html:13
+msgid "RSS Feed of trackbacks on"
+msgstr "Feed RSS dei trackback su"
+
+#: templates/objectapp/gbobject_detail.html:29
+msgid "Next gbobject"
+msgstr "Articolo successivo"
+
+#: templates/objectapp/gbobject_detail.html:43
+msgid "Previous gbobject"
+msgstr "Articolo precedente"
+
+#: templates/objectapp/gbobject_detail.html:56
+msgid "Related gbobjects"
+msgstr "Articles associés"
+
+#: templates/objectapp/gbobject_detail.html:67
+msgid "Similar gbobjects"
+msgstr "Articoli simili"
+
+#: templates/objectapp/gbobject_detail.html:75
+msgid "Comments"
+msgstr "Commenti"
+
+#: templates/objectapp/gbobject_detail.html:117
+msgid "Pingbacks"
+msgstr "Pingback"
+
+#: templates/objectapp/gbobject_detail.html:139
+msgid "Pingbacks are open."
+msgstr "I pingback sono aperti."
+
+#: templates/objectapp/gbobject_detail.html:141
+msgid "Pingbacks are closed."
+msgstr "I pingback sono chiusi."
+
+#: templates/objectapp/gbobject_detail.html:148
+msgid "Trackbacks"
+msgstr "Trackback"
+
+#: templates/objectapp/gbobject_detail.html:170
+msgid "Trackback URL"
+msgstr "URL del Trackback"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "Latest gbobjects for"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the Objecttype"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4 templates/objectapp/gbobject_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:9 templates/objectapp/gbobject_list.html:12
+#: templates/objectapp/gbobject_list.html:15 templates/objectapp/skeleton.html:40
+msgid "RSS Feed"
+msgstr "Feed RSS"
+
+#: templates/objectapp/gbobject_list.html:19
+msgid "Objecttype"
+msgstr "Categorie"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_list.html:30
+msgid "Tag"
+msgstr "Tag"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_search.html:4
+msgid "Page"
+msgstr "Pagina"
+
+#: templates/objectapp/gbobject_list.html:34
+#, python-format
+msgid "Gbobjects by %(author)s"
+msgstr "Articoli di %(author)s"
+
+#: templates/objectapp/gbobject_list.html:45 templates/objectapp/sitemap.html:23
+#: templates/objectapp/sitemap.html.py:43
+#: templates/objectapp/cms/gbobject_detail.html:12
+#: templates/objectapp/cms/gbobject_list.html:9
+#: templates/objectapp/tags/featured_gbobjects.html:9
+#: templates/objectapp/tags/popular_gbobjects.html:13
+#: templates/objectapp/tags/random_gbobjects.html:9
+#: templates/objectapp/tags/recent_gbobjects.html:9
+msgid "No gbobjects yet."
+msgstr "Non ci sono ancora articoli."
+
+#: templates/objectapp/gbobject_list.html:51 templates/objectapp/gbobject_search.html:40
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Pagina %(current_page)s di %(total_page)s"
+
+#: templates/objectapp/gbobject_list.html:56 templates/objectapp/gbobject_search.html:45
+msgid "More recent gbobjects"
+msgstr "Articoli più recenti"
+
+#: templates/objectapp/gbobject_list.html:65 templates/objectapp/gbobject_search.html:54
+msgid "Gbobjects page"
+msgstr "Pagina degli articoli"
+
+#: templates/objectapp/gbobject_list.html:72 templates/objectapp/gbobject_search.html:61
+msgid "More old gbobjects"
+msgstr "Articoli vecchi"
+
+#: templates/objectapp/gbobject_list.html:82 templates/objectapp/gbobject_list.html:83
+msgid "Edit the Objecttype"
+msgstr "Modifica la categoria"
+
+#: templates/objectapp/gbobject_list.html:89 templates/objectapp/gbobject_list.html:90
+msgid "Edit the tag"
+msgstr "Modifica il tag"
+
+#: templates/objectapp/gbobject_list.html:96 templates/objectapp/gbobject_list.html:97
+msgid "Edit the author"
+msgstr "Modifica l'autore"
+
+#: templates/objectapp/gbobject_search.html:4 templates/objectapp/gbobject_search.html:6
+#: templates/objectapp/gbobject_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/objectapp/gbobject_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "Feed RSS dei risultati della ricerca per"
+
+#: templates/objectapp/gbobject_search.html:22
+#, python-format
+msgid "%(gbobject_count)s gbobject found"
+msgid_plural "%(gbobject_count)s gbobjects found"
+msgstr[0] "%(gbobject_count)s articolo trouvato"
+msgstr[1] "%(gbobject_count)s articoli trovati"
+
+#: templates/objectapp/gbobject_search.html:34
+msgid "Nothing found."
+msgstr "Nessun articolo trovato."
+
+#: templates/objectapp/login.html:4 templates/objectapp/login.html.py:7
+msgid "Login required"
+msgstr "Login richiesto"
+
+#: templates/objectapp/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+"La tua username e la password non corrispondono. Per cortesia riprova."
+
+#: templates/objectapp/login.html:16
+msgid "You need to be connected to view this gbobject."
+msgstr "Devi essere collegato per vedere questo articolo."
+
+#: templates/objectapp/login.html:33
+msgid "Login"
+msgstr "Login"
+
+#: templates/objectapp/password.html:4 templates/objectapp/password.html.py:7
+msgid "Password required"
+msgstr "Password richiesta"
+
+#: templates/objectapp/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "La password inserita non è valida. Per cortesia riprova."
+
+#: templates/objectapp/password.html:16
+msgid "You need to provide a password to view this gbobject."
+msgstr "Devi inserire una password per vedere questo articolo."
+
+#: templates/objectapp/password.html:23
+msgid "Password"
+msgstr "Password"
+
+#: templates/objectapp/password.html:28
+msgid "Valid"
+msgstr "Valida"
+
+#: templates/objectapp/sitemap.html:10
+msgid "Gbobjects per objecttypes"
+msgstr "Articoli nella categoria"
+
+#: templates/objectapp/sitemap.html:18 templates/objectapp/sitemap.html.py:38
+#: templates/objectapp/tags/popular_gbobjects.html:8
+msgid "comment"
+msgstr "commento"
+
+#: templates/objectapp/sitemap.html:31
+msgid "All the gbobjects"
+msgstr "Tutti gli articoli"
+
+#: templates/objectapp/sitemap.html:60 templates/objectapp/tags/objecttypes.html:11
+msgid "No objecttypes yet."
+msgstr "Nessuna categoria, al momento."
+
+#: templates/objectapp/skeleton.html:27 templates/objectapp/skeleton.html.py:39
+msgid "RSS Feed of latest gbobjects"
+msgstr "Feed RSS delgi ultimi articoli"
+
+#: templates/objectapp/tag_list.html:4 templates/objectapp/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Elenco dei tag"
+
+#: templates/objectapp/wlwmanifest.xml:40
+msgid "View site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:41
+msgid "Admin. site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:53
+msgid "Manage comments"
+msgstr ""
+
+#: templates/objectapp/tags/archives_gbobjects.html:12
+#: templates/objectapp/tags/archives_gbobjects_tree.html:38
+msgid "No archives yet."
+msgstr "Nessun archivio, al momento."
+
+#: templates/objectapp/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Nessun autore, al momento."
+
+#: templates/objectapp/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkback su"
+
+#: templates/objectapp/tags/similar_gbobjects.html:9
+msgid "No similar gbobjects."
+msgstr "Nono ci sono articoli correlati."
+
+#: tests/views.py:165 views/search.py:18
+msgid "The pattern is too short"
+msgstr "La sequenza di ricerca è troppo corta"
+
+#: tests/views.py:168 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Nessuna sequenza di ricerca trovata"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Username non corretta."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Password non valida."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Utenza non disponibile."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "L'utente non può %s."
+
+#: xmlrpc/pingback.py:93
+msgid "No title"
+msgstr "Nessun titolo"
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/nl/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/objectapp/locale/nl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..992d4ed
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/nl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/nl/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/objectapp/locale/nl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..8bbdce5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/nl/LC_MESSAGES/django.po
@@ -0,0 +1,1195 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Dries Desmet <dries@urga.be>, 2011.
+# go2people <admin@go2people.nl>, 2011.
+# Julien Fache <fantomas42@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-blog-objectapp\n"
+"Report-Msgid-Bugs-To: https://github.com/Fantomas42/django-blog-objectapp/issues\n"
+"POT-Creation-Date: 2011-04-12 13:21-0500\n"
+"PO-Revision-Date: 2011-09-01 06:46+0000\n"
+"Last-Translator: TrioTorus <dries@urga.be>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: feeds.py:102 plugins/cms_plugins.py:23
+#: templates/objectapp/gbobject_archive.html:4
+#: templates/objectapp/gbobject_archive.html:25 templates/objectapp/gbobject_list.html:19
+#: tests/feeds.py:115
+msgid "Latest gbobjects"
+msgstr "Nieuwste berichten"
+
+#: feeds.py:106 tests/feeds.py:117
+#, python-format
+msgid "The latest gbobjects for the site %s"
+msgstr "Het nieuwste bericht op de site %s"
+
+#: feeds.py:126 tests/feeds.py:126
+#, python-format
+msgid "Gbobjects for the Objecttype %s"
+msgstr "Berichten in de categorie %s"
+
+#: feeds.py:130 tests/feeds.py:128
+#, python-format
+msgid "The latest gbobjects for the Objecttype %s"
+msgstr "De nieuwste berichten in de Objecttype %s"
+
+#: feeds.py:150 tests/feeds.py:137
+#, python-format
+msgid "Gbobjects for author %s"
+msgstr "Berichten van auteur %s"
+
+#: feeds.py:154 tests/feeds.py:139
+#, python-format
+msgid "The latest gbobjects by %s"
+msgstr "De nieuwste berichten van %s"
+
+#: feeds.py:175 tests/feeds.py:149
+#, python-format
+msgid "Gbobjects for the tag %s"
+msgstr "Berichten voor het label %s"
+
+#: feeds.py:179 tests/feeds.py:151
+#, python-format
+msgid "The latest gbobjects for the tag %s"
+msgstr "De nieuwste berichten voor het label %s"
+
+#: feeds.py:199 tests/feeds.py:160
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr "zoekresultaten voor '%s'"
+
+#: feeds.py:203 tests/feeds.py:162
+#, python-format
+msgid "The gbobjects containing the pattern '%s'"
+msgstr "Berichten die het patroon '%s' bevatten"
+
+#: feeds.py:245 tests/feeds.py:178
+#, python-format
+msgid "Discussions on %s"
+msgstr "Discussies over %s"
+
+#: feeds.py:249 tests/feeds.py:180
+#, python-format
+msgid "The latest discussions for the gbobject %s"
+msgstr "De nieuwste discussies voor het bericht %s"
+
+#: feeds.py:267 tests/feeds.py:190
+#, python-format
+msgid "Comments on %s"
+msgstr "Commentaren op %s"
+
+#: feeds.py:271 tests/feeds.py:192
+#, python-format
+msgid "The latest comments for the gbobject %s"
+msgstr "De nieuwste commentaren op het bericht %s"
+
+#: feeds.py:301 tests/feeds.py:206
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks op %s"
+
+#: feeds.py:305 tests/feeds.py:208
+#, python-format
+msgid "The latest pingbacks for the gbobject %s"
+msgstr "De nieuwste pingbacks voor het bericht %s"
+
+#: feeds.py:323 tests/feeds.py:218
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks voor %s"
+
+#: feeds.py:327 tests/feeds.py:220
+#, python-format
+msgid "The latest trackbacks for the gbobject %s"
+msgstr "De nieuwste trackbacks voor het bericht %s"
+
+#: models.py:64 models.py:105 admin/gbobject.py:73
+msgid "title"
+msgstr "Titel"
+
+#: models.py:65 models.py:119
+msgid "used for publication"
+msgstr "gebruikt voor publicatie"
+
+#: models.py:67
+msgid "description"
+msgstr "omschrijving"
+
+#: models.py:70 admin/forms.py:18
+msgid "parent Objecttype"
+msgstr "bovenliggende categorie"
+
+#: models.py:95
+msgid "Objecttype"
+msgstr "categorie"
+
+#: models.py:96 models.py:114 admin/forms.py:47 plugins/models.py:24
+msgid "objecttypes"
+msgstr "categorieën"
+
+#: models.py:101
+msgid "draft"
+msgstr "concept"
+
+#: models.py:102
+msgid "hidden"
+msgstr "verborgen"
+
+#: models.py:103
+msgid "published"
+msgstr "gepubliceerd"
+
+#: models.py:107
+msgid "image"
+msgstr "afbeelding"
+
+#: models.py:108
+msgid "used for illustration"
+msgstr "gebruikt als illustratie"
+
+#: models.py:109
+msgid "content"
+msgstr "inhoud"
+
+#: models.py:110
+msgid "excerpt"
+msgstr "uittreksel"
+
+#: models.py:111
+msgid "optional element"
+msgstr "optioneel element"
+
+#: models.py:113 plugins/models.py:30
+msgid "tags"
+msgstr "labels"
+
+#: models.py:116
+msgid "related gbobjects"
+msgstr "gerelateerde berichten"
+
+#: models.py:123 plugins/models.py:28
+msgid "authors"
+msgstr "auteurs"
+
+#: models.py:126
+msgid "featured"
+msgstr "in de kijker"
+
+#: models.py:127 admin/gbobject.py:124
+msgid "comment enabled"
+msgstr "commentaar geactiveerd"
+
+#: models.py:128
+msgid "linkback enabled"
+msgstr "linkback geactiveerd"
+
+#: models.py:130
+msgid "creation date"
+msgstr "aanmaakdatum"
+
+#: models.py:131
+msgid "last update"
+msgstr "Letzte Änderung"
+
+#: models.py:132
+msgid "start publication"
+msgstr "begin publicatie"
+
+#: models.py:133
+msgid "date start publish"
+msgstr "publicatiedatum"
+
+#: models.py:135
+msgid "end publication"
+msgstr "eind publicatie"
+
+#: models.py:136
+msgid "date end publish"
+msgstr "einddatum publicatie"
+
+#: models.py:139
+msgid "sites publication"
+msgstr "publicatie op site"
+
+#: models.py:141
+msgid "login required"
+msgstr "inloggen vereist"
+
+#: models.py:142
+msgid "only authenticated users can view the gbobject"
+msgstr "alleen geauthenticeerde gebruikers kunnen dit bericht zien"
+
+#: models.py:143
+msgid "password"
+msgstr "wachtwoord"
+
+#: models.py:144
+msgid "protect the gbobject with a password"
+msgstr "beveilig het bericht met een wachtwoord"
+
+#: models.py:146 plugins/models.py:34 plugins/models.py:58
+#: plugins/models.py:80
+msgid "template"
+msgstr "template"
+
+#: models.py:149
+msgid "Default template"
+msgstr "Stardaard template"
+
+#: models.py:151
+msgid "template used to display the gbobject"
+msgstr "gebruikte template om het bericht te tonen"
+
+#: models.py:285
+msgid "gbobject"
+msgstr "bericht"
+
+#: models.py:286 plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:57
+#: templates/objectapp/base.html:40
+msgid "gbobjects"
+msgstr "berichten"
+
+#: moderator.py:45 moderator.py:72
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Nieuwe reactie op \"%(title)s\""
+
+#: admin/Objecttype.py:30
+msgid "tree path"
+msgstr "boomstructuur"
+
+#: admin/gbobject.py:27 plugins/admin.py:17
+#: templates/admin/objectapp/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Inhoud"
+
+#: admin/gbobject.py:29 plugins/admin.py:19
+msgid "Options"
+msgstr "Opties"
+
+#: admin/gbobject.py:34 plugins/admin.py:24
+msgid "Privacy"
+msgstr "Privacy"
+
+#: admin/gbobject.py:36 plugins/admin.py:26
+msgid "Discussion"
+msgstr "Discussie"
+
+#: admin/gbobject.py:38 plugins/admin.py:28
+msgid "Publication"
+msgstr "Publicatie"
+
+#: admin/gbobject.py:66
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i woorden)"
+
+#: admin/gbobject.py:70
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i reacties)"
+
+#: admin/gbobject.py:86
+msgid "author(s)"
+msgstr "auteur(s)"
+
+#: admin/gbobject.py:99
+msgid "Objecttype(s)"
+msgstr "Categorie(ën)"
+
+#: admin/gbobject.py:111
+msgid "tag(s)"
+msgstr "label(s)"
+
+#: admin/gbobject.py:118
+msgid "site(s)"
+msgstr "site(s)"
+
+#: admin/gbobject.py:130
+msgid "is actual"
+msgstr "is actueel"
+
+#: admin/gbobject.py:136
+msgid "is visible"
+msgstr "is zichtbaar"
+
+#: admin/gbobject.py:141
+msgid "View"
+msgstr "Bekijk"
+
+#: admin/gbobject.py:143
+msgid "View on site"
+msgstr "Op site bekijken"
+
+#: admin/gbobject.py:149 templates/objectapp/_gbobject_detail.html:64
+msgid "Unavailable"
+msgstr "Niet beschikbaar"
+
+#: admin/gbobject.py:153
+msgid "short url"
+msgstr "korte url"
+
+#: admin/gbobject.py:207
+msgid "The selected gbobjects now belong to you."
+msgstr "De geselecteerde berichten zijn aan u toegewezen."
+
+#: admin/gbobject.py:208
+msgid "Set the gbobjects to the user"
+msgstr "Wijs de berichten toe aan de gebruiker"
+
+#: admin/gbobject.py:214
+msgid "The selected gbobjects are now marked as published."
+msgstr "De geselecteerde berichten zijn gepubliceerd."
+
+#: admin/gbobject.py:215
+msgid "Set gbobjects selected as published"
+msgstr "Geselecteerde berichten markeren als gepubliceerd"
+
+#: admin/gbobject.py:220
+msgid "The selected gbobjects are now marked as hidden."
+msgstr "De geselecteerde berichten zijn verborgen."
+
+#: admin/gbobject.py:221
+msgid "Set gbobjects selected as hidden"
+msgstr "Geselecteerde berichten markeren als verborgen"
+
+#: admin/gbobject.py:234
+msgid "The selected gbobjects have been tweeted."
+msgstr "De geselecteerde berichten zijn getweet."
+
+#: admin/gbobject.py:235
+msgid "Tweet gbobjects selected"
+msgstr "Geselecteerde berichten tweeten"
+
+#: admin/gbobject.py:240
+msgid "Comments are now closed for selected gbobjects."
+msgstr "Reacties zijn niet meer mogelijk voor de geselecteerde berichten."
+
+#: admin/gbobject.py:241
+msgid "Close the comments for selected gbobjects"
+msgstr "Commentaren sluiten voor geselecteerde berichten"
+
+#: admin/gbobject.py:247
+msgid "Linkbacks are now closed for selected gbobjects."
+msgstr "Linkbacks zijn nu afgesloten voor de geselecteerde berichten."
+
+#: admin/gbobject.py:248
+msgid "Close the linkbacks for selected gbobjects"
+msgstr "Linkbacks sluiten voor geselecteerde berichten"
+
+#: admin/gbobject.py:254
+msgid "The selected gbobjects are now set at the current date."
+msgstr "De geselecteerde berichten zijn op de huidige datum ingesteld."
+
+#: admin/gbobject.py:255
+msgid "Put the selected gbobjects on top at the current date"
+msgstr "Plaats de geselecteerde berichten bovenaan voor de huidige datum"
+
+#: admin/gbobject.py:272
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d gbobjects."
+msgstr "%(directory)s map heeft succesvol %(success)d berichten gepingd."
+
+#: admin/gbobject.py:275
+msgid "Ping Directories for selected gbobjects"
+msgstr "Mappen pingen voor de geselecteerde berichten"
+
+#: admin/forms.py:20
+msgid "No parent Objecttype"
+msgstr "Geen bovenliggende categorie"
+
+#: admin/forms.py:35
+msgid "A Objecttype cannot be parent of itself."
+msgstr "Een categorie kan zichzelf niet bevatten"
+
+#: admin/forms.py:46 plugins/menu.py:70 templates/objectapp/base.html:22
+#: templates/objectapp/Objecttype_list.html:6 templates/objectapp/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:49
+msgid "Objecttypes"
+msgstr "Categorieën"
+
+#: plugins/cms_app.py:12
+msgid "Objectapp App Hook"
+msgstr "Objectapp App Hook"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Sortering"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Geavanceerd"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected gbobjects"
+msgstr "Geselecteerde berichten"
+
+#: plugins/cms_plugins.py:116 templates/objectapp/base.html:59
+msgid "Random gbobjects"
+msgstr "Willekeurige berichten"
+
+#: plugins/menu.py:19
+msgid "Objectapp Gbobject Menu"
+msgstr "Objectapp berigchtenmenu"
+
+#: plugins/menu.py:65
+msgid "Objectapp Objecttype Menu"
+msgstr "Objectapp categoriemenu"
+
+#: plugins/menu.py:82
+msgid "Objectapp Author Menu"
+msgstr "Objectapp auteursmenu"
+
+#: plugins/menu.py:87 templates/objectapp/author_list.html:6
+#: templates/objectapp/base.html:26 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "auteurs"
+
+#: plugins/menu.py:100
+msgid "Objectapp Tag Menu"
+msgstr "Objectapp labelmenu"
+
+#: plugins/menu.py:105 templates/admin/objectapp/widgets/quickpost.html:25
+#: templates/objectapp/_gbobject_detail.html:47 templates/objectapp/base.html:34
+#: templates/objectapp/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Labels"
+
+#: plugins/models.py:16
+msgid "Gbobject list (default)"
+msgstr "Berichtenlijst (standaard)"
+
+#: plugins/models.py:17
+msgid "Gbobject detailed"
+msgstr "Bericht detail"
+
+#: plugins/models.py:27
+msgid "include subobjecttypes"
+msgstr "met subcategorieën"
+
+#: plugins/models.py:33 plugins/models.py:79
+msgid "number of gbobjects"
+msgstr "aantal berichten"
+
+#: plugins/models.py:36 plugins/models.py:60 plugins/models.py:82
+msgid "Template used to display the plugin"
+msgstr "Gebruikt sjabloon voor de plugin"
+
+#: plugins/models.py:51 plugins/models.py:73 plugins/models.py:85
+#, python-format
+msgid "%s gbobjects"
+msgstr "%s berichten"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Fout 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Pagina niet gevonden"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Sorry, maar de opgevraagde pagina is niet gevonden"
+
+#: templates/404.html:15 templates/500.html:20
+msgid "Useful links"
+msgstr "Handige links"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:24
+#: templates/500.html.py:25
+msgid "Blog index"
+msgstr "Blog-index"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:29
+#: templates/500.html.py:30 templates/objectapp/sitemap.html:4
+#: templates/objectapp/sitemap.html.py:7 templates/objectapp/skeleton.html:36
+#: templates/objectapp/skeleton.html.py:37
+msgid "Sitemap"
+msgstr "Sitemap"
+
+#: templates/404.html:31 templates/500.html:36 templates/objectapp/base.html:47
+msgid "Recent gbobjects"
+msgstr "Nieuwste berichten"
+
+#: templates/404.html:36 templates/500.html:41 templates/objectapp/base.html:10
+msgid "Search"
+msgstr "Zoek"
+
+#: templates/404.html:40 templates/500.html:45 templates/objectapp/base.html:13
+msgid "Keywords..."
+msgstr "Zoektermen..."
+
+#: templates/500.html:10
+msgid "Error 500"
+msgstr "Fout 500"
+
+#: templates/500.html:13 templates/500.html.py:16
+msgid "Server error"
+msgstr "Server fout"
+
+#: templates/500.html:18
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"e-mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Er is een fout opgetreden. De site administrators zijn via e-mail op de "
+"hoogte gesteld, en het zou binnenkort opgelost moeten zijn. Bedankt voor uw "
+"geduld"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Inhoud"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:5
+#: templates/objectapp/_gbobject_detail.html:69
+msgid "Discussions"
+msgstr "Discussies"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:10
+#, python-format
+msgid "%(gbobjects)s gbobjects"
+msgstr "%(gbobjects)s berichten"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s reacties"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:22
+#, python-format
+msgid "%(objecttypes)s objecttypes"
+msgstr "%(objecttypes)s categorieën"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s pingbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s labels"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s trackbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s auteurs"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s afgewezen"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:7
+#: templates/objectapp/gbobject_detail.html:186
+#: templates/objectapp/gbobject_detail.html:187
+msgid "Edit the gbobject"
+msgstr "Wijzig bericht"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:10
+#: templates/comments/objectapp_gbobject_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/objectapp/_gbobject_detail.html:18
+#: templates/objectapp/gbobject_detail.html:91
+#: templates/objectapp/gbobject_detail.html:126
+#: templates/objectapp/gbobject_detail.html:157
+msgid "on"
+msgstr "op"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:16
+#: templates/comments/objectapp/gbobject/form.html:19
+msgid "Preview"
+msgstr "Voorbeeld"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:23
+msgid "No draft gbobjects."
+msgstr "Geen kladberichten"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:32
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:33
+msgid "View all draft gbobjects"
+msgstr "Bekijk alle kladberichten"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:11
+#: templates/objectapp/_gbobject_detail.html:24
+#: templates/objectapp/tags/recent_comments.html:7
+#: templates/objectapp/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "in"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:14
+#: templates/objectapp/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Commentaar op"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Wijzig de reactie"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:24
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Wijzig"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:31
+#: templates/objectapp/_gbobject_detail.html:77
+#: templates/objectapp/gbobject_detail.html:107
+#: templates/objectapp/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Nog geen commentaren"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:40
+#: templates/admin/objectapp/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Beheer commentaren"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "maak een linkback op"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "wijzig linkback"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:26
+#: templates/objectapp/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Nog geen linkbacks"
+
+#: templates/admin/objectapp/widgets/content_stats.html:6
+#: templates/admin/objectapp/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Vandaag"
+
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:6
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:7
+msgid "Draft gbobjects"
+msgstr "Kladberichten"
+
+#: templates/admin/objectapp/widgets/quickpost.html:5
+#: templates/admin/objectapp/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Snel publiceren"
+
+#: templates/admin/objectapp/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Titel"
+
+#: templates/admin/objectapp/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Bewaar als klad"
+
+#: templates/admin/objectapp/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Reset"
+
+#: templates/admin/objectapp/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Publiceer"
+
+#: templates/admin/objectapp/widgets/recent_comments.html:6
+#: templates/admin/objectapp/widgets/recent_comments.html:7
+#: templates/objectapp/base.html:51
+msgid "Recent comments"
+msgstr "Nieuwste commentaren"
+
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:6
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:7
+#: templates/objectapp/base.html:55
+msgid "Recent linkbacks"
+msgstr "Recente linkbacks"
+
+#: templates/comments/comment_notification_email.txt:1
+#: templates/comments/comment_reply_email.txt:1
+#: templates/objectapp/gbobject_list.html:19
+msgid "Author"
+msgstr "Auteur"
+
+#: templates/comments/comment_notification_email.txt:2
+msgid "Email"
+msgstr "Email"
+
+#: templates/comments/comment_notification_email.txt:3
+msgid "IP"
+msgstr "IP"
+
+#: templates/comments/comment_notification_email.txt:5
+#: templates/comments/comment_reply_email.txt:3
+msgid "Comment"
+msgstr "Reactie"
+
+#: templates/comments/comment_notification_email.txt:8
+#: templates/comments/comment_reply_email.txt:6
+msgid "View this comment"
+msgstr "Bekijk deze reactie"
+
+#: templates/comments/comment_notification_email.txt:10
+msgid "Flag this comment"
+msgstr "Markeer deze reactie"
+
+#: templates/comments/comment_notification_email.txt:12
+msgid "Delete this comment"
+msgstr "Verwijder deze reactie"
+
+#: templates/comments/comment_notification_email.txt:14
+msgid "Approve this comment"
+msgstr "Keur deze reactie goed"
+
+#: templates/comments/objectapp_gbobject_preview.html:4
+msgid "Comment preview"
+msgstr "Commentaarvoorbeeld"
+
+#: templates/comments/objectapp_gbobject_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Verbeter de volgende fout."
+msgstr[1] "Verbeter de volgende fouten."
+
+#: templates/comments/objectapp_gbobject_preview.html:12
+msgid "Preview of the comment"
+msgstr "Commentaarvoorbeeld"
+
+#: templates/comments/objectapp/gbobject/form.html:7
+msgid "Post your comment"
+msgstr "Verzend uw bericht"
+
+#: templates/comments/objectapp/gbobject/form.html:18
+msgid "Post"
+msgstr "Verzend"
+
+#: templates/comments/objectapp/gbobject/posted.html:4
+#: templates/comments/objectapp/gbobject/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Bedankt voor uw reactie"
+
+#: templates/comments/objectapp/gbobject/posted.html:9
+#: templates/comments/objectapp/gbobject/posted.html:10
+msgid "Return to gbobject list"
+msgstr "Terug naar de berichtenlijst"
+
+#: templates/objectapp/_gbobject_detail.html:11
+msgid "Written by"
+msgstr "Geschreven door"
+
+#: templates/objectapp/_gbobject_detail.html:15
+#, python-format
+msgid "Show %(author)s gbobjects"
+msgstr "Toon berichten van %(author)s"
+
+#: templates/objectapp/_gbobject_detail.html:20
+msgid "Written on"
+msgstr "Gepost op"
+
+#: templates/objectapp/_gbobject_detail.html:53
+msgid "No tags"
+msgstr "Geen labels"
+
+#: templates/objectapp/_gbobject_detail.html:58
+msgid "Short url"
+msgstr "Korte URL"
+
+#: templates/objectapp/_gbobject_detail.html:73
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s reactie"
+msgstr[1] "%(comment_count)s reacties"
+
+#: templates/objectapp/_gbobject_detail.html:79
+msgid "Be first to comment!"
+msgstr "Schrijf als eerste een reactie!"
+
+#: templates/objectapp/_gbobject_detail.html:82
+#: templates/objectapp/gbobject_detail.html:103
+#: templates/objectapp/gbobject_detail.html:109
+msgid "Comments are closed."
+msgstr "Reageren niet mogelijk."
+
+#: templates/objectapp/_gbobject_detail.html:89
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingback"
+msgstr[1] "%(pingback_count)s pingbacks"
+
+#: templates/objectapp/_gbobject_detail.html:96
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackback"
+msgstr[1] "%(trackback_count)s trackbacks"
+
+#: templates/objectapp/author_list.html:4 templates/objectapp/author_list.html:9
+msgid "Author list"
+msgstr "Auteurslijst"
+
+#: templates/objectapp/author_list.html:18 templates/objectapp/Objecttype_list.html:14
+#: templates/objectapp/sitemap.html:55 templates/objectapp/tag_list.html:16
+#: templates/objectapp/tags/authors.html:8
+#: templates/objectapp/tags/objecttypes.html:6
+#, python-format
+msgid "%(gbobject_count)s gbobject"
+msgid_plural "%(gbobject_count)s gbobjects"
+msgstr[0] "%(gbobject_count)s bericht"
+msgstr[1] "%(gbobject_count)s berichten"
+
+#: templates/objectapp/base.html:15
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for"
+" complex searchs."
+msgstr ""
+"Gebruik - om woorden of zinnen uit te sluiten, ' of \" voor exacte woorden "
+"en AND of OR gecombineerd met () voor complexe zoekopdrachten."
+
+#: templates/objectapp/base.html:30
+msgid "Calendar"
+msgstr "Kalender"
+
+#: templates/objectapp/base.html:63
+msgid "Popular gbobjects"
+msgstr "Populaire berichten"
+
+#: templates/objectapp/base.html:67 templates/objectapp/gbobject_archive_day.html:4
+#: templates/objectapp/gbobject_archive_day.html:6
+#: templates/objectapp/gbobject_archive_day.html:9
+#: templates/objectapp/gbobject_archive_month.html:4
+#: templates/objectapp/gbobject_archive_month.html:6
+#: templates/objectapp/gbobject_archive_month.html:9
+#: templates/objectapp/gbobject_archive_year.html:4
+#: templates/objectapp/gbobject_archive_year.html:6
+#: templates/objectapp/gbobject_archive_year.html:9
+#: templates/objectapp/tags/archives_gbobjects.html:5
+#: templates/objectapp/tags/archives_gbobjects_link.html:2
+#: templates/objectapp/tags/archives_gbobjects_tree.html:7
+#: templates/objectapp/tags/archives_gbobjects_tree.html:14
+#: templates/objectapp/tags/archives_gbobjects_tree.html:24
+msgid "Archives"
+msgstr "Archief"
+
+#: templates/objectapp/base.html:72
+msgid "Tools"
+msgstr "Hulpmiddelen"
+
+#: templates/objectapp/base.html:76 templates/objectapp/base.html.py:77
+msgid "Dashboard"
+msgstr "Dashboard"
+
+#: templates/objectapp/base.html:83 templates/objectapp/base.html.py:84
+msgid "Post an gbobject"
+msgstr "Plaats een bericht"
+
+#: templates/objectapp/base.html:91 templates/objectapp/base.html.py:92
+msgid "Log out"
+msgstr "Log uit"
+
+#: templates/objectapp/Objecttype_list.html:4 templates/objectapp/Objecttype_list.html:9
+msgid "Objecttype list"
+msgstr "Categorieënlijst"
+
+#: templates/objectapp/gbobject_archive_month.html:13
+msgid "Daily archives"
+msgstr "dagarchieven"
+
+#: templates/objectapp/gbobject_archive_year.html:13
+#: templates/objectapp/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Maandelijkse archieven"
+
+#: templates/objectapp/gbobject_detail.html:10
+msgid "RSS Feed of discussions on"
+msgstr "RSS-Feed van discussies voor"
+
+#: templates/objectapp/gbobject_detail.html:11
+msgid "RSS Feed of comments on"
+msgstr "RSS-Feed van commentaren voor"
+
+#: templates/objectapp/gbobject_detail.html:12
+msgid "RSS Feed of pingbacks on"
+msgstr "RSS-Feed van pingbacks voor"
+
+#: templates/objectapp/gbobject_detail.html:13
+msgid "RSS Feed of trackbacks on"
+msgstr "RSS-Feed van trackbacks voor"
+
+#: templates/objectapp/gbobject_detail.html:29
+msgid "Next gbobject"
+msgstr "Volgend bericht"
+
+#: templates/objectapp/gbobject_detail.html:43
+msgid "Previous gbobject"
+msgstr "Vorig bericht"
+
+#: templates/objectapp/gbobject_detail.html:56
+msgid "Related gbobjects"
+msgstr "Gerelateerde berichten"
+
+#: templates/objectapp/gbobject_detail.html:67
+msgid "Similar gbobjects"
+msgstr "Vergelijkbare berichten"
+
+#: templates/objectapp/gbobject_detail.html:75
+msgid "Comments"
+msgstr "Reacties"
+
+#: templates/objectapp/gbobject_detail.html:117
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/objectapp/gbobject_detail.html:139
+msgid "Pingbacks are open."
+msgstr "Pingbacks beschikbaar."
+
+#: templates/objectapp/gbobject_detail.html:141
+msgid "Pingbacks are closed."
+msgstr "Pingbacks niet beschikbaar."
+
+#: templates/objectapp/gbobject_detail.html:148
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/objectapp/gbobject_detail.html:170
+msgid "Trackback URL"
+msgstr "Trackback URL"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "Latest gbobjects for"
+msgstr "Laatste berichten van"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the Objecttype"
+msgstr "de categorie"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the tag"
+msgstr "het label"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the author"
+msgstr "de auteur"
+
+#: templates/objectapp/gbobject_list.html:4 templates/objectapp/gbobject_search.html:6
+msgid "page"
+msgstr "pagina"
+
+#: templates/objectapp/gbobject_list.html:9 templates/objectapp/gbobject_list.html:12
+#: templates/objectapp/gbobject_list.html:15 templates/objectapp/skeleton.html:40
+msgid "RSS Feed"
+msgstr "RSS-Feed"
+
+#: templates/objectapp/gbobject_list.html:19
+msgid "Objecttype"
+msgstr "Categorie"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_list.html:30
+msgid "Tag"
+msgstr "Label"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_search.html:4
+msgid "Page"
+msgstr "Pagina"
+
+#: templates/objectapp/gbobject_list.html:34
+#, python-format
+msgid "Gbobjects by %(author)s"
+msgstr "Berichten van %(author)s"
+
+#: templates/objectapp/gbobject_list.html:45 templates/objectapp/sitemap.html:23
+#: templates/objectapp/sitemap.html.py:43
+#: templates/objectapp/cms/gbobject_detail.html:12
+#: templates/objectapp/cms/gbobject_list.html:9
+#: templates/objectapp/tags/featured_gbobjects.html:9
+#: templates/objectapp/tags/popular_gbobjects.html:13
+#: templates/objectapp/tags/random_gbobjects.html:9
+#: templates/objectapp/tags/recent_gbobjects.html:9
+msgid "No gbobjects yet."
+msgstr "Nog geen berichten."
+
+#: templates/objectapp/gbobject_list.html:51 templates/objectapp/gbobject_search.html:40
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Pagina %(current_page)s van %(total_page)s"
+
+#: templates/objectapp/gbobject_list.html:56 templates/objectapp/gbobject_search.html:45
+msgid "More recent gbobjects"
+msgstr "Meer nieuwste berichten"
+
+#: templates/objectapp/gbobject_list.html:65 templates/objectapp/gbobject_search.html:54
+msgid "Gbobjects page"
+msgstr "Berichtenpagina"
+
+#: templates/objectapp/gbobject_list.html:72 templates/objectapp/gbobject_search.html:61
+msgid "More old gbobjects"
+msgstr "Meer oude berichten"
+
+#: templates/objectapp/gbobject_list.html:82 templates/objectapp/gbobject_list.html:83
+msgid "Edit the Objecttype"
+msgstr "Wijzig de categorie"
+
+#: templates/objectapp/gbobject_list.html:89 templates/objectapp/gbobject_list.html:90
+msgid "Edit the tag"
+msgstr "Wijzig het label"
+
+#: templates/objectapp/gbobject_list.html:96 templates/objectapp/gbobject_list.html:97
+msgid "Edit the author"
+msgstr "Wijzig de auteur"
+
+#: templates/objectapp/gbobject_search.html:4 templates/objectapp/gbobject_search.html:6
+#: templates/objectapp/gbobject_search.html:14
+msgid "Search results for"
+msgstr "zoekresultaten voor"
+
+#: templates/objectapp/gbobject_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "RSS-Feed met zoekresultaten van"
+
+#: templates/objectapp/gbobject_search.html:22
+#, python-format
+msgid "%(gbobject_count)s gbobject found"
+msgid_plural "%(gbobject_count)s gbobjects found"
+msgstr[0] "%(gbobject_count)s bericht gevonden"
+msgstr[1] "%(gbobject_count)s berichten gevonden"
+
+#: templates/objectapp/gbobject_search.html:34
+msgid "Nothing found."
+msgstr "Niks gevonden."
+
+#: templates/objectapp/login.html:4 templates/objectapp/login.html.py:7
+msgid "Login required"
+msgstr "Login verplicht"
+
+#: templates/objectapp/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr "Uw gebruikersnaam of wachtwoord is niet correct. Probeer opnieuw."
+
+#: templates/objectapp/login.html:16
+msgid "You need to be connected to view this gbobject."
+msgstr "U moet verbonden zijn om dit bericht te kunnen zien"
+
+#: templates/objectapp/login.html:33
+msgid "Login"
+msgstr "Inloggen"
+
+#: templates/objectapp/password.html:4 templates/objectapp/password.html.py:7
+msgid "Password required"
+msgstr "Wachtwoord vereist"
+
+#: templates/objectapp/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "Het opgegeven wachtwoord is niet geldig. Probeer opnieuw."
+
+#: templates/objectapp/password.html:16
+msgid "You need to provide a password to view this gbobject."
+msgstr "U moet een wachtwoord opgeven om dit bericht te kunnen zien"
+
+#: templates/objectapp/password.html:23
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: templates/objectapp/password.html:28
+msgid "Valid"
+msgstr "Geldig"
+
+#: templates/objectapp/sitemap.html:10
+msgid "Gbobjects per objecttypes"
+msgstr "Berichten per categorieën"
+
+#: templates/objectapp/sitemap.html:18 templates/objectapp/sitemap.html.py:38
+#: templates/objectapp/tags/popular_gbobjects.html:8
+msgid "comment"
+msgstr "reactie"
+
+#: templates/objectapp/sitemap.html:31
+msgid "All the gbobjects"
+msgstr "Alle berichten"
+
+#: templates/objectapp/sitemap.html:60 templates/objectapp/tags/objecttypes.html:11
+msgid "No objecttypes yet."
+msgstr "Nog geen categorieën"
+
+#: templates/objectapp/skeleton.html:27 templates/objectapp/skeleton.html.py:39
+msgid "RSS Feed of latest gbobjects"
+msgstr "RSS-Feed van de nieuwste berichten"
+
+#: templates/objectapp/tag_list.html:4 templates/objectapp/tag_list.html.py:9
+msgid "Tag list"
+msgstr "labellijst"
+
+#: templates/objectapp/wlwmanifest.xml:40
+msgid "View site"
+msgstr "Bekijk site"
+
+#: templates/objectapp/wlwmanifest.xml:41
+msgid "Admin. site"
+msgstr "Beheer site"
+
+#: templates/objectapp/wlwmanifest.xml:53
+msgid "Manage comments"
+msgstr "Reacties beheren"
+
+#: templates/objectapp/tags/archives_gbobjects.html:12
+#: templates/objectapp/tags/archives_gbobjects_tree.html:38
+msgid "No archives yet."
+msgstr "Nog geen archieven"
+
+#: templates/objectapp/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Nog geen autheurs"
+
+#: templates/objectapp/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkback voor"
+
+#: templates/objectapp/tags/similar_gbobjects.html:9
+msgid "No similar gbobjects."
+msgstr "Geen vergelijkbare berichten."
+
+#: tests/views.py:165 views/search.py:18
+msgid "The pattern is too short"
+msgstr "De zoekterm is te kort"
+
+#: tests/views.py:168 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Geen zoekterm gevonden"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Gebruikersnaam is incorrect"
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Wachtwoord is ongeldig"
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Gebruiker is niet beschikbaar"
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "Gebruiker kan niet %s."
+
+#: xmlrpc/pingback.py:93
+msgid "No title"
+msgstr "Geen titel"
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/pl/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/objectapp/locale/pl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..99c231c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/pl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/pl/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/objectapp/locale/pl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..dff1690
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/pl/LC_MESSAGES/django.po
@@ -0,0 +1,1194 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# vvarp <vvarpp@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-blog-objectapp\n"
+"Report-Msgid-Bugs-To: https://github.com/Fantomas42/django-blog-objectapp/issues\n"
+"POT-Creation-Date: 2011-04-12 13:21-0500\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pl\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
+
+#: feeds.py:102 plugins/cms_plugins.py:23
+#: templates/objectapp/gbobject_archive.html:4
+#: templates/objectapp/gbobject_archive.html:25 templates/objectapp/gbobject_list.html:19
+#: tests/feeds.py:115
+msgid "Latest gbobjects"
+msgstr "Ostatnie wpisy"
+
+#: feeds.py:106 tests/feeds.py:117
+#, python-format
+msgid "The latest gbobjects for the site %s"
+msgstr "Najnowsze wpisy na stronie %s"
+
+#: feeds.py:126 tests/feeds.py:126
+#, python-format
+msgid "Gbobjects for the Objecttype %s"
+msgstr "Wpisy dla kategorii %s"
+
+#: feeds.py:130 tests/feeds.py:128
+#, python-format
+msgid "The latest gbobjects for the Objecttype %s"
+msgstr ""
+
+#: feeds.py:150 tests/feeds.py:137
+#, python-format
+msgid "Gbobjects for author %s"
+msgstr ""
+
+#: feeds.py:154 tests/feeds.py:139
+#, python-format
+msgid "The latest gbobjects by %s"
+msgstr ""
+
+#: feeds.py:175 tests/feeds.py:149
+#, python-format
+msgid "Gbobjects for the tag %s"
+msgstr ""
+
+#: feeds.py:179 tests/feeds.py:151
+#, python-format
+msgid "The latest gbobjects for the tag %s"
+msgstr ""
+
+#: feeds.py:199 tests/feeds.py:160
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:162
+#, python-format
+msgid "The gbobjects containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:245 tests/feeds.py:178
+#, python-format
+msgid "Discussions on %s"
+msgstr ""
+
+#: feeds.py:249 tests/feeds.py:180
+#, python-format
+msgid "The latest discussions for the gbobject %s"
+msgstr ""
+
+#: feeds.py:267 tests/feeds.py:190
+#, python-format
+msgid "Comments on %s"
+msgstr "Komentarze do %s"
+
+#: feeds.py:271 tests/feeds.py:192
+#, python-format
+msgid "The latest comments for the gbobject %s"
+msgstr ""
+
+#: feeds.py:301 tests/feeds.py:206
+#, python-format
+msgid "Pingbacks on %s"
+msgstr ""
+
+#: feeds.py:305 tests/feeds.py:208
+#, python-format
+msgid "The latest pingbacks for the gbobject %s"
+msgstr ""
+
+#: feeds.py:323 tests/feeds.py:218
+#, python-format
+msgid "Trackbacks on %s"
+msgstr ""
+
+#: feeds.py:327 tests/feeds.py:220
+#, python-format
+msgid "The latest trackbacks for the gbobject %s"
+msgstr ""
+
+#: models.py:64 models.py:105 admin/gbobject.py:73
+msgid "title"
+msgstr "tytuł"
+
+#: models.py:65 models.py:119
+msgid "used for publication"
+msgstr ""
+
+#: models.py:67
+msgid "description"
+msgstr "opis"
+
+#: models.py:70 admin/forms.py:18
+msgid "parent Objecttype"
+msgstr "kategoria nadrzędna"
+
+#: models.py:95
+msgid "Objecttype"
+msgstr "kategoria"
+
+#: models.py:96 models.py:114 admin/forms.py:47 plugins/models.py:24
+msgid "objecttypes"
+msgstr "kategorie"
+
+#: models.py:101
+msgid "draft"
+msgstr "szkic"
+
+#: models.py:102
+msgid "hidden"
+msgstr "ukryty"
+
+#: models.py:103
+msgid "published"
+msgstr "opublikowany"
+
+#: models.py:107
+msgid "image"
+msgstr ""
+
+#: models.py:108
+msgid "used for illustration"
+msgstr ""
+
+#: models.py:109
+msgid "content"
+msgstr ""
+
+#: models.py:110
+msgid "excerpt"
+msgstr ""
+
+#: models.py:111
+msgid "optional element"
+msgstr ""
+
+#: models.py:113 plugins/models.py:30
+msgid "tags"
+msgstr ""
+
+#: models.py:116
+msgid "related gbobjects"
+msgstr ""
+
+#: models.py:123 plugins/models.py:28
+msgid "authors"
+msgstr ""
+
+#: models.py:126
+msgid "featured"
+msgstr ""
+
+#: models.py:127 admin/gbobject.py:124
+msgid "comment enabled"
+msgstr ""
+
+#: models.py:128
+msgid "linkback enabled"
+msgstr ""
+
+#: models.py:130
+msgid "creation date"
+msgstr ""
+
+#: models.py:131
+msgid "last update"
+msgstr ""
+
+#: models.py:132
+msgid "start publication"
+msgstr ""
+
+#: models.py:133
+msgid "date start publish"
+msgstr ""
+
+#: models.py:135
+msgid "end publication"
+msgstr ""
+
+#: models.py:136
+msgid "date end publish"
+msgstr ""
+
+#: models.py:139
+msgid "sites publication"
+msgstr ""
+
+#: models.py:141
+msgid "login required"
+msgstr ""
+
+#: models.py:142
+msgid "only authenticated users can view the gbobject"
+msgstr ""
+
+#: models.py:143
+msgid "password"
+msgstr ""
+
+#: models.py:144
+msgid "protect the gbobject with a password"
+msgstr ""
+
+#: models.py:146 plugins/models.py:34 plugins/models.py:58
+#: plugins/models.py:80
+msgid "template"
+msgstr ""
+
+#: models.py:149
+msgid "Default template"
+msgstr ""
+
+#: models.py:151
+msgid "template used to display the gbobject"
+msgstr ""
+
+#: models.py:285
+msgid "gbobject"
+msgstr ""
+
+#: models.py:286 plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:57
+#: templates/objectapp/base.html:40
+msgid "gbobjects"
+msgstr ""
+
+#: moderator.py:45 moderator.py:72
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr ""
+
+#: admin/Objecttype.py:30
+msgid "tree path"
+msgstr ""
+
+#: admin/gbobject.py:27 plugins/admin.py:17
+#: templates/admin/objectapp/widgets/quickpost.html:17
+msgid "Content"
+msgstr ""
+
+#: admin/gbobject.py:29 plugins/admin.py:19
+msgid "Options"
+msgstr ""
+
+#: admin/gbobject.py:34 plugins/admin.py:24
+msgid "Privacy"
+msgstr ""
+
+#: admin/gbobject.py:36 plugins/admin.py:26
+msgid "Discussion"
+msgstr ""
+
+#: admin/gbobject.py:38 plugins/admin.py:28
+msgid "Publication"
+msgstr ""
+
+#: admin/gbobject.py:66
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr ""
+
+#: admin/gbobject.py:70
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr ""
+
+#: admin/gbobject.py:86
+msgid "author(s)"
+msgstr ""
+
+#: admin/gbobject.py:99
+msgid "Objecttype(s)"
+msgstr ""
+
+#: admin/gbobject.py:111
+msgid "tag(s)"
+msgstr ""
+
+#: admin/gbobject.py:118
+msgid "site(s)"
+msgstr ""
+
+#: admin/gbobject.py:130
+msgid "is actual"
+msgstr ""
+
+#: admin/gbobject.py:136
+msgid "is visible"
+msgstr ""
+
+#: admin/gbobject.py:141
+msgid "View"
+msgstr ""
+
+#: admin/gbobject.py:143
+msgid "View on site"
+msgstr ""
+
+#: admin/gbobject.py:149 templates/objectapp/_gbobject_detail.html:64
+msgid "Unavailable"
+msgstr ""
+
+#: admin/gbobject.py:153
+msgid "short url"
+msgstr ""
+
+#: admin/gbobject.py:207
+msgid "The selected gbobjects now belong to you."
+msgstr ""
+
+#: admin/gbobject.py:208
+msgid "Set the gbobjects to the user"
+msgstr ""
+
+#: admin/gbobject.py:214
+msgid "The selected gbobjects are now marked as published."
+msgstr ""
+
+#: admin/gbobject.py:215
+msgid "Set gbobjects selected as published"
+msgstr ""
+
+#: admin/gbobject.py:220
+msgid "The selected gbobjects are now marked as hidden."
+msgstr ""
+
+#: admin/gbobject.py:221
+msgid "Set gbobjects selected as hidden"
+msgstr ""
+
+#: admin/gbobject.py:234
+msgid "The selected gbobjects have been tweeted."
+msgstr ""
+
+#: admin/gbobject.py:235
+msgid "Tweet gbobjects selected"
+msgstr ""
+
+#: admin/gbobject.py:240
+msgid "Comments are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:241
+msgid "Close the comments for selected gbobjects"
+msgstr ""
+
+#: admin/gbobject.py:247
+msgid "Linkbacks are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:248
+msgid "Close the linkbacks for selected gbobjects"
+msgstr ""
+
+#: admin/gbobject.py:254
+msgid "The selected gbobjects are now set at the current date."
+msgstr ""
+
+#: admin/gbobject.py:255
+msgid "Put the selected gbobjects on top at the current date"
+msgstr ""
+
+#: admin/gbobject.py:272
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:275
+msgid "Ping Directories for selected gbobjects"
+msgstr ""
+
+#: admin/forms.py:20
+msgid "No parent Objecttype"
+msgstr ""
+
+#: admin/forms.py:35
+msgid "A Objecttype cannot be parent of itself."
+msgstr ""
+
+#: admin/forms.py:46 plugins/menu.py:70 templates/objectapp/base.html:22
+#: templates/objectapp/Objecttype_list.html:6 templates/objectapp/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:49
+msgid "Objecttypes"
+msgstr ""
+
+#: plugins/cms_app.py:12
+msgid "Objectapp App Hook"
+msgstr ""
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr ""
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr ""
+
+#: plugins/cms_plugins.py:94
+msgid "Selected gbobjects"
+msgstr ""
+
+#: plugins/cms_plugins.py:116 templates/objectapp/base.html:59
+msgid "Random gbobjects"
+msgstr ""
+
+#: plugins/menu.py:19
+msgid "Objectapp Gbobject Menu"
+msgstr ""
+
+#: plugins/menu.py:65
+msgid "Objectapp Objecttype Menu"
+msgstr ""
+
+#: plugins/menu.py:82
+msgid "Objectapp Author Menu"
+msgstr ""
+
+#: plugins/menu.py:87 templates/objectapp/author_list.html:6
+#: templates/objectapp/base.html:26 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr ""
+
+#: plugins/menu.py:100
+msgid "Objectapp Tag Menu"
+msgstr ""
+
+#: plugins/menu.py:105 templates/admin/objectapp/widgets/quickpost.html:25
+#: templates/objectapp/_gbobject_detail.html:47 templates/objectapp/base.html:34
+#: templates/objectapp/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr ""
+
+#: plugins/models.py:16
+msgid "Gbobject list (default)"
+msgstr ""
+
+#: plugins/models.py:17
+msgid "Gbobject detailed"
+msgstr ""
+
+#: plugins/models.py:27
+msgid "include subobjecttypes"
+msgstr ""
+
+#: plugins/models.py:33 plugins/models.py:79
+msgid "number of gbobjects"
+msgstr ""
+
+#: plugins/models.py:36 plugins/models.py:60 plugins/models.py:82
+msgid "Template used to display the plugin"
+msgstr ""
+
+#: plugins/models.py:51 plugins/models.py:73 plugins/models.py:85
+#, python-format
+msgid "%s gbobjects"
+msgstr ""
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr ""
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr ""
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+
+#: templates/404.html:15 templates/500.html:20
+msgid "Useful links"
+msgstr ""
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:24
+#: templates/500.html.py:25
+msgid "Blog index"
+msgstr ""
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:29
+#: templates/500.html.py:30 templates/objectapp/sitemap.html:4
+#: templates/objectapp/sitemap.html.py:7 templates/objectapp/skeleton.html:36
+#: templates/objectapp/skeleton.html.py:37
+msgid "Sitemap"
+msgstr ""
+
+#: templates/404.html:31 templates/500.html:36 templates/objectapp/base.html:47
+msgid "Recent gbobjects"
+msgstr ""
+
+#: templates/404.html:36 templates/500.html:41 templates/objectapp/base.html:10
+msgid "Search"
+msgstr ""
+
+#: templates/404.html:40 templates/500.html:45 templates/objectapp/base.html:13
+msgid "Keywords..."
+msgstr ""
+
+#: templates/500.html:10
+msgid "Error 500"
+msgstr ""
+
+#: templates/500.html:13 templates/500.html.py:16
+msgid "Server error"
+msgstr ""
+
+#: templates/500.html:18
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"e-mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:5
+#: templates/objectapp/_gbobject_detail.html:69
+msgid "Discussions"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:10
+#, python-format
+msgid "%(gbobjects)s gbobjects"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:22
+#, python-format
+msgid "%(objecttypes)s objecttypes"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:7
+#: templates/objectapp/gbobject_detail.html:186
+#: templates/objectapp/gbobject_detail.html:187
+msgid "Edit the gbobject"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:10
+#: templates/comments/objectapp_gbobject_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/objectapp/_gbobject_detail.html:18
+#: templates/objectapp/gbobject_detail.html:91
+#: templates/objectapp/gbobject_detail.html:126
+#: templates/objectapp/gbobject_detail.html:157
+msgid "on"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:16
+#: templates/comments/objectapp/gbobject/form.html:19
+msgid "Preview"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:23
+msgid "No draft gbobjects."
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:32
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:33
+msgid "View all draft gbobjects"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:11
+#: templates/objectapp/_gbobject_detail.html:24
+#: templates/objectapp/tags/recent_comments.html:7
+#: templates/objectapp/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:14
+#: templates/objectapp/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:24
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:31
+#: templates/objectapp/_gbobject_detail.html:77
+#: templates/objectapp/gbobject_detail.html:107
+#: templates/objectapp/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:40
+#: templates/admin/objectapp/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:26
+#: templates/objectapp/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr ""
+
+#: templates/admin/objectapp/widgets/content_stats.html:6
+#: templates/admin/objectapp/widgets/content_stats.html:7
+msgid "Today"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:6
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:7
+msgid "Draft gbobjects"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/quickpost.html:5
+#: templates/admin/objectapp/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/quickpost.html:9
+msgid "Title"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/quickpost.html:35
+msgid "Publish"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/recent_comments.html:6
+#: templates/admin/objectapp/widgets/recent_comments.html:7
+#: templates/objectapp/base.html:51
+msgid "Recent comments"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:6
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:7
+#: templates/objectapp/base.html:55
+msgid "Recent linkbacks"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:1
+#: templates/comments/comment_reply_email.txt:1
+#: templates/objectapp/gbobject_list.html:19
+msgid "Author"
+msgstr "Autor"
+
+#: templates/comments/comment_notification_email.txt:2
+msgid "Email"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:3
+msgid "IP"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:5
+#: templates/comments/comment_reply_email.txt:3
+msgid "Comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:8
+#: templates/comments/comment_reply_email.txt:6
+msgid "View this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:10
+msgid "Flag this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:12
+msgid "Delete this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:14
+msgid "Approve this comment"
+msgstr ""
+
+#: templates/comments/objectapp_gbobject_preview.html:4
+msgid "Comment preview"
+msgstr ""
+
+#: templates/comments/objectapp_gbobject_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/comments/objectapp_gbobject_preview.html:12
+msgid "Preview of the comment"
+msgstr ""
+
+#: templates/comments/objectapp/gbobject/form.html:7
+msgid "Post your comment"
+msgstr ""
+
+#: templates/comments/objectapp/gbobject/form.html:18
+msgid "Post"
+msgstr ""
+
+#: templates/comments/objectapp/gbobject/posted.html:4
+#: templates/comments/objectapp/gbobject/posted.html:7
+msgid "Thanks for your comment"
+msgstr ""
+
+#: templates/comments/objectapp/gbobject/posted.html:9
+#: templates/comments/objectapp/gbobject/posted.html:10
+msgid "Return to gbobject list"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:11
+msgid "Written by"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:15
+#, python-format
+msgid "Show %(author)s gbobjects"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:20
+msgid "Written on"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:53
+msgid "No tags"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:58
+msgid "Short url"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:73
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/objectapp/_gbobject_detail.html:79
+msgid "Be first to comment!"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:82
+#: templates/objectapp/gbobject_detail.html:103
+#: templates/objectapp/gbobject_detail.html:109
+msgid "Comments are closed."
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:89
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/objectapp/_gbobject_detail.html:96
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/objectapp/author_list.html:4 templates/objectapp/author_list.html:9
+msgid "Author list"
+msgstr ""
+
+#: templates/objectapp/author_list.html:18 templates/objectapp/Objecttype_list.html:14
+#: templates/objectapp/sitemap.html:55 templates/objectapp/tag_list.html:16
+#: templates/objectapp/tags/authors.html:8
+#: templates/objectapp/tags/objecttypes.html:6
+#, python-format
+msgid "%(gbobject_count)s gbobject"
+msgid_plural "%(gbobject_count)s gbobjects"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/objectapp/base.html:15
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for"
+" complex searchs."
+msgstr ""
+
+#: templates/objectapp/base.html:30
+msgid "Calendar"
+msgstr ""
+
+#: templates/objectapp/base.html:63
+msgid "Popular gbobjects"
+msgstr ""
+
+#: templates/objectapp/base.html:67 templates/objectapp/gbobject_archive_day.html:4
+#: templates/objectapp/gbobject_archive_day.html:6
+#: templates/objectapp/gbobject_archive_day.html:9
+#: templates/objectapp/gbobject_archive_month.html:4
+#: templates/objectapp/gbobject_archive_month.html:6
+#: templates/objectapp/gbobject_archive_month.html:9
+#: templates/objectapp/gbobject_archive_year.html:4
+#: templates/objectapp/gbobject_archive_year.html:6
+#: templates/objectapp/gbobject_archive_year.html:9
+#: templates/objectapp/tags/archives_gbobjects.html:5
+#: templates/objectapp/tags/archives_gbobjects_link.html:2
+#: templates/objectapp/tags/archives_gbobjects_tree.html:7
+#: templates/objectapp/tags/archives_gbobjects_tree.html:14
+#: templates/objectapp/tags/archives_gbobjects_tree.html:24
+msgid "Archives"
+msgstr ""
+
+#: templates/objectapp/base.html:72
+msgid "Tools"
+msgstr ""
+
+#: templates/objectapp/base.html:76 templates/objectapp/base.html.py:77
+msgid "Dashboard"
+msgstr ""
+
+#: templates/objectapp/base.html:83 templates/objectapp/base.html.py:84
+msgid "Post an gbobject"
+msgstr ""
+
+#: templates/objectapp/base.html:91 templates/objectapp/base.html.py:92
+msgid "Log out"
+msgstr ""
+
+#: templates/objectapp/Objecttype_list.html:4 templates/objectapp/Objecttype_list.html:9
+msgid "Objecttype list"
+msgstr ""
+
+#: templates/objectapp/gbobject_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/objectapp/gbobject_archive_year.html:13
+#: templates/objectapp/sitemap.html:67
+msgid "Monthly archives"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:10
+msgid "RSS Feed of discussions on"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:11
+msgid "RSS Feed of comments on"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:12
+msgid "RSS Feed of pingbacks on"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:13
+msgid "RSS Feed of trackbacks on"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:29
+msgid "Next gbobject"
+msgstr "Następny wpis"
+
+#: templates/objectapp/gbobject_detail.html:43
+msgid "Previous gbobject"
+msgstr "Poprzedni wpis"
+
+#: templates/objectapp/gbobject_detail.html:56
+msgid "Related gbobjects"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:67
+msgid "Similar gbobjects"
+msgstr "Podobne wpisy"
+
+#: templates/objectapp/gbobject_detail.html:75
+msgid "Comments"
+msgstr "Komentarze"
+
+#: templates/objectapp/gbobject_detail.html:117
+msgid "Pingbacks"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:139
+msgid "Pingbacks are open."
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:141
+msgid "Pingbacks are closed."
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:148
+msgid "Trackbacks"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:170
+msgid "Trackback URL"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "Latest gbobjects for"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the Objecttype"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4 templates/objectapp/gbobject_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:9 templates/objectapp/gbobject_list.html:12
+#: templates/objectapp/gbobject_list.html:15 templates/objectapp/skeleton.html:40
+msgid "RSS Feed"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:19
+msgid "Objecttype"
+msgstr "Kategoria"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_list.html:30
+msgid "Tag"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_search.html:4
+msgid "Page"
+msgstr "Strona"
+
+#: templates/objectapp/gbobject_list.html:34
+#, python-format
+msgid "Gbobjects by %(author)s"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:45 templates/objectapp/sitemap.html:23
+#: templates/objectapp/sitemap.html.py:43
+#: templates/objectapp/cms/gbobject_detail.html:12
+#: templates/objectapp/cms/gbobject_list.html:9
+#: templates/objectapp/tags/featured_gbobjects.html:9
+#: templates/objectapp/tags/popular_gbobjects.html:13
+#: templates/objectapp/tags/random_gbobjects.html:9
+#: templates/objectapp/tags/recent_gbobjects.html:9
+msgid "No gbobjects yet."
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:51 templates/objectapp/gbobject_search.html:40
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:56 templates/objectapp/gbobject_search.html:45
+msgid "More recent gbobjects"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:65 templates/objectapp/gbobject_search.html:54
+msgid "Gbobjects page"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:72 templates/objectapp/gbobject_search.html:61
+msgid "More old gbobjects"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:82 templates/objectapp/gbobject_list.html:83
+msgid "Edit the Objecttype"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:89 templates/objectapp/gbobject_list.html:90
+msgid "Edit the tag"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:96 templates/objectapp/gbobject_list.html:97
+msgid "Edit the author"
+msgstr ""
+
+#: templates/objectapp/gbobject_search.html:4 templates/objectapp/gbobject_search.html:6
+#: templates/objectapp/gbobject_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/objectapp/gbobject_search.html:10
+msgid "RSS Feed of search result of"
+msgstr ""
+
+#: templates/objectapp/gbobject_search.html:22
+#, python-format
+msgid "%(gbobject_count)s gbobject found"
+msgid_plural "%(gbobject_count)s gbobjects found"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: templates/objectapp/gbobject_search.html:34
+msgid "Nothing found."
+msgstr "Nic nie znaleziono."
+
+#: templates/objectapp/login.html:4 templates/objectapp/login.html.py:7
+msgid "Login required"
+msgstr ""
+
+#: templates/objectapp/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+
+#: templates/objectapp/login.html:16
+msgid "You need to be connected to view this gbobject."
+msgstr ""
+
+#: templates/objectapp/login.html:33
+msgid "Login"
+msgstr ""
+
+#: templates/objectapp/password.html:4 templates/objectapp/password.html.py:7
+msgid "Password required"
+msgstr ""
+
+#: templates/objectapp/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr ""
+
+#: templates/objectapp/password.html:16
+msgid "You need to provide a password to view this gbobject."
+msgstr ""
+
+#: templates/objectapp/password.html:23
+msgid "Password"
+msgstr ""
+
+#: templates/objectapp/password.html:28
+msgid "Valid"
+msgstr ""
+
+#: templates/objectapp/sitemap.html:10
+msgid "Gbobjects per objecttypes"
+msgstr "Wpisów w kategoriach"
+
+#: templates/objectapp/sitemap.html:18 templates/objectapp/sitemap.html.py:38
+#: templates/objectapp/tags/popular_gbobjects.html:8
+msgid "comment"
+msgstr ""
+
+#: templates/objectapp/sitemap.html:31
+msgid "All the gbobjects"
+msgstr "Wszystkie wpisy"
+
+#: templates/objectapp/sitemap.html:60 templates/objectapp/tags/objecttypes.html:11
+msgid "No objecttypes yet."
+msgstr "Brak kategorii."
+
+#: templates/objectapp/skeleton.html:27 templates/objectapp/skeleton.html.py:39
+msgid "RSS Feed of latest gbobjects"
+msgstr "Kanał RSS najnowszych wpisów"
+
+#: templates/objectapp/tag_list.html:4 templates/objectapp/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Lista tagów"
+
+#: templates/objectapp/wlwmanifest.xml:40
+msgid "View site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:41
+msgid "Admin. site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:53
+msgid "Manage comments"
+msgstr ""
+
+#: templates/objectapp/tags/archives_gbobjects.html:12
+#: templates/objectapp/tags/archives_gbobjects_tree.html:38
+msgid "No archives yet."
+msgstr ""
+
+#: templates/objectapp/tags/authors.html:12
+msgid "No authors yet."
+msgstr ""
+
+#: templates/objectapp/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr ""
+
+#: templates/objectapp/tags/similar_gbobjects.html:9
+msgid "No similar gbobjects."
+msgstr "Brak podobnych wpisów."
+
+#: tests/views.py:165 views/search.py:18
+msgid "The pattern is too short"
+msgstr ""
+
+#: tests/views.py:168 views/search.py:22
+msgid "No pattern to search found"
+msgstr ""
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Nazwa użytkownika jest nieprawidłowa."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Hasło jest nieprawidłowe."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Konto użytkownika niedostępne."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr ""
+
+#: xmlrpc/pingback.py:93
+msgid "No title"
+msgstr ""
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/pt_BR/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/objectapp/locale/pt_BR/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6411a1d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/pt_BR/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/pt_BR/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/objectapp/locale/pt_BR/LC_MESSAGES/django.po
new file mode 100644
index 0000000..901f9b1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/pt_BR/LC_MESSAGES/django.po
@@ -0,0 +1,1195 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# rogerio rgrlinux <rgrlinux@gmail.com>, 2011.
+# Seta00 <reuben@seta00.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-blog-objectapp\n"
+"Report-Msgid-Bugs-To: https://github.com/Fantomas42/django-blog-objectapp/issues\n"
+"POT-Creation-Date: 2011-04-12 13:21-0500\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+
+#: feeds.py:102 plugins/cms_plugins.py:23
+#: templates/objectapp/gbobject_archive.html:4
+#: templates/objectapp/gbobject_archive.html:25 templates/objectapp/gbobject_list.html:19
+#: tests/feeds.py:115
+msgid "Latest gbobjects"
+msgstr "Últimos artigos"
+
+#: feeds.py:106 tests/feeds.py:117
+#, python-format
+msgid "The latest gbobjects for the site %s"
+msgstr "Últimos artigos no site %s"
+
+#: feeds.py:126 tests/feeds.py:126
+#, python-format
+msgid "Gbobjects for the Objecttype %s"
+msgstr "Artigos na categoria %s"
+
+#: feeds.py:130 tests/feeds.py:128
+#, python-format
+msgid "The latest gbobjects for the Objecttype %s"
+msgstr "Últimos artigos na categoria %s"
+
+#: feeds.py:150 tests/feeds.py:137
+#, python-format
+msgid "Gbobjects for author %s"
+msgstr "Artigos do autor %s"
+
+#: feeds.py:154 tests/feeds.py:139
+#, python-format
+msgid "The latest gbobjects by %s"
+msgstr "Últimos artigos por %s"
+
+#: feeds.py:175 tests/feeds.py:149
+#, python-format
+msgid "Gbobjects for the tag %s"
+msgstr "Artigos com a tag %s"
+
+#: feeds.py:179 tests/feeds.py:151
+#, python-format
+msgid "The latest gbobjects for the tag %s"
+msgstr "Últimos artigos com a tag %s"
+
+#: feeds.py:199 tests/feeds.py:160
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr "Resultados da busca por '%s'"
+
+#: feeds.py:203 tests/feeds.py:162
+#, python-format
+msgid "The gbobjects containing the pattern '%s'"
+msgstr "Os artigos contendo '%s'"
+
+#: feeds.py:245 tests/feeds.py:178
+#, python-format
+msgid "Discussions on %s"
+msgstr "Discussões sobre %s"
+
+#: feeds.py:249 tests/feeds.py:180
+#, python-format
+msgid "The latest discussions for the gbobject %s"
+msgstr "Últimas discussões sobre o artigo %s"
+
+#: feeds.py:267 tests/feeds.py:190
+#, python-format
+msgid "Comments on %s"
+msgstr "Comentários sobre %s"
+
+#: feeds.py:271 tests/feeds.py:192
+#, python-format
+msgid "The latest comments for the gbobject %s"
+msgstr "Os comentários mais recentes para o artigo %s"
+
+#: feeds.py:301 tests/feeds.py:206
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Pingbacks sobre %s"
+
+#: feeds.py:305 tests/feeds.py:208
+#, python-format
+msgid "The latest pingbacks for the gbobject %s"
+msgstr "Os últimos pingbacks sobre o artigo %s"
+
+#: feeds.py:323 tests/feeds.py:218
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Trackbacks sobre %s"
+
+#: feeds.py:327 tests/feeds.py:220
+#, python-format
+msgid "The latest trackbacks for the gbobject %s"
+msgstr "Os últimos trackbacks sobre o artigo %s"
+
+#: models.py:64 models.py:105 admin/gbobject.py:73
+msgid "title"
+msgstr "título"
+
+#: models.py:65 models.py:119
+msgid "used for publication"
+msgstr "utilizados para publicação"
+
+#: models.py:67
+msgid "description"
+msgstr "descrição"
+
+#: models.py:70 admin/forms.py:18
+msgid "parent Objecttype"
+msgstr "categoria pai"
+
+#: models.py:95
+msgid "Objecttype"
+msgstr "categoria"
+
+#: models.py:96 models.py:114 admin/forms.py:47 plugins/models.py:24
+msgid "objecttypes"
+msgstr "categorias"
+
+#: models.py:101
+msgid "draft"
+msgstr "projeto"
+
+#: models.py:102
+msgid "hidden"
+msgstr "oculto"
+
+#: models.py:103
+msgid "published"
+msgstr "publicado"
+
+#: models.py:107
+msgid "image"
+msgstr "imagem"
+
+#: models.py:108
+msgid "used for illustration"
+msgstr "utilizados para ilustração"
+
+#: models.py:109
+msgid "content"
+msgstr "conteúdo"
+
+#: models.py:110
+msgid "excerpt"
+msgstr "resumo"
+
+#: models.py:111
+msgid "optional element"
+msgstr "elemento opcional"
+
+#: models.py:113 plugins/models.py:30
+msgid "tags"
+msgstr "tags"
+
+#: models.py:116
+msgid "related gbobjects"
+msgstr "artigos relacionados"
+
+#: models.py:123 plugins/models.py:28
+msgid "authors"
+msgstr "autores"
+
+#: models.py:126
+msgid "featured"
+msgstr "featured"
+
+#: models.py:127 admin/gbobject.py:124
+msgid "comment enabled"
+msgstr "comentário habilitado"
+
+#: models.py:128
+msgid "linkback enabled"
+msgstr "linkback habilitado"
+
+#: models.py:130
+msgid "creation date"
+msgstr "data de criação"
+
+#: models.py:131
+msgid "last update"
+msgstr "última atualização"
+
+#: models.py:132
+msgid "start publication"
+msgstr "início da publicação"
+
+#: models.py:133
+msgid "date start publish"
+msgstr "data de início da publicação"
+
+#: models.py:135
+msgid "end publication"
+msgstr "publicação final"
+
+#: models.py:136
+msgid "date end publish"
+msgstr "data de término da publicação"
+
+#: models.py:139
+msgid "sites publication"
+msgstr "publicação sites"
+
+#: models.py:141
+msgid "login required"
+msgstr "é necessário fazer login"
+
+#: models.py:142
+msgid "only authenticated users can view the gbobject"
+msgstr "somente os usuários autenticados podem ver este artigo"
+
+#: models.py:143
+msgid "password"
+msgstr "senha"
+
+#: models.py:144
+msgid "protect the gbobject with a password"
+msgstr "proteger o artigo com uma senha"
+
+#: models.py:146 plugins/models.py:34 plugins/models.py:58
+#: plugins/models.py:80
+msgid "template"
+msgstr "modelo"
+
+#: models.py:149
+msgid "Default template"
+msgstr "modelo padrão"
+
+#: models.py:151
+msgid "template used to display the gbobject"
+msgstr "modelo usado para exibir o artigo"
+
+#: models.py:285
+msgid "gbobject"
+msgstr "artigo"
+
+#: models.py:286 plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:57
+#: templates/objectapp/base.html:40
+msgid "gbobjects"
+msgstr "artigos"
+
+#: moderator.py:45 moderator.py:72
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[ %(site)s ] Novo comentário postado em \" %(title)s \""
+
+#: admin/Objecttype.py:30
+msgid "tree path"
+msgstr "caminho de árvore"
+
+#: admin/gbobject.py:27 plugins/admin.py:17
+#: templates/admin/objectapp/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Conteúdo"
+
+#: admin/gbobject.py:29 plugins/admin.py:19
+msgid "Options"
+msgstr "Opções"
+
+#: admin/gbobject.py:34 plugins/admin.py:24
+msgid "Privacy"
+msgstr "Privacidade"
+
+#: admin/gbobject.py:36 plugins/admin.py:26
+msgid "Discussion"
+msgstr "Discussão"
+
+#: admin/gbobject.py:38 plugins/admin.py:28
+msgid "Publication"
+msgstr "Publicação"
+
+#: admin/gbobject.py:66
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i palavras)"
+
+#: admin/gbobject.py:70
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i comentários)"
+
+#: admin/gbobject.py:86
+msgid "author(s)"
+msgstr "autor (es)"
+
+#: admin/gbobject.py:99
+msgid "Objecttype(s)"
+msgstr "categoria (s)"
+
+#: admin/gbobject.py:111
+msgid "tag(s)"
+msgstr "tag (s)"
+
+#: admin/gbobject.py:118
+msgid "site(s)"
+msgstr "site (s)"
+
+#: admin/gbobject.py:130
+msgid "is actual"
+msgstr "é atual"
+
+#: admin/gbobject.py:136
+msgid "is visible"
+msgstr "é visível"
+
+#: admin/gbobject.py:141
+msgid "View"
+msgstr "Ver"
+
+#: admin/gbobject.py:143
+msgid "View on site"
+msgstr "Ver no site"
+
+#: admin/gbobject.py:149 templates/objectapp/_gbobject_detail.html:64
+msgid "Unavailable"
+msgstr "Indisponível"
+
+#: admin/gbobject.py:153
+msgid "short url"
+msgstr "url curta"
+
+#: admin/gbobject.py:207
+msgid "The selected gbobjects now belong to you."
+msgstr "Os artigos selecionados agora pertencem a você."
+
+#: admin/gbobject.py:208
+msgid "Set the gbobjects to the user"
+msgstr "Definir os artigos para o usuário"
+
+#: admin/gbobject.py:214
+msgid "The selected gbobjects are now marked as published."
+msgstr "Os artigos selecionados foram publicados."
+
+#: admin/gbobject.py:215
+msgid "Set gbobjects selected as published"
+msgstr "Definir artigos selecionados conforme publicado"
+
+#: admin/gbobject.py:220
+msgid "The selected gbobjects are now marked as hidden."
+msgstr "Os artigos selecionados foram escondidos."
+
+#: admin/gbobject.py:221
+msgid "Set gbobjects selected as hidden"
+msgstr "Definir artigos selecionados como oculto"
+
+#: admin/gbobject.py:234
+msgid "The selected gbobjects have been tweeted."
+msgstr "Os artigos selecionados foram twitados."
+
+#: admin/gbobject.py:235
+msgid "Tweet gbobjects selected"
+msgstr "Tweet artigos selecionados"
+
+#: admin/gbobject.py:240
+msgid "Comments are now closed for selected gbobjects."
+msgstr "Comentários foram desativados nos artigos selecionados."
+
+#: admin/gbobject.py:241
+msgid "Close the comments for selected gbobjects"
+msgstr "Feche os comentários para os artigos selecionados"
+
+#: admin/gbobject.py:247
+msgid "Linkbacks are now closed for selected gbobjects."
+msgstr "Linkbacks foram desativados nos artigos selecionados."
+
+#: admin/gbobject.py:248
+msgid "Close the linkbacks for selected gbobjects"
+msgstr "Feche os linkbacks para os artigos selecionados"
+
+#: admin/gbobject.py:254
+msgid "The selected gbobjects are now set at the current date."
+msgstr "Os artigos selecionados agora pertencem à data atual."
+
+#: admin/gbobject.py:255
+msgid "Put the selected gbobjects on top at the current date"
+msgstr "Colocar os artigos selecionados no topo por hoje"
+
+#: admin/gbobject.py:272
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d gbobjects."
+msgstr "%(directory)s diretório pingado com sucesso %(success)d artigos."
+
+#: admin/gbobject.py:275
+msgid "Ping Directories for selected gbobjects"
+msgstr "Pingar diretórios para os artigos selecionados"
+
+#: admin/forms.py:20
+msgid "No parent Objecttype"
+msgstr "Nenhuma categoria pai"
+
+#: admin/forms.py:35
+msgid "A Objecttype cannot be parent of itself."
+msgstr "A categoria não pode ser pai de si mesmo."
+
+#: admin/forms.py:46 plugins/menu.py:70 templates/objectapp/base.html:22
+#: templates/objectapp/Objecttype_list.html:6 templates/objectapp/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:49
+msgid "Objecttypes"
+msgstr "Categorias"
+
+#: plugins/cms_app.py:12
+msgid "Objectapp App Hook"
+msgstr "Objectapp App Hook"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Seleção"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Avançado"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected gbobjects"
+msgstr "Artigos selecionados"
+
+#: plugins/cms_plugins.py:116 templates/objectapp/base.html:59
+msgid "Random gbobjects"
+msgstr "Artigos aleatórios"
+
+#: plugins/menu.py:19
+msgid "Objectapp Gbobject Menu"
+msgstr "Objectapp Menu de Artigo"
+
+#: plugins/menu.py:65
+msgid "Objectapp Objecttype Menu"
+msgstr "Objectapp Menu de Categoria"
+
+#: plugins/menu.py:82
+msgid "Objectapp Author Menu"
+msgstr "Objectapp Menu de Autor"
+
+#: plugins/menu.py:87 templates/objectapp/author_list.html:6
+#: templates/objectapp/base.html:26 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Autores"
+
+#: plugins/menu.py:100
+msgid "Objectapp Tag Menu"
+msgstr "Objectapp Menu de Tag"
+
+#: plugins/menu.py:105 templates/admin/objectapp/widgets/quickpost.html:25
+#: templates/objectapp/_gbobject_detail.html:47 templates/objectapp/base.html:34
+#: templates/objectapp/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Tags"
+
+#: plugins/models.py:16
+msgid "Gbobject list (default)"
+msgstr "Lista de artigos (padrão)"
+
+#: plugins/models.py:17
+msgid "Gbobject detailed"
+msgstr "Artigo detalhado"
+
+#: plugins/models.py:27
+msgid "include subobjecttypes"
+msgstr "Incluir subcategorias"
+
+#: plugins/models.py:33 plugins/models.py:79
+msgid "number of gbobjects"
+msgstr "número de artigos"
+
+#: plugins/models.py:36 plugins/models.py:60 plugins/models.py:82
+msgid "Template used to display the plugin"
+msgstr "Modelo usado para exibir o plugin"
+
+#: plugins/models.py:51 plugins/models.py:73 plugins/models.py:85
+#, python-format
+msgid "%s gbobjects"
+msgstr "%s artigos"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Erro 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Página não encontrada"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Desculpe, mas a página solicitada não pode ser encontrada."
+
+#: templates/404.html:15 templates/500.html:20
+msgid "Useful links"
+msgstr "Links úteis"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:24
+#: templates/500.html.py:25
+msgid "Blog index"
+msgstr "Índice do Blog"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:29
+#: templates/500.html.py:30 templates/objectapp/sitemap.html:4
+#: templates/objectapp/sitemap.html.py:7 templates/objectapp/skeleton.html:36
+#: templates/objectapp/skeleton.html.py:37
+msgid "Sitemap"
+msgstr "Mapa do Site"
+
+#: templates/404.html:31 templates/500.html:36 templates/objectapp/base.html:47
+msgid "Recent gbobjects"
+msgstr "Artigos recentes"
+
+#: templates/404.html:36 templates/500.html:41 templates/objectapp/base.html:10
+msgid "Search"
+msgstr "Pesquisa"
+
+#: templates/404.html:40 templates/500.html:45 templates/objectapp/base.html:13
+msgid "Keywords..."
+msgstr "Palavras-chave ..."
+
+#: templates/500.html:10
+msgid "Error 500"
+msgstr "Erro 500"
+
+#: templates/500.html:13 templates/500.html.py:16
+msgid "Server error"
+msgstr "Erro de servidor"
+
+#: templates/500.html:18
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"e-mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Houve um erro. Foi relatado aos administradores do site via e-mail e deve "
+"ser corrigido em breve. Obrigado pela sua paciência."
+
+#: templates/admin/objectapp/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Conteúdos"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:5
+#: templates/objectapp/_gbobject_detail.html:69
+msgid "Discussions"
+msgstr "Discussões"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:10
+#, python-format
+msgid "%(gbobjects)s gbobjects"
+msgstr " %(gbobjects)s artigos"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s comentários"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:22
+#, python-format
+msgid "%(objecttypes)s objecttypes"
+msgstr "%(objecttypes)s categorias"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s pingbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s tags"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s trackbacks"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s autores"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s rejeitados"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:7
+#: templates/objectapp/gbobject_detail.html:186
+#: templates/objectapp/gbobject_detail.html:187
+msgid "Edit the gbobject"
+msgstr "Editar o artigo"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:10
+#: templates/comments/objectapp_gbobject_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/objectapp/_gbobject_detail.html:18
+#: templates/objectapp/gbobject_detail.html:91
+#: templates/objectapp/gbobject_detail.html:126
+#: templates/objectapp/gbobject_detail.html:157
+msgid "on"
+msgstr "em"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:16
+#: templates/comments/objectapp/gbobject/form.html:19
+msgid "Preview"
+msgstr "Visualizar"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:23
+msgid "No draft gbobjects."
+msgstr "Não há entradas de rascunho."
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:32
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:33
+msgid "View all draft gbobjects"
+msgstr "Ver todas as entradas de rascunho"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:11
+#: templates/objectapp/_gbobject_detail.html:24
+#: templates/objectapp/tags/recent_comments.html:7
+#: templates/objectapp/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "em"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:14
+#: templates/objectapp/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Comentários sobre"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Editar o comentário"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:24
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Editar"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:31
+#: templates/objectapp/_gbobject_detail.html:77
+#: templates/objectapp/gbobject_detail.html:107
+#: templates/objectapp/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Ainda não há comentários."
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:40
+#: templates/admin/objectapp/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Gerenciar os comentários"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "fez um linkback em"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Editar o linkback"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:26
+#: templates/objectapp/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Não linkbacks ainda."
+
+#: templates/admin/objectapp/widgets/content_stats.html:6
+#: templates/admin/objectapp/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Hoje"
+
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:6
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:7
+msgid "Draft gbobjects"
+msgstr "Rascunho de artigos"
+
+#: templates/admin/objectapp/widgets/quickpost.html:5
+#: templates/admin/objectapp/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Publicação rápida"
+
+#: templates/admin/objectapp/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Título"
+
+#: templates/admin/objectapp/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Salvar como rascunho"
+
+#: templates/admin/objectapp/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Reset"
+
+#: templates/admin/objectapp/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Publicar"
+
+#: templates/admin/objectapp/widgets/recent_comments.html:6
+#: templates/admin/objectapp/widgets/recent_comments.html:7
+#: templates/objectapp/base.html:51
+msgid "Recent comments"
+msgstr "Comentários recentes"
+
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:6
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:7
+#: templates/objectapp/base.html:55
+msgid "Recent linkbacks"
+msgstr "Linkbacks recentes"
+
+#: templates/comments/comment_notification_email.txt:1
+#: templates/comments/comment_reply_email.txt:1
+#: templates/objectapp/gbobject_list.html:19
+msgid "Author"
+msgstr "Autor"
+
+#: templates/comments/comment_notification_email.txt:2
+msgid "Email"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:3
+msgid "IP"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:5
+#: templates/comments/comment_reply_email.txt:3
+msgid "Comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:8
+#: templates/comments/comment_reply_email.txt:6
+msgid "View this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:10
+msgid "Flag this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:12
+msgid "Delete this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:14
+msgid "Approve this comment"
+msgstr ""
+
+#: templates/comments/objectapp_gbobject_preview.html:4
+msgid "Comment preview"
+msgstr "Visualizar comentário"
+
+#: templates/comments/objectapp_gbobject_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Corrija o seguinte erro."
+msgstr[1] "Corrija os seguintes erros."
+
+#: templates/comments/objectapp_gbobject_preview.html:12
+msgid "Preview of the comment"
+msgstr "Visualização do comentário"
+
+#: templates/comments/objectapp/gbobject/form.html:7
+msgid "Post your comment"
+msgstr "Envie seu comentário"
+
+#: templates/comments/objectapp/gbobject/form.html:18
+msgid "Post"
+msgstr "Enviar"
+
+#: templates/comments/objectapp/gbobject/posted.html:4
+#: templates/comments/objectapp/gbobject/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Obrigado pelo seu comentário"
+
+#: templates/comments/objectapp/gbobject/posted.html:9
+#: templates/comments/objectapp/gbobject/posted.html:10
+msgid "Return to gbobject list"
+msgstr "Voltar à lista de artigos"
+
+#: templates/objectapp/_gbobject_detail.html:11
+msgid "Written by"
+msgstr "Escrito por"
+
+#: templates/objectapp/_gbobject_detail.html:15
+#, python-format
+msgid "Show %(author)s gbobjects"
+msgstr "Mostrar artigos do %(author)s "
+
+#: templates/objectapp/_gbobject_detail.html:20
+msgid "Written on"
+msgstr "Escrito em"
+
+#: templates/objectapp/_gbobject_detail.html:53
+msgid "No tags"
+msgstr "Não há tags"
+
+#: templates/objectapp/_gbobject_detail.html:58
+msgid "Short url"
+msgstr "url curta"
+
+#: templates/objectapp/_gbobject_detail.html:73
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s comentário"
+msgstr[1] "%(comment_count)s comentários"
+
+#: templates/objectapp/_gbobject_detail.html:79
+msgid "Be first to comment!"
+msgstr "Seja o primeiro a comentar!"
+
+#: templates/objectapp/_gbobject_detail.html:82
+#: templates/objectapp/gbobject_detail.html:103
+#: templates/objectapp/gbobject_detail.html:109
+msgid "Comments are closed."
+msgstr "Comentários estão fechados."
+
+#: templates/objectapp/_gbobject_detail.html:89
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s pingbacks"
+msgstr[1] "%(pingback_count)s pingbacks"
+
+#: templates/objectapp/_gbobject_detail.html:96
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s trackbacks"
+msgstr[1] "%(trackback_count)s trackbacks"
+
+#: templates/objectapp/author_list.html:4 templates/objectapp/author_list.html:9
+msgid "Author list"
+msgstr "Lista de autores"
+
+#: templates/objectapp/author_list.html:18 templates/objectapp/Objecttype_list.html:14
+#: templates/objectapp/sitemap.html:55 templates/objectapp/tag_list.html:16
+#: templates/objectapp/tags/authors.html:8
+#: templates/objectapp/tags/objecttypes.html:6
+#, python-format
+msgid "%(gbobject_count)s gbobject"
+msgid_plural "%(gbobject_count)s gbobjects"
+msgstr[0] "%(gbobject_count)s artigo"
+msgstr[1] "%(gbobject_count)s artigos"
+
+#: templates/objectapp/base.html:15
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for"
+" complex searchs."
+msgstr ""
+"Você pode usar - para excluir palavras ou frases, \"aspas duplas\" para "
+"frases exatas e os operadores AND/OR combinados com parênteses para uma "
+"busca mais complexa."
+
+#: templates/objectapp/base.html:30
+msgid "Calendar"
+msgstr "Calendário"
+
+#: templates/objectapp/base.html:63
+msgid "Popular gbobjects"
+msgstr "Artigos mais populares"
+
+#: templates/objectapp/base.html:67 templates/objectapp/gbobject_archive_day.html:4
+#: templates/objectapp/gbobject_archive_day.html:6
+#: templates/objectapp/gbobject_archive_day.html:9
+#: templates/objectapp/gbobject_archive_month.html:4
+#: templates/objectapp/gbobject_archive_month.html:6
+#: templates/objectapp/gbobject_archive_month.html:9
+#: templates/objectapp/gbobject_archive_year.html:4
+#: templates/objectapp/gbobject_archive_year.html:6
+#: templates/objectapp/gbobject_archive_year.html:9
+#: templates/objectapp/tags/archives_gbobjects.html:5
+#: templates/objectapp/tags/archives_gbobjects_link.html:2
+#: templates/objectapp/tags/archives_gbobjects_tree.html:7
+#: templates/objectapp/tags/archives_gbobjects_tree.html:14
+#: templates/objectapp/tags/archives_gbobjects_tree.html:24
+msgid "Archives"
+msgstr "Arquivos"
+
+#: templates/objectapp/base.html:72
+msgid "Tools"
+msgstr "Ferramentas"
+
+#: templates/objectapp/base.html:76 templates/objectapp/base.html.py:77
+msgid "Dashboard"
+msgstr "Dashboard"
+
+#: templates/objectapp/base.html:83 templates/objectapp/base.html.py:84
+msgid "Post an gbobject"
+msgstr "Enviar um comentário"
+
+#: templates/objectapp/base.html:91 templates/objectapp/base.html.py:92
+msgid "Log out"
+msgstr "Sair da sessão"
+
+#: templates/objectapp/Objecttype_list.html:4 templates/objectapp/Objecttype_list.html:9
+msgid "Objecttype list"
+msgstr "Lista de categorias"
+
+#: templates/objectapp/gbobject_archive_month.html:13
+msgid "Daily archives"
+msgstr "Arquivos diários"
+
+#: templates/objectapp/gbobject_archive_year.html:13
+#: templates/objectapp/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Arquivos mensais"
+
+#: templates/objectapp/gbobject_detail.html:10
+msgid "RSS Feed of discussions on"
+msgstr "RSS Feed das discussões"
+
+#: templates/objectapp/gbobject_detail.html:11
+msgid "RSS Feed of comments on"
+msgstr "RSS Feed dos comentários"
+
+#: templates/objectapp/gbobject_detail.html:12
+msgid "RSS Feed of pingbacks on"
+msgstr "RSS Feed das pingbacks"
+
+#: templates/objectapp/gbobject_detail.html:13
+msgid "RSS Feed of trackbacks on"
+msgstr "RSS Feed dos trackbacks"
+
+#: templates/objectapp/gbobject_detail.html:29
+msgid "Next gbobject"
+msgstr "Próximo artigo"
+
+#: templates/objectapp/gbobject_detail.html:43
+msgid "Previous gbobject"
+msgstr "Artigo anterior"
+
+#: templates/objectapp/gbobject_detail.html:56
+msgid "Related gbobjects"
+msgstr "Artigos relacionados"
+
+#: templates/objectapp/gbobject_detail.html:67
+msgid "Similar gbobjects"
+msgstr "Artigos semelhantes"
+
+#: templates/objectapp/gbobject_detail.html:75
+msgid "Comments"
+msgstr "Comentários"
+
+#: templates/objectapp/gbobject_detail.html:117
+msgid "Pingbacks"
+msgstr "Pingbacks"
+
+#: templates/objectapp/gbobject_detail.html:139
+msgid "Pingbacks are open."
+msgstr "Pingbacks estão abertas."
+
+#: templates/objectapp/gbobject_detail.html:141
+msgid "Pingbacks are closed."
+msgstr "Pingbacks estão fechados."
+
+#: templates/objectapp/gbobject_detail.html:148
+msgid "Trackbacks"
+msgstr "Trackbacks"
+
+#: templates/objectapp/gbobject_detail.html:170
+msgid "Trackback URL"
+msgstr "Trackback URL"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "Latest gbobjects for"
+msgstr "Ultimos artigos"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the Objecttype"
+msgstr "na categoria"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the tag"
+msgstr "na tag"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the author"
+msgstr "do autor"
+
+#: templates/objectapp/gbobject_list.html:4 templates/objectapp/gbobject_search.html:6
+msgid "page"
+msgstr "na página"
+
+#: templates/objectapp/gbobject_list.html:9 templates/objectapp/gbobject_list.html:12
+#: templates/objectapp/gbobject_list.html:15 templates/objectapp/skeleton.html:40
+msgid "RSS Feed"
+msgstr "RSS Feed"
+
+#: templates/objectapp/gbobject_list.html:19
+msgid "Objecttype"
+msgstr "Categoria"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_list.html:30
+msgid "Tag"
+msgstr "Tag"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_search.html:4
+msgid "Page"
+msgstr "Página"
+
+#: templates/objectapp/gbobject_list.html:34
+#, python-format
+msgid "Gbobjects by %(author)s"
+msgstr "Artigos por %(author)s"
+
+#: templates/objectapp/gbobject_list.html:45 templates/objectapp/sitemap.html:23
+#: templates/objectapp/sitemap.html.py:43
+#: templates/objectapp/cms/gbobject_detail.html:12
+#: templates/objectapp/cms/gbobject_list.html:9
+#: templates/objectapp/tags/featured_gbobjects.html:9
+#: templates/objectapp/tags/popular_gbobjects.html:13
+#: templates/objectapp/tags/random_gbobjects.html:9
+#: templates/objectapp/tags/recent_gbobjects.html:9
+msgid "No gbobjects yet."
+msgstr "Não há artigos ainda."
+
+#: templates/objectapp/gbobject_list.html:51 templates/objectapp/gbobject_search.html:40
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Página %(current_page)s de %(total_page)s"
+
+#: templates/objectapp/gbobject_list.html:56 templates/objectapp/gbobject_search.html:45
+msgid "More recent gbobjects"
+msgstr "Artigos mais recentes"
+
+#: templates/objectapp/gbobject_list.html:65 templates/objectapp/gbobject_search.html:54
+msgid "Gbobjects page"
+msgstr "Página de artigos"
+
+#: templates/objectapp/gbobject_list.html:72 templates/objectapp/gbobject_search.html:61
+msgid "More old gbobjects"
+msgstr "Artigos mais antigos"
+
+#: templates/objectapp/gbobject_list.html:82 templates/objectapp/gbobject_list.html:83
+msgid "Edit the Objecttype"
+msgstr "Editar a categoria"
+
+#: templates/objectapp/gbobject_list.html:89 templates/objectapp/gbobject_list.html:90
+msgid "Edit the tag"
+msgstr "Editar o tag"
+
+#: templates/objectapp/gbobject_list.html:96 templates/objectapp/gbobject_list.html:97
+msgid "Edit the author"
+msgstr "Editar o autor"
+
+#: templates/objectapp/gbobject_search.html:4 templates/objectapp/gbobject_search.html:6
+#: templates/objectapp/gbobject_search.html:14
+msgid "Search results for"
+msgstr "Resultados da busca por"
+
+#: templates/objectapp/gbobject_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "RSS Feed do resultado da pesquisa de"
+
+#: templates/objectapp/gbobject_search.html:22
+#, python-format
+msgid "%(gbobject_count)s gbobject found"
+msgid_plural "%(gbobject_count)s gbobjects found"
+msgstr[0] "%(gbobject_count)s artigo encontrado"
+msgstr[1] "%(gbobject_count)s artigos encontrados"
+
+#: templates/objectapp/gbobject_search.html:34
+msgid "Nothing found."
+msgstr "Nada foi encontrado."
+
+#: templates/objectapp/login.html:4 templates/objectapp/login.html.py:7
+msgid "Login required"
+msgstr "Login necessário"
+
+#: templates/objectapp/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+"Seu nome de usuário e a senha não correspondem. Por favor, tente novamente."
+
+#: templates/objectapp/login.html:16
+msgid "You need to be connected to view this gbobject."
+msgstr "Você precisa estar conectado para visualizar este comentário."
+
+#: templates/objectapp/login.html:33
+msgid "Login"
+msgstr "Login"
+
+#: templates/objectapp/password.html:4 templates/objectapp/password.html.py:7
+msgid "Password required"
+msgstr "Senha necessária"
+
+#: templates/objectapp/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "A senha fornecida não é válida. Por favor, tente novamente."
+
+#: templates/objectapp/password.html:16
+msgid "You need to provide a password to view this gbobject."
+msgstr "É preciso fornecer uma senha para visualizar este artigo."
+
+#: templates/objectapp/password.html:23
+msgid "Password"
+msgstr "Senha"
+
+#: templates/objectapp/password.html:28
+msgid "Valid"
+msgstr "Válido"
+
+#: templates/objectapp/sitemap.html:10
+msgid "Gbobjects per objecttypes"
+msgstr "Artigos por categorias"
+
+#: templates/objectapp/sitemap.html:18 templates/objectapp/sitemap.html.py:38
+#: templates/objectapp/tags/popular_gbobjects.html:8
+msgid "comment"
+msgstr "comentário"
+
+#: templates/objectapp/sitemap.html:31
+msgid "All the gbobjects"
+msgstr "Todas os artigos"
+
+#: templates/objectapp/sitemap.html:60 templates/objectapp/tags/objecttypes.html:11
+msgid "No objecttypes yet."
+msgstr "Não há categorias ainda."
+
+#: templates/objectapp/skeleton.html:27 templates/objectapp/skeleton.html.py:39
+msgid "RSS Feed of latest gbobjects"
+msgstr "RSS Feed dos últimos artigos"
+
+#: templates/objectapp/tag_list.html:4 templates/objectapp/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Lista de tags"
+
+#: templates/objectapp/wlwmanifest.xml:40
+msgid "View site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:41
+msgid "Admin. site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:53
+msgid "Manage comments"
+msgstr ""
+
+#: templates/objectapp/tags/archives_gbobjects.html:12
+#: templates/objectapp/tags/archives_gbobjects_tree.html:38
+msgid "No archives yet."
+msgstr "Não há arquivos ainda."
+
+#: templates/objectapp/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Nenhum autor ainda."
+
+#: templates/objectapp/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Linkback em"
+
+#: templates/objectapp/tags/similar_gbobjects.html:9
+msgid "No similar gbobjects."
+msgstr "Não há artigos semelhantes."
+
+#: tests/views.py:165 views/search.py:18
+msgid "The pattern is too short"
+msgstr "O padrão é muito curto"
+
+#: tests/views.py:168 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Nenhum padrão encontrado"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Nome de usuário está incorreto."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "A senha é inválida."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Conta de usuário não disponível."
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "Usuário não pode %s."
+
+#: xmlrpc/pingback.py:93
+msgid "No title"
+msgstr "Sem título"
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/ru/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/objectapp/locale/ru/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c763478
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/ru/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/ru/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/objectapp/locale/ru/LC_MESSAGES/django.po
new file mode 100644
index 0000000..9a9aadb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/ru/LC_MESSAGES/django.po
@@ -0,0 +1,1200 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Julien Fache <fantomas42@gmail.com>, 2011.
+# Max <makc.kekc@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-blog-objectapp\n"
+"Report-Msgid-Bugs-To: https://github.com/Fantomas42/django-blog-objectapp/issues\n"
+"POT-Creation-Date: 2011-04-12 13:21-0500\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ru\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
+
+#: feeds.py:102 plugins/cms_plugins.py:23
+#: templates/objectapp/gbobject_archive.html:4
+#: templates/objectapp/gbobject_archive.html:25 templates/objectapp/gbobject_list.html:19
+#: tests/feeds.py:115
+msgid "Latest gbobjects"
+msgstr "Последние записи"
+
+#: feeds.py:106 tests/feeds.py:117
+#, python-format
+msgid "The latest gbobjects for the site %s"
+msgstr "Последние новости сайта %s"
+
+#: feeds.py:126 tests/feeds.py:126
+#, python-format
+msgid "Gbobjects for the Objecttype %s"
+msgstr "Записи в категории %s"
+
+#: feeds.py:130 tests/feeds.py:128
+#, python-format
+msgid "The latest gbobjects for the Objecttype %s"
+msgstr "Последние новости в категории %s"
+
+#: feeds.py:150 tests/feeds.py:137
+#, python-format
+msgid "Gbobjects for author %s"
+msgstr "Записи от %s"
+
+#: feeds.py:154 tests/feeds.py:139
+#, python-format
+msgid "The latest gbobjects by %s"
+msgstr "Последние новости от %s"
+
+#: feeds.py:175 tests/feeds.py:149
+#, python-format
+msgid "Gbobjects for the tag %s"
+msgstr "Записи с тегом %s"
+
+#: feeds.py:179 tests/feeds.py:151
+#, python-format
+msgid "The latest gbobjects for the tag %s"
+msgstr "Последние новости с тегом %s"
+
+#: feeds.py:199 tests/feeds.py:160
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:162
+#, python-format
+msgid "The gbobjects containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:245 tests/feeds.py:178
+#, python-format
+msgid "Discussions on %s"
+msgstr "Обсуждений %s"
+
+#: feeds.py:249 tests/feeds.py:180
+#, python-format
+msgid "The latest discussions for the gbobject %s"
+msgstr "Последние комментарии к %s"
+
+#: feeds.py:267 tests/feeds.py:190
+#, python-format
+msgid "Comments on %s"
+msgstr "Комментарии к %s"
+
+#: feeds.py:271 tests/feeds.py:192
+#, python-format
+msgid "The latest comments for the gbobject %s"
+msgstr "Последние комментарии к %s"
+
+#: feeds.py:301 tests/feeds.py:206
+#, python-format
+msgid "Pingbacks on %s"
+msgstr "Пингбэки к %s"
+
+#: feeds.py:305 tests/feeds.py:208
+#, python-format
+msgid "The latest pingbacks for the gbobject %s"
+msgstr "Последние пингбэки к %s"
+
+#: feeds.py:323 tests/feeds.py:218
+#, python-format
+msgid "Trackbacks on %s"
+msgstr "Трэкбэки к %s"
+
+#: feeds.py:327 tests/feeds.py:220
+#, python-format
+msgid "The latest trackbacks for the gbobject %s"
+msgstr "Последние трэкбэки к %s"
+
+#: models.py:64 models.py:105 admin/gbobject.py:73
+msgid "title"
+msgstr "заголовок"
+
+#: models.py:65 models.py:119
+msgid "used for publication"
+msgstr "используется при публикации"
+
+#: models.py:67
+msgid "description"
+msgstr "описание"
+
+#: models.py:70 admin/forms.py:18
+msgid "parent Objecttype"
+msgstr "родительская категория"
+
+#: models.py:95
+msgid "Objecttype"
+msgstr "категория"
+
+#: models.py:96 models.py:114 admin/forms.py:47 plugins/models.py:24
+msgid "objecttypes"
+msgstr "категории"
+
+#: models.py:101
+msgid "draft"
+msgstr "черновик"
+
+#: models.py:102
+msgid "hidden"
+msgstr "скрыта"
+
+#: models.py:103
+msgid "published"
+msgstr "опубликована"
+
+#: models.py:107
+msgid "image"
+msgstr "изображение"
+
+#: models.py:108
+msgid "used for illustration"
+msgstr "используется для иллюстрации"
+
+#: models.py:109
+msgid "content"
+msgstr "содержимое"
+
+#: models.py:110
+msgid "excerpt"
+msgstr "выдержка"
+
+#: models.py:111
+msgid "optional element"
+msgstr "необязательный элемент"
+
+#: models.py:113 plugins/models.py:30
+msgid "tags"
+msgstr "тэги"
+
+#: models.py:116
+msgid "related gbobjects"
+msgstr "связанные записи"
+
+#: models.py:123 plugins/models.py:28
+msgid "authors"
+msgstr "авторы"
+
+#: models.py:126
+msgid "featured"
+msgstr "Популярные"
+
+#: models.py:127 admin/gbobject.py:124
+msgid "comment enabled"
+msgstr "комментирование включено"
+
+#: models.py:128
+msgid "linkback enabled"
+msgstr "обратные ссылки включены"
+
+#: models.py:130
+msgid "creation date"
+msgstr "дата создания"
+
+#: models.py:131
+msgid "last update"
+msgstr "последнее обновление"
+
+#: models.py:132
+msgid "start publication"
+msgstr "начало публикации"
+
+#: models.py:133
+msgid "date start publish"
+msgstr "дата начала публикации"
+
+#: models.py:135
+msgid "end publication"
+msgstr "окончание публикации"
+
+#: models.py:136
+msgid "date end publish"
+msgstr "дата окончания публикации"
+
+#: models.py:139
+msgid "sites publication"
+msgstr "сайты для публикации"
+
+#: models.py:141
+msgid "login required"
+msgstr "требуется авторизация"
+
+#: models.py:142
+msgid "only authenticated users can view the gbobject"
+msgstr "только авторизованные пользователи могут просматривать запись"
+
+#: models.py:143
+msgid "password"
+msgstr "пароль"
+
+#: models.py:144
+msgid "protect the gbobject with a password"
+msgstr "защитить запись паролем"
+
+#: models.py:146 plugins/models.py:34 plugins/models.py:58
+#: plugins/models.py:80
+msgid "template"
+msgstr "шаблон"
+
+#: models.py:149
+msgid "Default template"
+msgstr "Шаблон по умолчанию"
+
+#: models.py:151
+msgid "template used to display the gbobject"
+msgstr "шаблон, используемый для отображения записи"
+
+#: models.py:285
+msgid "gbobject"
+msgstr "запись"
+
+#: models.py:286 plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:57
+#: templates/objectapp/base.html:40
+msgid "gbobjects"
+msgstr "записи"
+
+#: moderator.py:45 moderator.py:72
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr "[%(site)s] Новый комментарий к \"%(title)s\""
+
+#: admin/Objecttype.py:30
+msgid "tree path"
+msgstr "путь"
+
+#: admin/gbobject.py:27 plugins/admin.py:17
+#: templates/admin/objectapp/widgets/quickpost.html:17
+msgid "Content"
+msgstr "Содержимое"
+
+#: admin/gbobject.py:29 plugins/admin.py:19
+msgid "Options"
+msgstr "Опции"
+
+#: admin/gbobject.py:34 plugins/admin.py:24
+msgid "Privacy"
+msgstr "приватность"
+
+#: admin/gbobject.py:36 plugins/admin.py:26
+msgid "Discussion"
+msgstr "Обсуждение"
+
+#: admin/gbobject.py:38 plugins/admin.py:28
+msgid "Publication"
+msgstr "Публикация"
+
+#: admin/gbobject.py:66
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i слов)"
+
+#: admin/gbobject.py:70
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i комментариев)"
+
+#: admin/gbobject.py:86
+msgid "author(s)"
+msgstr "автор(ы)"
+
+#: admin/gbobject.py:99
+msgid "Objecttype(s)"
+msgstr "категория(категории)"
+
+#: admin/gbobject.py:111
+msgid "tag(s)"
+msgstr "тэг(и)"
+
+#: admin/gbobject.py:118
+msgid "site(s)"
+msgstr "сайт(ы)"
+
+#: admin/gbobject.py:130
+msgid "is actual"
+msgstr "актуальна"
+
+#: admin/gbobject.py:136
+msgid "is visible"
+msgstr "видима"
+
+#: admin/gbobject.py:141
+msgid "View"
+msgstr ""
+
+#: admin/gbobject.py:143
+msgid "View on site"
+msgstr "Смотреть на сайте"
+
+#: admin/gbobject.py:149 templates/objectapp/_gbobject_detail.html:64
+msgid "Unavailable"
+msgstr "Недоступно"
+
+#: admin/gbobject.py:153
+msgid "short url"
+msgstr "короткая ссылка"
+
+#: admin/gbobject.py:207
+msgid "The selected gbobjects now belong to you."
+msgstr ""
+
+#: admin/gbobject.py:208
+msgid "Set the gbobjects to the user"
+msgstr "Установить записи пользователю"
+
+#: admin/gbobject.py:214
+msgid "The selected gbobjects are now marked as published."
+msgstr ""
+
+#: admin/gbobject.py:215
+msgid "Set gbobjects selected as published"
+msgstr "Пометить выделенные записи как опубликованные"
+
+#: admin/gbobject.py:220
+msgid "The selected gbobjects are now marked as hidden."
+msgstr ""
+
+#: admin/gbobject.py:221
+msgid "Set gbobjects selected as hidden"
+msgstr "Пометить выделенные записи как скрытые"
+
+#: admin/gbobject.py:234
+msgid "The selected gbobjects have been tweeted."
+msgstr ""
+
+#: admin/gbobject.py:235
+msgid "Tweet gbobjects selected"
+msgstr "Отправить выбранные записи в твиттер"
+
+#: admin/gbobject.py:240
+msgid "Comments are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:241
+msgid "Close the comments for selected gbobjects"
+msgstr "Закрыть комментирование для выбранных записей"
+
+#: admin/gbobject.py:247
+msgid "Linkbacks are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:248
+msgid "Close the linkbacks for selected gbobjects"
+msgstr "Запретить обратные ссылки для выбранных записей"
+
+#: admin/gbobject.py:254
+msgid "The selected gbobjects are now set at the current date."
+msgstr ""
+
+#: admin/gbobject.py:255
+msgid "Put the selected gbobjects on top at the current date"
+msgstr "Поднять выбранные записи на текущую дату"
+
+#: admin/gbobject.py:272
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d gbobjects."
+msgstr "%(directory)s успешно оповещены о %(success)d записей"
+
+#: admin/gbobject.py:275
+msgid "Ping Directories for selected gbobjects"
+msgstr "Оповестить каталоги о выбранных записях"
+
+#: admin/forms.py:20
+msgid "No parent Objecttype"
+msgstr "Отсутствует родительская категория"
+
+#: admin/forms.py:35
+msgid "A Objecttype cannot be parent of itself."
+msgstr "Категория не может быть унаследована от самой себя."
+
+#: admin/forms.py:46 plugins/menu.py:70 templates/objectapp/base.html:22
+#: templates/objectapp/Objecttype_list.html:6 templates/objectapp/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:49
+msgid "Objecttypes"
+msgstr "Категории"
+
+#: plugins/cms_app.py:12
+msgid "Objectapp App Hook"
+msgstr "Objectapp App Hook"
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "Сортировка"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr "Расширенный"
+
+#: plugins/cms_plugins.py:94
+msgid "Selected gbobjects"
+msgstr "Выбранные записи"
+
+#: plugins/cms_plugins.py:116 templates/objectapp/base.html:59
+msgid "Random gbobjects"
+msgstr "Случайные записи"
+
+#: plugins/menu.py:19
+msgid "Objectapp Gbobject Menu"
+msgstr "Objectapp меню записи"
+
+#: plugins/menu.py:65
+msgid "Objectapp Objecttype Menu"
+msgstr "Objectapp меню каталога"
+
+#: plugins/menu.py:82
+msgid "Objectapp Author Menu"
+msgstr "Objectapp меню автора"
+
+#: plugins/menu.py:87 templates/objectapp/author_list.html:6
+#: templates/objectapp/base.html:26 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "Авторы"
+
+#: plugins/menu.py:100
+msgid "Objectapp Tag Menu"
+msgstr "Objectapp меню тега"
+
+#: plugins/menu.py:105 templates/admin/objectapp/widgets/quickpost.html:25
+#: templates/objectapp/_gbobject_detail.html:47 templates/objectapp/base.html:34
+#: templates/objectapp/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "Теги"
+
+#: plugins/models.py:16
+msgid "Gbobject list (default)"
+msgstr "Список записей (по умолчанию)"
+
+#: plugins/models.py:17
+msgid "Gbobject detailed"
+msgstr "Просмотреть запись подробнее"
+
+#: plugins/models.py:27
+msgid "include subobjecttypes"
+msgstr "включает подкатегории"
+
+#: plugins/models.py:33 plugins/models.py:79
+msgid "number of gbobjects"
+msgstr "количество записей"
+
+#: plugins/models.py:36 plugins/models.py:60 plugins/models.py:82
+msgid "Template used to display the plugin"
+msgstr "Шаблон для отображения плагина"
+
+#: plugins/models.py:51 plugins/models.py:73 plugins/models.py:85
+#, python-format
+msgid "%s gbobjects"
+msgstr "%s записей"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr "Ошибка 404"
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr "Страница не найдена"
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr "Извините, запрашиваемая страница не найдена."
+
+#: templates/404.html:15 templates/500.html:20
+msgid "Useful links"
+msgstr "Полезные ссылки"
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:24
+#: templates/500.html.py:25
+msgid "Blog index"
+msgstr "Содержание блога"
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:29
+#: templates/500.html.py:30 templates/objectapp/sitemap.html:4
+#: templates/objectapp/sitemap.html.py:7 templates/objectapp/skeleton.html:36
+#: templates/objectapp/skeleton.html.py:37
+msgid "Sitemap"
+msgstr "Карта сайта"
+
+#: templates/404.html:31 templates/500.html:36 templates/objectapp/base.html:47
+msgid "Recent gbobjects"
+msgstr "Последние записи"
+
+#: templates/404.html:36 templates/500.html:41 templates/objectapp/base.html:10
+msgid "Search"
+msgstr "Поиск"
+
+#: templates/404.html:40 templates/500.html:45 templates/objectapp/base.html:13
+msgid "Keywords..."
+msgstr "Ключевые слова..."
+
+#: templates/500.html:10
+msgid "Error 500"
+msgstr "Ошибка 500"
+
+#: templates/500.html:13 templates/500.html.py:16
+msgid "Server error"
+msgstr "Ошибка сервера"
+
+#: templates/500.html:18
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"e-mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Произошла ошибка. Администраторы сайта получили уведомление на e-mail, и "
+"решают проблему. Спасибо за ваше терпение."
+
+#: templates/admin/objectapp/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr "Содержимое"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:5
+#: templates/objectapp/_gbobject_detail.html:69
+msgid "Discussions"
+msgstr "Обсуждения"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:10
+#, python-format
+msgid "%(gbobjects)s gbobjects"
+msgstr "%(gbobjects)s записей"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr "%(comments)s комментариев "
+
+#: templates/admin/objectapp/widgets/_content_stats.html:22
+#, python-format
+msgid "%(objecttypes)s objecttypes"
+msgstr "%(objecttypes)s категорий"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr "%(pingbacks)s пингбэков"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr "%(tags)s тегов"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr "%(trackbacks)s трэкбэков"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr "%(authors)s авторов"
+
+#: templates/admin/objectapp/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr "%(rejects)s отклонены"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:7
+#: templates/objectapp/gbobject_detail.html:186
+#: templates/objectapp/gbobject_detail.html:187
+msgid "Edit the gbobject"
+msgstr "Изменить запись"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:10
+#: templates/comments/objectapp_gbobject_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/objectapp/_gbobject_detail.html:18
+#: templates/objectapp/gbobject_detail.html:91
+#: templates/objectapp/gbobject_detail.html:126
+#: templates/objectapp/gbobject_detail.html:157
+msgid "on"
+msgstr "на"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:16
+#: templates/comments/objectapp/gbobject/form.html:19
+msgid "Preview"
+msgstr "Предпросмотр"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:23
+msgid "No draft gbobjects."
+msgstr "Записи отсутствуют."
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:32
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:33
+msgid "View all draft gbobjects"
+msgstr "Просмотреть все записи"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:11
+#: templates/objectapp/_gbobject_detail.html:24
+#: templates/objectapp/tags/recent_comments.html:7
+#: templates/objectapp/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "в"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:14
+#: templates/objectapp/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr "Комментарий к "
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr "Редактировать комментарий"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:24
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr "Редактировать"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:31
+#: templates/objectapp/_gbobject_detail.html:77
+#: templates/objectapp/gbobject_detail.html:107
+#: templates/objectapp/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr "Еще нет комментариев."
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:40
+#: templates/admin/objectapp/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr "Модерировать комментарии"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr "включить обратные ссылки"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr "Редактировать обратную ссылку"
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:26
+#: templates/objectapp/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr "Обратных ссылок нет."
+
+#: templates/admin/objectapp/widgets/content_stats.html:6
+#: templates/admin/objectapp/widgets/content_stats.html:7
+msgid "Today"
+msgstr "Сегодня"
+
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:6
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:7
+msgid "Draft gbobjects"
+msgstr "Связанные записи"
+
+#: templates/admin/objectapp/widgets/quickpost.html:5
+#: templates/admin/objectapp/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr "Быстрая публикация"
+
+#: templates/admin/objectapp/widgets/quickpost.html:9
+msgid "Title"
+msgstr "Заголовок"
+
+#: templates/admin/objectapp/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr "Сохранить как черновик"
+
+#: templates/admin/objectapp/widgets/quickpost.html:34
+msgid "Reset"
+msgstr "Сброс"
+
+#: templates/admin/objectapp/widgets/quickpost.html:35
+msgid "Publish"
+msgstr "Опубликована"
+
+#: templates/admin/objectapp/widgets/recent_comments.html:6
+#: templates/admin/objectapp/widgets/recent_comments.html:7
+#: templates/objectapp/base.html:51
+msgid "Recent comments"
+msgstr "Последние комментарии"
+
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:6
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:7
+#: templates/objectapp/base.html:55
+msgid "Recent linkbacks"
+msgstr "Последние обратные ссылки"
+
+#: templates/comments/comment_notification_email.txt:1
+#: templates/comments/comment_reply_email.txt:1
+#: templates/objectapp/gbobject_list.html:19
+msgid "Author"
+msgstr "Автор"
+
+#: templates/comments/comment_notification_email.txt:2
+msgid "Email"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:3
+msgid "IP"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:5
+#: templates/comments/comment_reply_email.txt:3
+msgid "Comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:8
+#: templates/comments/comment_reply_email.txt:6
+msgid "View this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:10
+msgid "Flag this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:12
+msgid "Delete this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:14
+msgid "Approve this comment"
+msgstr ""
+
+#: templates/comments/objectapp_gbobject_preview.html:4
+msgid "Comment preview"
+msgstr "Предпросмотр комментария"
+
+#: templates/comments/objectapp_gbobject_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] "Пожалуйста, исправьте следующую ошибку."
+msgstr[1] "Пожалуйста, исправьте следующие ошибки."
+msgstr[2] "Пожалуйста, исправьте следующие ошибки."
+
+#: templates/comments/objectapp_gbobject_preview.html:12
+msgid "Preview of the comment"
+msgstr "Предварительный просмотр комментария"
+
+#: templates/comments/objectapp/gbobject/form.html:7
+msgid "Post your comment"
+msgstr "Написать комментарий"
+
+#: templates/comments/objectapp/gbobject/form.html:18
+msgid "Post"
+msgstr "Опубликовать"
+
+#: templates/comments/objectapp/gbobject/posted.html:4
+#: templates/comments/objectapp/gbobject/posted.html:7
+msgid "Thanks for your comment"
+msgstr "Спасибо за комментарий"
+
+#: templates/comments/objectapp/gbobject/posted.html:9
+#: templates/comments/objectapp/gbobject/posted.html:10
+msgid "Return to gbobject list"
+msgstr "Вернуться к списку записей"
+
+#: templates/objectapp/_gbobject_detail.html:11
+msgid "Written by"
+msgstr "Автор"
+
+#: templates/objectapp/_gbobject_detail.html:15
+#, python-format
+msgid "Show %(author)s gbobjects"
+msgstr "Показать записи %(author)s"
+
+#: templates/objectapp/_gbobject_detail.html:20
+msgid "Written on"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:53
+msgid "No tags"
+msgstr "Нет тегов"
+
+#: templates/objectapp/_gbobject_detail.html:58
+msgid "Short url"
+msgstr "Короткая ссылка"
+
+#: templates/objectapp/_gbobject_detail.html:73
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] "%(comment_count)s комментарий"
+msgstr[1] "%(comment_count)s комментариев"
+msgstr[2] "%(comment_count)s комментарии"
+
+#: templates/objectapp/_gbobject_detail.html:79
+msgid "Be first to comment!"
+msgstr "Оставьте первый комментарий"
+
+#: templates/objectapp/_gbobject_detail.html:82
+#: templates/objectapp/gbobject_detail.html:103
+#: templates/objectapp/gbobject_detail.html:109
+msgid "Comments are closed."
+msgstr "Комментирование отключено."
+
+#: templates/objectapp/_gbobject_detail.html:89
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] "%(pingback_count)s оповещение"
+msgstr[1] "%(pingback_count)s оповещений"
+msgstr[2] "%(pingback_count)s оповещения"
+
+#: templates/objectapp/_gbobject_detail.html:96
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] "%(trackback_count)s архив"
+msgstr[1] "%(trackback_count)s архивов"
+msgstr[2] "%(trackback_count)s архивы"
+
+#: templates/objectapp/author_list.html:4 templates/objectapp/author_list.html:9
+msgid "Author list"
+msgstr "Список авторов"
+
+#: templates/objectapp/author_list.html:18 templates/objectapp/Objecttype_list.html:14
+#: templates/objectapp/sitemap.html:55 templates/objectapp/tag_list.html:16
+#: templates/objectapp/tags/authors.html:8
+#: templates/objectapp/tags/objecttypes.html:6
+#, python-format
+msgid "%(gbobject_count)s gbobject"
+msgid_plural "%(gbobject_count)s gbobjects"
+msgstr[0] "%(gbobject_count)s запись"
+msgstr[1] "%(gbobject_count)s записей"
+msgstr[2] "%(gbobject_count)s записи"
+
+#: templates/objectapp/base.html:15
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for"
+" complex searchs."
+msgstr ""
+"Для комплексного поиска вы можете использовать кавычки и двойные кавычки, а "
+"также операторы AND/OR."
+
+#: templates/objectapp/base.html:30
+msgid "Calendar"
+msgstr "Календарь"
+
+#: templates/objectapp/base.html:63
+msgid "Popular gbobjects"
+msgstr "Популярные записи"
+
+#: templates/objectapp/base.html:67 templates/objectapp/gbobject_archive_day.html:4
+#: templates/objectapp/gbobject_archive_day.html:6
+#: templates/objectapp/gbobject_archive_day.html:9
+#: templates/objectapp/gbobject_archive_month.html:4
+#: templates/objectapp/gbobject_archive_month.html:6
+#: templates/objectapp/gbobject_archive_month.html:9
+#: templates/objectapp/gbobject_archive_year.html:4
+#: templates/objectapp/gbobject_archive_year.html:6
+#: templates/objectapp/gbobject_archive_year.html:9
+#: templates/objectapp/tags/archives_gbobjects.html:5
+#: templates/objectapp/tags/archives_gbobjects_link.html:2
+#: templates/objectapp/tags/archives_gbobjects_tree.html:7
+#: templates/objectapp/tags/archives_gbobjects_tree.html:14
+#: templates/objectapp/tags/archives_gbobjects_tree.html:24
+msgid "Archives"
+msgstr "Архив"
+
+#: templates/objectapp/base.html:72
+msgid "Tools"
+msgstr "Инструменты"
+
+#: templates/objectapp/base.html:76 templates/objectapp/base.html.py:77
+msgid "Dashboard"
+msgstr "Панель управления"
+
+#: templates/objectapp/base.html:83 templates/objectapp/base.html.py:84
+msgid "Post an gbobject"
+msgstr "Опубликовать запись"
+
+#: templates/objectapp/base.html:91 templates/objectapp/base.html.py:92
+msgid "Log out"
+msgstr "Выйти"
+
+#: templates/objectapp/Objecttype_list.html:4 templates/objectapp/Objecttype_list.html:9
+msgid "Objecttype list"
+msgstr "Список категорий"
+
+#: templates/objectapp/gbobject_archive_month.html:13
+msgid "Daily archives"
+msgstr "Ежедневные архивы"
+
+#: templates/objectapp/gbobject_archive_year.html:13
+#: templates/objectapp/sitemap.html:67
+msgid "Monthly archives"
+msgstr "Архив за месяц"
+
+#: templates/objectapp/gbobject_detail.html:10
+msgid "RSS Feed of discussions on"
+msgstr "Включена RSS рассылка обсуждений"
+
+#: templates/objectapp/gbobject_detail.html:11
+msgid "RSS Feed of comments on"
+msgstr "RSS лента комментариев к"
+
+#: templates/objectapp/gbobject_detail.html:12
+msgid "RSS Feed of pingbacks on"
+msgstr "RSS лента пинбэков к"
+
+#: templates/objectapp/gbobject_detail.html:13
+msgid "RSS Feed of trackbacks on"
+msgstr "RSS лента трэкбэков к"
+
+#: templates/objectapp/gbobject_detail.html:29
+msgid "Next gbobject"
+msgstr "Следующая запись"
+
+#: templates/objectapp/gbobject_detail.html:43
+msgid "Previous gbobject"
+msgstr "Предыдущая запись"
+
+#: templates/objectapp/gbobject_detail.html:56
+msgid "Related gbobjects"
+msgstr "Связанные записи"
+
+#: templates/objectapp/gbobject_detail.html:67
+msgid "Similar gbobjects"
+msgstr "Похожие записи"
+
+#: templates/objectapp/gbobject_detail.html:75
+msgid "Comments"
+msgstr "Комментарии"
+
+#: templates/objectapp/gbobject_detail.html:117
+msgid "Pingbacks"
+msgstr "Пингбэки"
+
+#: templates/objectapp/gbobject_detail.html:139
+msgid "Pingbacks are open."
+msgstr "Оповещения открыты."
+
+#: templates/objectapp/gbobject_detail.html:141
+msgid "Pingbacks are closed."
+msgstr "Пингбэки отключены."
+
+#: templates/objectapp/gbobject_detail.html:148
+msgid "Trackbacks"
+msgstr "Трэкбэки"
+
+#: templates/objectapp/gbobject_detail.html:170
+msgid "Trackback URL"
+msgstr "URL архива"
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "Latest gbobjects for"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the Objecttype"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4 templates/objectapp/gbobject_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:9 templates/objectapp/gbobject_list.html:12
+#: templates/objectapp/gbobject_list.html:15 templates/objectapp/skeleton.html:40
+msgid "RSS Feed"
+msgstr "RSS лента"
+
+#: templates/objectapp/gbobject_list.html:19
+msgid "Objecttype"
+msgstr "Категория"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_list.html:30
+msgid "Tag"
+msgstr "Тег"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_search.html:4
+msgid "Page"
+msgstr "Страница"
+
+#: templates/objectapp/gbobject_list.html:34
+#, python-format
+msgid "Gbobjects by %(author)s"
+msgstr "Записи от %(author)s"
+
+#: templates/objectapp/gbobject_list.html:45 templates/objectapp/sitemap.html:23
+#: templates/objectapp/sitemap.html.py:43
+#: templates/objectapp/cms/gbobject_detail.html:12
+#: templates/objectapp/cms/gbobject_list.html:9
+#: templates/objectapp/tags/featured_gbobjects.html:9
+#: templates/objectapp/tags/popular_gbobjects.html:13
+#: templates/objectapp/tags/random_gbobjects.html:9
+#: templates/objectapp/tags/recent_gbobjects.html:9
+msgid "No gbobjects yet."
+msgstr "Записей еще нет."
+
+#: templates/objectapp/gbobject_list.html:51 templates/objectapp/gbobject_search.html:40
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr "Страница %(current_page)s из %(total_page)s"
+
+#: templates/objectapp/gbobject_list.html:56 templates/objectapp/gbobject_search.html:45
+msgid "More recent gbobjects"
+msgstr "Самые новые записи"
+
+#: templates/objectapp/gbobject_list.html:65 templates/objectapp/gbobject_search.html:54
+msgid "Gbobjects page"
+msgstr "Страница записей"
+
+#: templates/objectapp/gbobject_list.html:72 templates/objectapp/gbobject_search.html:61
+msgid "More old gbobjects"
+msgstr "Самые старые записи"
+
+#: templates/objectapp/gbobject_list.html:82 templates/objectapp/gbobject_list.html:83
+msgid "Edit the Objecttype"
+msgstr "Редактировать категорию"
+
+#: templates/objectapp/gbobject_list.html:89 templates/objectapp/gbobject_list.html:90
+msgid "Edit the tag"
+msgstr "Редактировать тег"
+
+#: templates/objectapp/gbobject_list.html:96 templates/objectapp/gbobject_list.html:97
+msgid "Edit the author"
+msgstr "Редактировать автора"
+
+#: templates/objectapp/gbobject_search.html:4 templates/objectapp/gbobject_search.html:6
+#: templates/objectapp/gbobject_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/objectapp/gbobject_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "RSS лента результатов поиска "
+
+#: templates/objectapp/gbobject_search.html:22
+#, python-format
+msgid "%(gbobject_count)s gbobject found"
+msgid_plural "%(gbobject_count)s gbobjects found"
+msgstr[0] "%(gbobject_count)s запись найдена"
+msgstr[1] "%(gbobject_count)s записей найдено"
+msgstr[2] "%(gbobject_count)s записи найдены"
+
+#: templates/objectapp/gbobject_search.html:34
+msgid "Nothing found."
+msgstr "Ничего не найдено."
+
+#: templates/objectapp/login.html:4 templates/objectapp/login.html.py:7
+msgid "Login required"
+msgstr "Требуется авторизация"
+
+#: templates/objectapp/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+"Имя пользователя и пароль не совпадают. Пожалуйста, попробуйте еще раз."
+
+#: templates/objectapp/login.html:16
+msgid "You need to be connected to view this gbobject."
+msgstr "Вы должны быть подключены, чтобы посмотреть эту запись."
+
+#: templates/objectapp/login.html:33
+msgid "Login"
+msgstr "Войти"
+
+#: templates/objectapp/password.html:4 templates/objectapp/password.html.py:7
+msgid "Password required"
+msgstr "Требуется пароль"
+
+#: templates/objectapp/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr "Неправильный пароль. Пожалуйста, попробуйте еще раз."
+
+#: templates/objectapp/password.html:16
+msgid "You need to provide a password to view this gbobject."
+msgstr "Вы должны ввести пароль для просмотра этой записи."
+
+#: templates/objectapp/password.html:23
+msgid "Password"
+msgstr "Пароль"
+
+#: templates/objectapp/password.html:28
+msgid "Valid"
+msgstr "Проверка пройдена"
+
+#: templates/objectapp/sitemap.html:10
+msgid "Gbobjects per objecttypes"
+msgstr "Записи в категории"
+
+#: templates/objectapp/sitemap.html:18 templates/objectapp/sitemap.html.py:38
+#: templates/objectapp/tags/popular_gbobjects.html:8
+msgid "comment"
+msgstr "комментарий"
+
+#: templates/objectapp/sitemap.html:31
+msgid "All the gbobjects"
+msgstr "Все записи"
+
+#: templates/objectapp/sitemap.html:60 templates/objectapp/tags/objecttypes.html:11
+msgid "No objecttypes yet."
+msgstr "Категории отсутствуют."
+
+#: templates/objectapp/skeleton.html:27 templates/objectapp/skeleton.html.py:39
+msgid "RSS Feed of latest gbobjects"
+msgstr "RSS лента последних записей"
+
+#: templates/objectapp/tag_list.html:4 templates/objectapp/tag_list.html.py:9
+msgid "Tag list"
+msgstr "Список тегов"
+
+#: templates/objectapp/wlwmanifest.xml:40
+msgid "View site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:41
+msgid "Admin. site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:53
+msgid "Manage comments"
+msgstr ""
+
+#: templates/objectapp/tags/archives_gbobjects.html:12
+#: templates/objectapp/tags/archives_gbobjects_tree.html:38
+msgid "No archives yet."
+msgstr "Нет записей в архиве."
+
+#: templates/objectapp/tags/authors.html:12
+msgid "No authors yet."
+msgstr "Авторов нет."
+
+#: templates/objectapp/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr "Обратные ссылки включены"
+
+#: templates/objectapp/tags/similar_gbobjects.html:9
+msgid "No similar gbobjects."
+msgstr "Нет похожих записей."
+
+#: tests/views.py:165 views/search.py:18
+msgid "The pattern is too short"
+msgstr "Запрос слишком короткий"
+
+#: tests/views.py:168 views/search.py:22
+msgid "No pattern to search found"
+msgstr "Нечего искать"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr "Неверное имя пользователя."
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr "Неверный пароль."
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr "Учетная запись пользователя отсутствует"
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr "Пользователь не может %s."
+
+#: xmlrpc/pingback.py:93
+msgid "No title"
+msgstr "Заголовок отсутствует"
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/zh_CN/LC_MESSAGES/django.mo b/build/lib.linux-i686-2.6/objectapp/locale/zh_CN/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..9940d4e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/zh_CN/LC_MESSAGES/django.mo
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/locale/zh_CN/LC_MESSAGES/django.po b/build/lib.linux-i686-2.6/objectapp/locale/zh_CN/LC_MESSAGES/django.po
new file mode 100644
index 0000000..e988d35
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/locale/zh_CN/LC_MESSAGES/django.po
@@ -0,0 +1,1182 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Julien Fache <fantomas42@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: django-blog-objectapp\n"
+"Report-Msgid-Bugs-To: https://github.com/Fantomas42/django-blog-objectapp/issues\n"
+"POT-Creation-Date: 2011-04-12 13:21-0500\n"
+"PO-Revision-Date: 2011-04-12 18:21+0000\n"
+"Last-Translator: Fantomas42 <fantomas42@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+
+#: feeds.py:102 plugins/cms_plugins.py:23
+#: templates/objectapp/gbobject_archive.html:4
+#: templates/objectapp/gbobject_archive.html:25 templates/objectapp/gbobject_list.html:19
+#: tests/feeds.py:115
+msgid "Latest gbobjects"
+msgstr "最新日志"
+
+#: feeds.py:106 tests/feeds.py:117
+#, python-format
+msgid "The latest gbobjects for the site %s"
+msgstr ""
+
+#: feeds.py:126 tests/feeds.py:126
+#, python-format
+msgid "Gbobjects for the Objecttype %s"
+msgstr "类别 %s 的日志"
+
+#: feeds.py:130 tests/feeds.py:128
+#, python-format
+msgid "The latest gbobjects for the Objecttype %s"
+msgstr ""
+
+#: feeds.py:150 tests/feeds.py:137
+#, python-format
+msgid "Gbobjects for author %s"
+msgstr "作者 %s 的日志"
+
+#: feeds.py:154 tests/feeds.py:139
+#, python-format
+msgid "The latest gbobjects by %s"
+msgstr ""
+
+#: feeds.py:175 tests/feeds.py:149
+#, python-format
+msgid "Gbobjects for the tag %s"
+msgstr "标签含 %s 的日志"
+
+#: feeds.py:179 tests/feeds.py:151
+#, python-format
+msgid "The latest gbobjects for the tag %s"
+msgstr ""
+
+#: feeds.py:199 tests/feeds.py:160
+#, python-format
+msgid "Results of the search for '%s'"
+msgstr ""
+
+#: feeds.py:203 tests/feeds.py:162
+#, python-format
+msgid "The gbobjects containing the pattern '%s'"
+msgstr ""
+
+#: feeds.py:245 tests/feeds.py:178
+#, python-format
+msgid "Discussions on %s"
+msgstr ""
+
+#: feeds.py:249 tests/feeds.py:180
+#, python-format
+msgid "The latest discussions for the gbobject %s"
+msgstr ""
+
+#: feeds.py:267 tests/feeds.py:190
+#, python-format
+msgid "Comments on %s"
+msgstr "对于 %s 的评论"
+
+#: feeds.py:271 tests/feeds.py:192
+#, python-format
+msgid "The latest comments for the gbobject %s"
+msgstr ""
+
+#: feeds.py:301 tests/feeds.py:206
+#, python-format
+msgid "Pingbacks on %s"
+msgstr ""
+
+#: feeds.py:305 tests/feeds.py:208
+#, python-format
+msgid "The latest pingbacks for the gbobject %s"
+msgstr ""
+
+#: feeds.py:323 tests/feeds.py:218
+#, python-format
+msgid "Trackbacks on %s"
+msgstr ""
+
+#: feeds.py:327 tests/feeds.py:220
+#, python-format
+msgid "The latest trackbacks for the gbobject %s"
+msgstr ""
+
+#: models.py:64 models.py:105 admin/gbobject.py:73
+msgid "title"
+msgstr "标题"
+
+#: models.py:65 models.py:119
+msgid "used for publication"
+msgstr "用于发布"
+
+#: models.py:67
+msgid "description"
+msgstr "描述"
+
+#: models.py:70 admin/forms.py:18
+msgid "parent Objecttype"
+msgstr ""
+
+#: models.py:95
+msgid "Objecttype"
+msgstr "类别"
+
+#: models.py:96 models.py:114 admin/forms.py:47 plugins/models.py:24
+msgid "objecttypes"
+msgstr "类别"
+
+#: models.py:101
+msgid "draft"
+msgstr "草稿"
+
+#: models.py:102
+msgid "hidden"
+msgstr "隐藏"
+
+#: models.py:103
+msgid "published"
+msgstr "发布"
+
+#: models.py:107
+msgid "image"
+msgstr "图片"
+
+#: models.py:108
+msgid "used for illustration"
+msgstr "用于插图"
+
+#: models.py:109
+msgid "content"
+msgstr "内容"
+
+#: models.py:110
+msgid "excerpt"
+msgstr "摘要"
+
+#: models.py:111
+msgid "optional element"
+msgstr "可选项"
+
+#: models.py:113 plugins/models.py:30
+msgid "tags"
+msgstr "标签"
+
+#: models.py:116
+msgid "related gbobjects"
+msgstr "相关日志"
+
+#: models.py:123 plugins/models.py:28
+msgid "authors"
+msgstr "作者"
+
+#: models.py:126
+msgid "featured"
+msgstr ""
+
+#: models.py:127 admin/gbobject.py:124
+msgid "comment enabled"
+msgstr "允许评论"
+
+#: models.py:128
+msgid "linkback enabled"
+msgstr ""
+
+#: models.py:130
+msgid "creation date"
+msgstr "创建日期"
+
+#: models.py:131
+msgid "last update"
+msgstr "最后更新"
+
+#: models.py:132
+msgid "start publication"
+msgstr "开始发布"
+
+#: models.py:133
+msgid "date start publish"
+msgstr "开始发布日期"
+
+#: models.py:135
+msgid "end publication"
+msgstr "结束发布"
+
+#: models.py:136
+msgid "date end publish"
+msgstr "结束发布日期"
+
+#: models.py:139
+msgid "sites publication"
+msgstr "发布网站"
+
+#: models.py:141
+msgid "login required"
+msgstr ""
+
+#: models.py:142
+msgid "only authenticated users can view the gbobject"
+msgstr ""
+
+#: models.py:143
+msgid "password"
+msgstr ""
+
+#: models.py:144
+msgid "protect the gbobject with a password"
+msgstr ""
+
+#: models.py:146 plugins/models.py:34 plugins/models.py:58
+#: plugins/models.py:80
+msgid "template"
+msgstr ""
+
+#: models.py:149
+msgid "Default template"
+msgstr ""
+
+#: models.py:151
+msgid "template used to display the gbobject"
+msgstr ""
+
+#: models.py:285
+msgid "gbobject"
+msgstr "日志"
+
+#: models.py:286 plugins/cms_plugins.py:21 plugins/cms_plugins.py:92
+#: plugins/cms_plugins.py:114 plugins/models.py:57
+#: templates/objectapp/base.html:40
+msgid "gbobjects"
+msgstr "日志"
+
+#: moderator.py:45 moderator.py:72
+#, python-format
+msgid "[%(site)s] New comment posted on \"%(title)s\""
+msgstr ""
+
+#: admin/Objecttype.py:30
+msgid "tree path"
+msgstr ""
+
+#: admin/gbobject.py:27 plugins/admin.py:17
+#: templates/admin/objectapp/widgets/quickpost.html:17
+msgid "Content"
+msgstr "内容"
+
+#: admin/gbobject.py:29 plugins/admin.py:19
+msgid "Options"
+msgstr "选项"
+
+#: admin/gbobject.py:34 plugins/admin.py:24
+msgid "Privacy"
+msgstr ""
+
+#: admin/gbobject.py:36 plugins/admin.py:26
+msgid "Discussion"
+msgstr ""
+
+#: admin/gbobject.py:38 plugins/admin.py:28
+msgid "Publication"
+msgstr ""
+
+#: admin/gbobject.py:66
+#, python-format
+msgid "%(title)s (%(word_count)i words)"
+msgstr "%(title)s (%(word_count)i 个字符)"
+
+#: admin/gbobject.py:70
+#, python-format
+msgid "%(title)s (%(comments)i comments)"
+msgstr "%(title)s (%(comments)i 条评论)"
+
+#: admin/gbobject.py:86
+msgid "author(s)"
+msgstr "作者"
+
+#: admin/gbobject.py:99
+msgid "Objecttype(s)"
+msgstr "类别"
+
+#: admin/gbobject.py:111
+msgid "tag(s)"
+msgstr "标签"
+
+#: admin/gbobject.py:118
+msgid "site(s)"
+msgstr "网站"
+
+#: admin/gbobject.py:130
+msgid "is actual"
+msgstr "发布期间"
+
+#: admin/gbobject.py:136
+msgid "is visible"
+msgstr "是否可见"
+
+#: admin/gbobject.py:141
+msgid "View"
+msgstr ""
+
+#: admin/gbobject.py:143
+msgid "View on site"
+msgstr "浏览站点"
+
+#: admin/gbobject.py:149 templates/objectapp/_gbobject_detail.html:64
+msgid "Unavailable"
+msgstr "不存在"
+
+#: admin/gbobject.py:153
+msgid "short url"
+msgstr "缩略URL"
+
+#: admin/gbobject.py:207
+msgid "The selected gbobjects now belong to you."
+msgstr ""
+
+#: admin/gbobject.py:208
+msgid "Set the gbobjects to the user"
+msgstr "设置自己为所选日志的作者"
+
+#: admin/gbobject.py:214
+msgid "The selected gbobjects are now marked as published."
+msgstr ""
+
+#: admin/gbobject.py:215
+msgid "Set gbobjects selected as published"
+msgstr "发布所选日志"
+
+#: admin/gbobject.py:220
+msgid "The selected gbobjects are now marked as hidden."
+msgstr ""
+
+#: admin/gbobject.py:221
+msgid "Set gbobjects selected as hidden"
+msgstr "隐藏所选日志"
+
+#: admin/gbobject.py:234
+msgid "The selected gbobjects have been tweeted."
+msgstr ""
+
+#: admin/gbobject.py:235
+msgid "Tweet gbobjects selected"
+msgstr "推特所选日志"
+
+#: admin/gbobject.py:240
+msgid "Comments are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:241
+msgid "Close the comments for selected gbobjects"
+msgstr "关闭所选日志的评论功能"
+
+#: admin/gbobject.py:247
+msgid "Linkbacks are now closed for selected gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:248
+msgid "Close the linkbacks for selected gbobjects"
+msgstr ""
+
+#: admin/gbobject.py:254
+msgid "The selected gbobjects are now set at the current date."
+msgstr ""
+
+#: admin/gbobject.py:255
+msgid "Put the selected gbobjects on top at the current date"
+msgstr ""
+
+#: admin/gbobject.py:272
+#, python-format
+msgid "%(directory)s directory succesfully pinged %(success)d gbobjects."
+msgstr ""
+
+#: admin/gbobject.py:275
+msgid "Ping Directories for selected gbobjects"
+msgstr "提交所选日志到搜索引擎"
+
+#: admin/forms.py:20
+msgid "No parent Objecttype"
+msgstr ""
+
+#: admin/forms.py:35
+msgid "A Objecttype cannot be parent of itself."
+msgstr ""
+
+#: admin/forms.py:46 plugins/menu.py:70 templates/objectapp/base.html:22
+#: templates/objectapp/Objecttype_list.html:6 templates/objectapp/sitemap.html:50
+#: templatetags/zbreadcrumbs.py:49
+msgid "Objecttypes"
+msgstr "类别"
+
+#: plugins/cms_app.py:12
+msgid "Objectapp App Hook"
+msgstr ""
+
+#: plugins/cms_plugins.py:33
+msgid "Sorting"
+msgstr "分类"
+
+#: plugins/cms_plugins.py:43
+msgid "Advanced"
+msgstr ""
+
+#: plugins/cms_plugins.py:94
+msgid "Selected gbobjects"
+msgstr "所选日志"
+
+#: plugins/cms_plugins.py:116 templates/objectapp/base.html:59
+msgid "Random gbobjects"
+msgstr "随机日志"
+
+#: plugins/menu.py:19
+msgid "Objectapp Gbobject Menu"
+msgstr ""
+
+#: plugins/menu.py:65
+msgid "Objectapp Objecttype Menu"
+msgstr ""
+
+#: plugins/menu.py:82
+msgid "Objectapp Author Menu"
+msgstr ""
+
+#: plugins/menu.py:87 templates/objectapp/author_list.html:6
+#: templates/objectapp/base.html:26 templatetags/zbreadcrumbs.py:46
+msgid "Authors"
+msgstr "作者"
+
+#: plugins/menu.py:100
+msgid "Objectapp Tag Menu"
+msgstr ""
+
+#: plugins/menu.py:105 templates/admin/objectapp/widgets/quickpost.html:25
+#: templates/objectapp/_gbobject_detail.html:47 templates/objectapp/base.html:34
+#: templates/objectapp/tag_list.html:6 templatetags/zbreadcrumbs.py:43
+msgid "Tags"
+msgstr "标签"
+
+#: plugins/models.py:16
+msgid "Gbobject list (default)"
+msgstr ""
+
+#: plugins/models.py:17
+msgid "Gbobject detailed"
+msgstr ""
+
+#: plugins/models.py:27
+msgid "include subobjecttypes"
+msgstr ""
+
+#: plugins/models.py:33 plugins/models.py:79
+msgid "number of gbobjects"
+msgstr "日志数量"
+
+#: plugins/models.py:36 plugins/models.py:60 plugins/models.py:82
+msgid "Template used to display the plugin"
+msgstr ""
+
+#: plugins/models.py:51 plugins/models.py:73 plugins/models.py:85
+#, python-format
+msgid "%s gbobjects"
+msgstr "%s 日志"
+
+#: templates/404.html:5
+msgid "Error 404"
+msgstr ""
+
+#: templates/404.html:8 templates/404.html.py:11
+msgid "Page not found"
+msgstr ""
+
+#: templates/404.html:13
+msgid "Sorry, but the requested page could not be found."
+msgstr ""
+
+#: templates/404.html:15 templates/500.html:20
+msgid "Useful links"
+msgstr ""
+
+#: templates/404.html:19 templates/404.html.py:20 templates/500.html:24
+#: templates/500.html.py:25
+msgid "Blog index"
+msgstr ""
+
+#: templates/404.html:24 templates/404.html.py:25 templates/500.html:29
+#: templates/500.html.py:30 templates/objectapp/sitemap.html:4
+#: templates/objectapp/sitemap.html.py:7 templates/objectapp/skeleton.html:36
+#: templates/objectapp/skeleton.html.py:37
+msgid "Sitemap"
+msgstr ""
+
+#: templates/404.html:31 templates/500.html:36 templates/objectapp/base.html:47
+msgid "Recent gbobjects"
+msgstr "最近日志"
+
+#: templates/404.html:36 templates/500.html:41 templates/objectapp/base.html:10
+msgid "Search"
+msgstr "搜索"
+
+#: templates/404.html:40 templates/500.html:45 templates/objectapp/base.html:13
+msgid "Keywords..."
+msgstr "关键词..."
+
+#: templates/500.html:10
+msgid "Error 500"
+msgstr ""
+
+#: templates/500.html:13 templates/500.html.py:16
+msgid "Server error"
+msgstr ""
+
+#: templates/500.html:18
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"e-mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:4
+msgid "Contents"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:5
+#: templates/objectapp/_gbobject_detail.html:69
+msgid "Discussions"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:10
+#, python-format
+msgid "%(gbobjects)s gbobjects"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:15
+#, python-format
+msgid "%(comments)s comments"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:22
+#, python-format
+msgid "%(objecttypes)s objecttypes"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:25
+#, python-format
+msgid "%(pingbacks)s pingbacks"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:30
+#, python-format
+msgid "%(tags)s tags"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:33
+#, python-format
+msgid "%(trackbacks)s trackbacks"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:38
+#, python-format
+msgid "%(authors)s authors"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_content_stats.html:43
+#, python-format
+msgid "%(rejects)s rejected"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:7
+#: templates/objectapp/gbobject_detail.html:186
+#: templates/objectapp/gbobject_detail.html:187
+msgid "Edit the gbobject"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:10
+#: templates/comments/objectapp_gbobject_preview.html:25
+#: templates/feeds/comment_title.html:2
+#: templates/feeds/discussion_title.html:2
+#: templates/feeds/pingback_title.html:2
+#: templates/feeds/trackback_title.html:2
+#: templates/objectapp/_gbobject_detail.html:18
+#: templates/objectapp/gbobject_detail.html:91
+#: templates/objectapp/gbobject_detail.html:126
+#: templates/objectapp/gbobject_detail.html:157
+msgid "on"
+msgstr "在"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:16
+#: templates/comments/objectapp/gbobject/form.html:19
+msgid "Preview"
+msgstr "预览"
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:23
+msgid "No draft gbobjects."
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:32
+#: templates/admin/objectapp/widgets/_draft_gbobjects.html:33
+msgid "View all draft gbobjects"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:11
+#: templates/objectapp/_gbobject_detail.html:24
+#: templates/objectapp/tags/recent_comments.html:7
+#: templates/objectapp/tags/recent_linkbacks.html:8
+msgid "in"
+msgstr "在"
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:14
+#: templates/objectapp/tags/recent_comments.html:9
+msgid "Comment on"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:23
+msgid "Edit the comment"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:24
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:19
+msgid "Edit"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:31
+#: templates/objectapp/_gbobject_detail.html:77
+#: templates/objectapp/gbobject_detail.html:107
+#: templates/objectapp/tags/recent_comments.html:16
+msgid "No comments yet."
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_comments.html:40
+#: templates/admin/objectapp/widgets/_recent_comments.html:41
+msgid "Manage the comments"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:8
+msgid "made a linkback on"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:18
+msgid "Edit the linkback"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/_recent_linkbacks.html:26
+#: templates/objectapp/tags/recent_linkbacks.html:17
+msgid "No linkbacks yet."
+msgstr ""
+
+#: templates/admin/objectapp/widgets/content_stats.html:6
+#: templates/admin/objectapp/widgets/content_stats.html:7
+msgid "Today"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:6
+#: templates/admin/objectapp/widgets/draft_gbobjects.html:7
+msgid "Draft gbobjects"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/quickpost.html:5
+#: templates/admin/objectapp/widgets/quickpost.html:6
+msgid "Quick publishing"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/quickpost.html:9
+msgid "Title"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/quickpost.html:33
+msgid "Save as draft"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/quickpost.html:34
+msgid "Reset"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/quickpost.html:35
+msgid "Publish"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/recent_comments.html:6
+#: templates/admin/objectapp/widgets/recent_comments.html:7
+#: templates/objectapp/base.html:51
+msgid "Recent comments"
+msgstr ""
+
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:6
+#: templates/admin/objectapp/widgets/recent_linkbacks.html:7
+#: templates/objectapp/base.html:55
+msgid "Recent linkbacks"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:1
+#: templates/comments/comment_reply_email.txt:1
+#: templates/objectapp/gbobject_list.html:19
+msgid "Author"
+msgstr "作者"
+
+#: templates/comments/comment_notification_email.txt:2
+msgid "Email"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:3
+msgid "IP"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:5
+#: templates/comments/comment_reply_email.txt:3
+msgid "Comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:8
+#: templates/comments/comment_reply_email.txt:6
+msgid "View this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:10
+msgid "Flag this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:12
+msgid "Delete this comment"
+msgstr ""
+
+#: templates/comments/comment_notification_email.txt:14
+msgid "Approve this comment"
+msgstr ""
+
+#: templates/comments/objectapp_gbobject_preview.html:4
+msgid "Comment preview"
+msgstr "评论预览"
+
+#: templates/comments/objectapp_gbobject_preview.html:9
+msgid "Please correct following error."
+msgid_plural "Please correct following errors."
+msgstr[0] ""
+
+#: templates/comments/objectapp_gbobject_preview.html:12
+msgid "Preview of the comment"
+msgstr "预览评论"
+
+#: templates/comments/objectapp/gbobject/form.html:7
+msgid "Post your comment"
+msgstr "发表评论"
+
+#: templates/comments/objectapp/gbobject/form.html:18
+msgid "Post"
+msgstr "发表"
+
+#: templates/comments/objectapp/gbobject/posted.html:4
+#: templates/comments/objectapp/gbobject/posted.html:7
+msgid "Thanks for your comment"
+msgstr "感谢你的评论"
+
+#: templates/comments/objectapp/gbobject/posted.html:9
+#: templates/comments/objectapp/gbobject/posted.html:10
+msgid "Return to gbobject list"
+msgstr "返回日志列表"
+
+#: templates/objectapp/_gbobject_detail.html:11
+msgid "Written by"
+msgstr "作者是"
+
+#: templates/objectapp/_gbobject_detail.html:15
+#, python-format
+msgid "Show %(author)s gbobjects"
+msgstr "显示 %(author)s 的日志"
+
+#: templates/objectapp/_gbobject_detail.html:20
+msgid "Written on"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:53
+msgid "No tags"
+msgstr "没有标签"
+
+#: templates/objectapp/_gbobject_detail.html:58
+msgid "Short url"
+msgstr "缩略URL"
+
+#: templates/objectapp/_gbobject_detail.html:73
+#, python-format
+msgid "%(comment_count)s comment"
+msgid_plural "%(comment_count)s comments"
+msgstr[0] ""
+
+#: templates/objectapp/_gbobject_detail.html:79
+msgid "Be first to comment!"
+msgstr ""
+
+#: templates/objectapp/_gbobject_detail.html:82
+#: templates/objectapp/gbobject_detail.html:103
+#: templates/objectapp/gbobject_detail.html:109
+msgid "Comments are closed."
+msgstr "评论已关闭"
+
+#: templates/objectapp/_gbobject_detail.html:89
+#, python-format
+msgid "%(pingback_count)s pingback"
+msgid_plural "%(pingback_count)s pingbacks"
+msgstr[0] ""
+
+#: templates/objectapp/_gbobject_detail.html:96
+#, python-format
+msgid "%(trackback_count)s trackback"
+msgid_plural "%(trackback_count)s trackbacks"
+msgstr[0] ""
+
+#: templates/objectapp/author_list.html:4 templates/objectapp/author_list.html:9
+msgid "Author list"
+msgstr "作者列表"
+
+#: templates/objectapp/author_list.html:18 templates/objectapp/Objecttype_list.html:14
+#: templates/objectapp/sitemap.html:55 templates/objectapp/tag_list.html:16
+#: templates/objectapp/tags/authors.html:8
+#: templates/objectapp/tags/objecttypes.html:6
+#, python-format
+msgid "%(gbobject_count)s gbobject"
+msgid_plural "%(gbobject_count)s gbobjects"
+msgstr[0] ""
+
+#: templates/objectapp/base.html:15
+msgid ""
+"You can use - to exclude words or phrases, &quot;double quotes&quot; for "
+"exact phrases and the AND/OR boolean operators combined with parenthesis for"
+" complex searchs."
+msgstr ""
+
+#: templates/objectapp/base.html:30
+msgid "Calendar"
+msgstr ""
+
+#: templates/objectapp/base.html:63
+msgid "Popular gbobjects"
+msgstr "热门日志"
+
+#: templates/objectapp/base.html:67 templates/objectapp/gbobject_archive_day.html:4
+#: templates/objectapp/gbobject_archive_day.html:6
+#: templates/objectapp/gbobject_archive_day.html:9
+#: templates/objectapp/gbobject_archive_month.html:4
+#: templates/objectapp/gbobject_archive_month.html:6
+#: templates/objectapp/gbobject_archive_month.html:9
+#: templates/objectapp/gbobject_archive_year.html:4
+#: templates/objectapp/gbobject_archive_year.html:6
+#: templates/objectapp/gbobject_archive_year.html:9
+#: templates/objectapp/tags/archives_gbobjects.html:5
+#: templates/objectapp/tags/archives_gbobjects_link.html:2
+#: templates/objectapp/tags/archives_gbobjects_tree.html:7
+#: templates/objectapp/tags/archives_gbobjects_tree.html:14
+#: templates/objectapp/tags/archives_gbobjects_tree.html:24
+msgid "Archives"
+msgstr "归档"
+
+#: templates/objectapp/base.html:72
+msgid "Tools"
+msgstr ""
+
+#: templates/objectapp/base.html:76 templates/objectapp/base.html.py:77
+msgid "Dashboard"
+msgstr ""
+
+#: templates/objectapp/base.html:83 templates/objectapp/base.html.py:84
+msgid "Post an gbobject"
+msgstr ""
+
+#: templates/objectapp/base.html:91 templates/objectapp/base.html.py:92
+msgid "Log out"
+msgstr ""
+
+#: templates/objectapp/Objecttype_list.html:4 templates/objectapp/Objecttype_list.html:9
+msgid "Objecttype list"
+msgstr "类别列表"
+
+#: templates/objectapp/gbobject_archive_month.html:13
+msgid "Daily archives"
+msgstr ""
+
+#: templates/objectapp/gbobject_archive_year.html:13
+#: templates/objectapp/sitemap.html:67
+msgid "Monthly archives"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:10
+msgid "RSS Feed of discussions on"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:11
+msgid "RSS Feed of comments on"
+msgstr "RSS 源(基于评论)"
+
+#: templates/objectapp/gbobject_detail.html:12
+msgid "RSS Feed of pingbacks on"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:13
+msgid "RSS Feed of trackbacks on"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:29
+msgid "Next gbobject"
+msgstr "下一篇"
+
+#: templates/objectapp/gbobject_detail.html:43
+msgid "Previous gbobject"
+msgstr "上一篇"
+
+#: templates/objectapp/gbobject_detail.html:56
+msgid "Related gbobjects"
+msgstr "相关日志"
+
+#: templates/objectapp/gbobject_detail.html:67
+msgid "Similar gbobjects"
+msgstr "类似日志"
+
+#: templates/objectapp/gbobject_detail.html:75
+msgid "Comments"
+msgstr "评论"
+
+#: templates/objectapp/gbobject_detail.html:117
+msgid "Pingbacks"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:139
+msgid "Pingbacks are open."
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:141
+msgid "Pingbacks are closed."
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:148
+msgid "Trackbacks"
+msgstr ""
+
+#: templates/objectapp/gbobject_detail.html:170
+msgid "Trackback URL"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "Latest gbobjects for"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the Objecttype"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the tag"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4
+msgid "the author"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:4 templates/objectapp/gbobject_search.html:6
+msgid "page"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:9 templates/objectapp/gbobject_list.html:12
+#: templates/objectapp/gbobject_list.html:15 templates/objectapp/skeleton.html:40
+msgid "RSS Feed"
+msgstr "RSS 源"
+
+#: templates/objectapp/gbobject_list.html:19
+msgid "Objecttype"
+msgstr "类别"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_list.html:30
+msgid "Tag"
+msgstr "标签"
+
+#: templates/objectapp/gbobject_list.html:19 templates/objectapp/gbobject_search.html:4
+msgid "Page"
+msgstr "页码"
+
+#: templates/objectapp/gbobject_list.html:34
+#, python-format
+msgid "Gbobjects by %(author)s"
+msgstr "作者 %(author)s 的日志"
+
+#: templates/objectapp/gbobject_list.html:45 templates/objectapp/sitemap.html:23
+#: templates/objectapp/sitemap.html.py:43
+#: templates/objectapp/cms/gbobject_detail.html:12
+#: templates/objectapp/cms/gbobject_list.html:9
+#: templates/objectapp/tags/featured_gbobjects.html:9
+#: templates/objectapp/tags/popular_gbobjects.html:13
+#: templates/objectapp/tags/random_gbobjects.html:9
+#: templates/objectapp/tags/recent_gbobjects.html:9
+msgid "No gbobjects yet."
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:51 templates/objectapp/gbobject_search.html:40
+#, python-format
+msgid "Page %(current_page)s of %(total_page)s"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:56 templates/objectapp/gbobject_search.html:45
+msgid "More recent gbobjects"
+msgstr "更多最近日志"
+
+#: templates/objectapp/gbobject_list.html:65 templates/objectapp/gbobject_search.html:54
+msgid "Gbobjects page"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:72 templates/objectapp/gbobject_search.html:61
+msgid "More old gbobjects"
+msgstr "更多以前日志"
+
+#: templates/objectapp/gbobject_list.html:82 templates/objectapp/gbobject_list.html:83
+msgid "Edit the Objecttype"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:89 templates/objectapp/gbobject_list.html:90
+msgid "Edit the tag"
+msgstr ""
+
+#: templates/objectapp/gbobject_list.html:96 templates/objectapp/gbobject_list.html:97
+msgid "Edit the author"
+msgstr ""
+
+#: templates/objectapp/gbobject_search.html:4 templates/objectapp/gbobject_search.html:6
+#: templates/objectapp/gbobject_search.html:14
+msgid "Search results for"
+msgstr ""
+
+#: templates/objectapp/gbobject_search.html:10
+msgid "RSS Feed of search result of"
+msgstr "RSS 源(基于搜索)"
+
+#: templates/objectapp/gbobject_search.html:22
+#, python-format
+msgid "%(gbobject_count)s gbobject found"
+msgid_plural "%(gbobject_count)s gbobjects found"
+msgstr[0] ""
+
+#: templates/objectapp/gbobject_search.html:34
+msgid "Nothing found."
+msgstr "没有找到"
+
+#: templates/objectapp/login.html:4 templates/objectapp/login.html.py:7
+msgid "Login required"
+msgstr ""
+
+#: templates/objectapp/login.html:12
+msgid "Your username and password didn't match. Please try again."
+msgstr ""
+
+#: templates/objectapp/login.html:16
+msgid "You need to be connected to view this gbobject."
+msgstr ""
+
+#: templates/objectapp/login.html:33
+msgid "Login"
+msgstr ""
+
+#: templates/objectapp/password.html:4 templates/objectapp/password.html.py:7
+msgid "Password required"
+msgstr ""
+
+#: templates/objectapp/password.html:12
+msgid "The password provided is not valid. Please try again."
+msgstr ""
+
+#: templates/objectapp/password.html:16
+msgid "You need to provide a password to view this gbobject."
+msgstr ""
+
+#: templates/objectapp/password.html:23
+msgid "Password"
+msgstr ""
+
+#: templates/objectapp/password.html:28
+msgid "Valid"
+msgstr ""
+
+#: templates/objectapp/sitemap.html:10
+msgid "Gbobjects per objecttypes"
+msgstr ""
+
+#: templates/objectapp/sitemap.html:18 templates/objectapp/sitemap.html.py:38
+#: templates/objectapp/tags/popular_gbobjects.html:8
+msgid "comment"
+msgstr "评论"
+
+#: templates/objectapp/sitemap.html:31
+msgid "All the gbobjects"
+msgstr ""
+
+#: templates/objectapp/sitemap.html:60 templates/objectapp/tags/objecttypes.html:11
+msgid "No objecttypes yet."
+msgstr ""
+
+#: templates/objectapp/skeleton.html:27 templates/objectapp/skeleton.html.py:39
+msgid "RSS Feed of latest gbobjects"
+msgstr ""
+
+#: templates/objectapp/tag_list.html:4 templates/objectapp/tag_list.html.py:9
+msgid "Tag list"
+msgstr "标签列表"
+
+#: templates/objectapp/wlwmanifest.xml:40
+msgid "View site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:41
+msgid "Admin. site"
+msgstr ""
+
+#: templates/objectapp/wlwmanifest.xml:53
+msgid "Manage comments"
+msgstr ""
+
+#: templates/objectapp/tags/archives_gbobjects.html:12
+#: templates/objectapp/tags/archives_gbobjects_tree.html:38
+msgid "No archives yet."
+msgstr ""
+
+#: templates/objectapp/tags/authors.html:12
+msgid "No authors yet."
+msgstr ""
+
+#: templates/objectapp/tags/recent_linkbacks.html:10
+msgid "Linkback on"
+msgstr ""
+
+#: templates/objectapp/tags/similar_gbobjects.html:9
+msgid "No similar gbobjects."
+msgstr "没有类似日志"
+
+#: tests/views.py:165 views/search.py:18
+msgid "The pattern is too short"
+msgstr "模式长度不够"
+
+#: tests/views.py:168 views/search.py:22
+msgid "No pattern to search found"
+msgstr "没有搜索到相关模式"
+
+#: xmlrpc/metaweblog.py:35
+msgid "Username is incorrect."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:37
+msgid "Password is invalid."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:39
+msgid "User account unavailable."
+msgstr ""
+
+#: xmlrpc/metaweblog.py:42
+#, python-format
+msgid "User cannot %s."
+msgstr ""
+
+#: xmlrpc/pingback.py:93
+msgid "No title"
+msgstr ""
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/management/__init__.py b/build/lib.linux-i686-2.6/objectapp/management/__init__.py
new file mode 100644
index 0000000..e207fd6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/management/__init__.py
@@ -0,0 +1 @@
+"""Management module of Objectapp"""
diff --git a/build/lib.linux-i686-2.6/objectapp/management/commands/__init__.py b/build/lib.linux-i686-2.6/objectapp/management/commands/__init__.py
new file mode 100644
index 0000000..15ffe11
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/management/commands/__init__.py
@@ -0,0 +1 @@
+"""Commands module of Objectapp"""
diff --git a/build/lib.linux-i686-2.6/objectapp/management/commands/blogger2objectapp.py b/build/lib.linux-i686-2.6/objectapp/management/commands/blogger2objectapp.py
new file mode 100644
index 0000000..1ce332b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/management/commands/blogger2objectapp.py
@@ -0,0 +1,319 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Blogger to Objectapp command module
+Based on Elijah Rutschman's code"""
+import sys
+from getpass import getpass
+from datetime import datetime
+from optparse import make_option
+
+from django.utils.encoding import smart_str
+from django.contrib.sites.models import Site
+from django.contrib.auth.models import User
+from django.template.defaultfilters import slugify
+from django.core.management.base import CommandError
+from django.core.management.base import NoArgsCommand
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.comments import get_model as get_comment_model
+
+from objectapp import __version__
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.managers import DRAFT, PUBLISHED
+
+gdata_service = None
+Comment = get_comment_model()
+
+
+class Command(NoArgsCommand):
+ """Command object for importing a Blogger blog
+ into Objectapp via Google's gdata API."""
+ help = 'Import a Blogger blog into Objectapp.'
+
+ option_list = NoArgsCommand.option_list + (
+ make_option('--blogger-username', dest='blogger_username', default='',
+ help='The username to login to Blogger with'),
+ make_option('--Objecttype-title', dest='Objecttype_title', default='',
+ help='The Objectapp Objecttype to import Blogger posts to'),
+ make_option('--blogger-blog-id', dest='blogger_blog_id', default='',
+ help='The id of the Blogger blog to import'),
+ make_option('--author', dest='author', default='',
+ help='All imported gbobjects belong to specified author')
+ )
+
+ SITE = Site.objects.get_current()
+
+ def __init__(self):
+ """Init the Command and add custom styles"""
+ super(Command, self).__init__()
+ self.style.TITLE = self.style.SQL_FIELD
+ self.style.STEP = self.style.SQL_COLTYPE
+ self.style.ITEM = self.style.HTTP_INFO
+
+ def write_out(self, message, verbosity_level=1):
+ """Convenient method for outputing"""
+ if self.verbosity and self.verbosity >= verbosity_level:
+ sys.stdout.write(smart_str(message))
+ sys.stdout.flush()
+
+ def handle_noargs(self, **options):
+ global gdata_service
+ try:
+ from gdata import service
+ gdata_service = service
+ except ImportError:
+ raise CommandError('You need to install the gdata ' \
+ 'module to run this command.')
+
+ self.verbosity = int(options.get('verbosity', 1))
+ self.blogger_username = options.get('blogger_username')
+ self.Objecttype_title = options.get('Objecttype_title')
+ self.blogger_blog_id = options.get('blogger_blog_id')
+
+ self.write_out(self.style.TITLE(
+ 'Starting migration from Blogger to Objectapp %s\n' % __version__))
+
+ if not self.blogger_username:
+ self.blogger_username = raw_input('Blogger username: ')
+ if not self.blogger_username:
+ raise CommandError('Invalid Blogger username')
+
+ self.blogger_password = getpass('Blogger password: ')
+ try:
+ self.blogger_manager = BloggerManager(self.blogger_username,
+ self.blogger_password)
+ except gdata_service.BadAuthentication:
+ raise CommandError('Incorrect Blogger username or password')
+
+ default_author = options.get('author')
+ if default_author:
+ try:
+ self.default_author = User.objects.get(username=default_author)
+ except User.DoesNotExist:
+ raise CommandError(
+ 'Invalid Objectapp username for default author "%s"' % \
+ default_author)
+ else:
+ self.default_author = User.objects.all()[0]
+
+ if not self.blogger_blog_id:
+ self.select_blog_id()
+
+ if not self.Objecttype_title:
+ self.Objecttype_title = raw_input(
+ 'Objecttype title for imported gbobjects: ')
+ if not self.Objecttype_title:
+ raise CommandError('Invalid Objecttype title')
+
+ self.import_posts()
+
+ def select_blog_id(self):
+ self.write_out(self.style.STEP('- Requesting your weblogs\n'))
+ blogs_list = [blog for blog in self.blogger_manager.get_blogs()]
+ while True:
+ i = 0
+ blogs = {}
+ for blog in blogs_list:
+ i += 1
+ blogs[i] = blog
+ self.write_out('%s. %s (%s)' % (i, blog.title.text,
+ get_blog_id(blog)))
+ try:
+ blog_index = int(raw_input('\nSelect a blog to import: '))
+ blog = blogs[blog_index]
+ break
+ except (ValueError, KeyError):
+ self.write_out(self.style.ERROR(
+ 'Please enter a valid blog number\n'))
+
+ self.blogger_blog_id = get_blog_id(blog)
+
+ def get_Objecttype(self):
+ Objecttype, created = Objecttype.objects.get_or_create(
+ title=self.Objecttype_title,
+ slug=slugify(self.Objecttype_title)[:255])
+
+ if created:
+ Objecttype.save()
+
+ return Objecttype
+
+ def import_posts(self):
+ Objecttype = self.get_Objecttype()
+ self.write_out(self.style.STEP('- Importing gbobjects\n'))
+ for post in self.blogger_manager.get_posts(self.blogger_blog_id):
+ creation_date = convert_blogger_timestamp(post.published.text)
+ status = DRAFT if is_draft(post) else PUBLISHED
+ title = post.title.text or ''
+ content = post.content.text or ''
+ slug = slugify(post.title.text or get_post_id(post))[:255]
+ try:
+ gbobject = Gbobject.objects.get(creation_date=creation_date,
+ slug=slug)
+ output = self.style.NOTICE('> Skipped %s (already migrated)\n'
+ % gbobject)
+ except Gbobject.DoesNotExist:
+ gbobject = Gbobject(status=status, title=title, content=content,
+ creation_date=creation_date, slug=slug)
+ if self.default_author:
+ gbobject.author = self.default_author
+ gbobject.tags = ','.join([slugify(cat.term) for
+ cat in post.Objecttype])
+ gbobject.last_update = convert_blogger_timestamp(
+ post.updated.text)
+ gbobject.save()
+ gbobject.sites.add(self.SITE)
+ gbobject.objecttypes.add(Objecttype)
+ gbobject.authors.add(self.default_author)
+ try:
+ self.import_comments(gbobject, post)
+ except gdata_service.RequestError:
+ # comments not available for this post
+ pass
+ output = self.style.ITEM('> Migrated %s + %s comments\n'
+ % (gbobject.title, len(Comment.objects.for_model(gbobject))))
+
+ self.write_out(output)
+
+ def import_comments(self, gbobject, post):
+ blog_id = self.blogger_blog_id
+ post_id = get_post_id(post)
+ comments = self.blogger_manager.get_comments(blog_id, post_id)
+ gbobject_content_type = ContentType.objects.get_for_model(Gbobject)
+
+ for comment in comments:
+ submit_date = convert_blogger_timestamp(comment.published.text)
+ content = comment.content.text
+
+ author = comment.author[0]
+ if author:
+ user_name = author.name.text if author.name else ''
+ user_email = author.email.text if author.email else ''
+ user_url = author.uri.text if author.uri else ''
+
+ else:
+ user_name = ''
+ user_email = ''
+ user_url = ''
+
+ com, created = Comment.objects.get_or_create(
+ content_type=gbobject_content_type,
+ object_pk=gbobject.pk,
+ comment=content,
+ submit_date=submit_date,
+ site=self.SITE,
+ user_name=user_name,
+ user_email=user_email,
+ user_url=user_url)
+
+ if created:
+ com.save()
+
+
+def convert_blogger_timestamp(timestamp):
+ # parse 2010-12-19T15:37:00.003
+ date_string = timestamp[:-6]
+ return datetime.strptime(date_string, '%Y-%m-%dT%H:%M:%S.%f')
+
+
+def is_draft(post):
+ if post.control:
+ if post.control.draft:
+ if post.control.draft.text == 'yes':
+ return True
+ return False
+
+
+def get_blog_id(blog):
+ return blog.GetSelfLink().href.split('/')[-1]
+
+
+def get_post_id(post):
+ return post.GetSelfLink().href.split('/')[-1]
+
+
+class BloggerManager(object):
+
+ def __init__(self, username, password):
+ self.service = gdata_service.GDataService(username, password)
+ self.service.server = 'www.blogger.com'
+ self.service.service = 'blogger'
+ self.service.ProgrammaticLogin()
+
+ def get_blogs(self):
+ feed = self.service.Get('/feeds/default/blogs')
+ for blog in feed.gbobject:
+ yield blog
+
+ def get_posts(self, blog_id):
+ feed = self.service.Get('/feeds/%s/posts/default' % blog_id)
+ for post in feed.gbobject:
+ yield post
+
+ def get_comments(self, blog_id, post_id):
+ feed = self.service.Get('/feeds/%s/%s/comments/default' % \
+ (blog_id, post_id))
+ for comment in feed.gbobject:
+ yield comment
diff --git a/build/lib.linux-i686-2.6/objectapp/management/commands/feed2objectapp.py b/build/lib.linux-i686-2.6/objectapp/management/commands/feed2objectapp.py
new file mode 100644
index 0000000..3a35508
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/management/commands/feed2objectapp.py
@@ -0,0 +1,209 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Feed to Objectapp command module"""
+import sys
+from datetime import datetime
+from optparse import make_option
+
+from django.utils.html import strip_tags
+from django.db.utils import IntegrityError
+from django.utils.encoding import smart_str
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.utils.text import truncate_words
+from django.template.defaultfilters import slugify
+from django.core.management.base import CommandError
+from django.core.management.base import LabelCommand
+
+from objectapp import __version__
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.managers import PUBLISHED
+from objectapp.signals import disconnect_objectapp_signals
+
+
+class Command(LabelCommand):
+ """Command object for importing a RSS or Atom
+ feed into Objectapp."""
+ help = 'Import a RSS or Atom feed into Objectapp.'
+ label = 'feed url'
+ args = 'url'
+
+ option_list = LabelCommand.option_list + (
+ make_option('--noautoexcerpt', action='store_false',
+ dest='auto_excerpt', default=True,
+ help='Do NOT generate an excerpt if not present.'),
+ make_option('--author', dest='author', default='',
+ help='All imported gbobjects belong to specified author'),
+ make_option('--Objecttype-is-tag', action='store_true',
+ dest='Objecttype-tag', default=False,
+ help='Store objecttypes as tags'),
+ )
+ SITE = Site.objects.get_current()
+
+ def __init__(self):
+ """Init the Command and add custom styles"""
+ super(Command, self).__init__()
+ self.style.TITLE = self.style.SQL_FIELD
+ self.style.STEP = self.style.SQL_COLTYPE
+ self.style.ITEM = self.style.HTTP_INFO
+ disconnect_objectapp_signals()
+
+ def write_out(self, message, verbosity_level=1):
+ """Convenient method for outputing"""
+ if self.verbosity and self.verbosity >= verbosity_level:
+ sys.stdout.write(smart_str(message))
+ sys.stdout.flush()
+
+ def handle_label(self, url, **options):
+ try:
+ import feedparser
+ except ImportError:
+ raise CommandError('You need to install the feedparser ' \
+ 'module to run this command.')
+
+ self.verbosity = int(options.get('verbosity', 1))
+ self.auto_excerpt = options.get('auto_excerpt', True)
+ self.default_author = options.get('author')
+ self.Objecttype_tag = options.get('Objecttype-tag', False)
+ if self.default_author:
+ try:
+ self.default_author = User.objects.get(
+ username=self.default_author)
+ except User.DoesNotExist:
+ raise CommandError('Invalid username for default author')
+
+ self.write_out(self.style.TITLE(
+ 'Starting importation of %s to Objectapp %s:\n' % (url, __version__)))
+
+ feed = feedparser.parse(url)
+ self.import_gbobjects(feed.gbobjects)
+
+ def import_gbobjects(self, feed_gbobjects):
+ """Import gbobjects"""
+ for feed_gbobject in feed_gbobjects:
+ self.write_out('> %s... ' % feed_gbobject.title)
+ creation_date = datetime(*feed_gbobject.date_parsed[:6])
+ slug = slugify(feed_gbobject.title)[:255]
+
+ if Gbobject.objects.filter(creation_date__year=creation_date.year,
+ creation_date__month=creation_date.month,
+ creation_date__day=creation_date.day,
+ slug=slug):
+ self.write_out(self.style.NOTICE(
+ 'SKIPPED (already imported)\n'))
+ continue
+
+ objecttypes = self.import_objecttypes(feed_gbobject)
+ gbobject_dict = {'title': feed_gbobject.title[:255],
+ 'content': feed_gbobject.description,
+ 'excerpt': feed_gbobject.get('summary'),
+ 'status': PUBLISHED,
+ 'creation_date': creation_date,
+ 'start_publication': creation_date,
+ 'last_update': datetime.now(),
+ 'slug': slug}
+
+ if not gbobject_dict['excerpt'] and self.auto_excerpt:
+ gbobject_dict['excerpt'] = truncate_words(
+ strip_tags(feed_gbobject.description), 50)
+ if self.Objecttype_tag:
+ gbobject_dict['tags'] = self.import_tags(objecttypes)
+
+ gbobject = Gbobject(**gbobject_dict)
+ gbobject.save()
+ gbobject.objecttypes.add(*objecttypes)
+ gbobject.sites.add(self.SITE)
+
+ if self.default_author:
+ gbobject.authors.add(self.default_author)
+ elif feed_gbobject.get('author_detail'):
+ try:
+ user = User.objects.create_user(
+ slugify(feed_gbobject.author_detail.get('name')),
+ feed_gbobject.author_detail.get('email', ''))
+ except IntegrityError:
+ user = User.objects.get(
+ username=slugify(feed_gbobject.author_detail.get('name')))
+ gbobject.authors.add(user)
+
+ self.write_out(self.style.ITEM('OK\n'))
+
+ def import_objecttypes(self, feed_gbobject):
+ objecttypes = []
+ for cat in feed_gbobject.get('tags', ''):
+ Objecttype, created = Objecttype.objects.get_or_create(
+ slug=slugify(cat.term), defaults={'title': cat.term})
+ objecttypes.append(Objecttype)
+ return objecttypes
+
+ def import_tags(self, objecttypes):
+ tags = []
+ for cat in objecttypes:
+ if len(cat.title.split()) > 1:
+ tags.append('"%s"' % slugify(cat.title).replace('-', ' '))
+ else:
+ tags.append(slugify(cat.title).replace('-', ' '))
+ return ', '.join(tags)
diff --git a/build/lib.linux-i686-2.6/objectapp/management/commands/objectapp2wp.py b/build/lib.linux-i686-2.6/objectapp/management/commands/objectapp2wp.py
new file mode 100644
index 0000000..1b53f17
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/management/commands/objectapp2wp.py
@@ -0,0 +1,96 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Objectapp to WordPress command module"""
+from django.conf import settings
+from django.utils.encoding import smart_str
+from django.contrib.sites.models import Site
+from django.template.loader import render_to_string
+from django.core.management.base import NoArgsCommand
+
+from tagging.models import Tag
+
+from objectapp import __version__
+from objectapp.settings import PROTOCOL
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+
+
+class Command(NoArgsCommand):
+ """Command object for exporting a Objectapp blog
+ into WordPress via a WordPress eXtended RSS (WXR) file."""
+ help = 'Export Objectapp to WXR file.'
+
+ def handle_noargs(self, **options):
+ site = Site.objects.get_current()
+ blog_context = {'gbobjects': Gbobject.objects.all(),
+ 'objecttypes': Objecttype.objects.all(),
+ 'tags': Tag.objects.usage_for_model(Gbobject),
+ 'version': __version__,
+ 'description': 'Blog exported for django-blog-objectapp',
+ 'language': settings.LANGUAGE_CODE,
+ 'site': site,
+ 'site_url': '%s://%s' % (PROTOCOL, site.domain)}
+ export = render_to_string('objectapp/wxr.xml', blog_context)
+ print smart_str(export)
diff --git a/build/lib.linux-i686-2.6/objectapp/management/commands/spam_cleanup.py b/build/lib.linux-i686-2.6/objectapp/management/commands/spam_cleanup.py
new file mode 100644
index 0000000..441fc7b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/management/commands/spam_cleanup.py
@@ -0,0 +1,72 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Spam cleanup command module for Objectapp"""
+from django.contrib import comments
+from django.contrib.contenttypes.models import ContentType
+from django.core.management.base import NoArgsCommand
+
+from objectapp.models import Gbobject
+
+
+class Command(NoArgsCommand):
+ """Command object for removing comments
+ flagged as spam"""
+ help = "Remove gbobject's comments flagged as spam."
+
+ def handle_noargs(self, **options):
+ verbosity = int(options.get('verbosity', 1))
+
+ content_type = ContentType.objects.get_for_model(Gbobject)
+ spams = comments.get_model().objects.filter(is_public=False,
+ content_type=content_type,
+ flags__flag='spam')
+ spams_count = spams.count()
+ spams.delete()
+
+ if verbosity:
+ print '%i spam comments deleted.' % spams_count
diff --git a/build/lib.linux-i686-2.6/objectapp/management/commands/wp2objectapp.py b/build/lib.linux-i686-2.6/objectapp/management/commands/wp2objectapp.py
new file mode 100644
index 0000000..5f2d42d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/management/commands/wp2objectapp.py
@@ -0,0 +1,406 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""WordPress to Objectapp command module"""
+import sys
+from datetime import datetime
+from optparse import make_option
+from xml.etree import ElementTree as ET
+
+from django.utils.html import strip_tags
+from django.db.utils import IntegrityError
+from django.utils.encoding import smart_str
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.utils.text import truncate_words
+from django.template.defaultfilters import slugify
+from django.contrib import comments
+from django.core.management.base import CommandError
+from django.core.management.base import LabelCommand
+
+from tagging.models import Tag
+
+from objectapp import __version__
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.signals import disconnect_objectapp_signals
+from objectapp.managers import DRAFT, HIDDEN, PUBLISHED
+
+WP_NS = 'http://wordpress.org/export/%s/'
+
+
+class Command(LabelCommand):
+ """Command object for importing a WordPress blog
+ into Objectapp via a WordPress eXtended RSS (WXR) file."""
+ help = 'Import a Wordpress blog into Objectapp.'
+ label = 'WXR file'
+ args = 'wordpress.xml'
+
+ option_list = LabelCommand.option_list + (
+ make_option('--noautoexcerpt', action='store_false',
+ dest='auto_excerpt', default=True,
+ help='Do NOT generate an excerpt if not present.'),
+ make_option('--author', dest='author', default='',
+ help='All imported gbobjects belong to specified author'),
+ make_option('--wxr_version', dest='wxr_version', default='1.0',
+ help='Wordpress XML export version'),
+ )
+
+ SITE = Site.objects.get_current()
+ REVERSE_STATUS = {'pending': DRAFT,
+ 'draft': DRAFT,
+ 'auto-draft': DRAFT,
+ 'inherit': DRAFT,
+ 'publish': PUBLISHED,
+ 'future': PUBLISHED,
+ 'trash': HIDDEN,
+ 'private': PUBLISHED}
+
+ def __init__(self):
+ """Init the Command and add custom styles"""
+ super(Command, self).__init__()
+ self.style.TITLE = self.style.SQL_FIELD
+ self.style.STEP = self.style.SQL_COLTYPE
+ self.style.ITEM = self.style.HTTP_INFO
+ disconnect_objectapp_signals()
+
+ def write_out(self, message, verbosity_level=1):
+ """Convenient method for outputing"""
+ if self.verbosity and self.verbosity >= verbosity_level:
+ sys.stdout.write(smart_str(message))
+ sys.stdout.flush()
+
+ def handle_label(self, wxr_file, **options):
+ global WP_NS
+ self.verbosity = int(options.get('verbosity', 1))
+ self.auto_excerpt = options.get('auto_excerpt', True)
+ WP_NS = WP_NS % options.get('wxr_version')
+ self.default_author = options.get('author')
+ if self.default_author:
+ try:
+ self.default_author = User.objects.get(
+ username=self.default_author)
+ except User.DoesNotExist:
+ raise CommandError('Invalid username for default author')
+
+ self.write_out(self.style.TITLE(
+ 'Starting migration from Wordpress to Objectapp %s:\n' % __version__))
+
+ tree = ET.parse(wxr_file)
+
+ self.authors = self.import_authors(tree)
+
+ self.objecttypes = self.import_objecttypes(
+ tree.findall('channel/{%s}Objecttype' % WP_NS))
+
+ self.import_tags(tree.findall('channel/{%s}tag' % WP_NS))
+
+ self.import_gbobjects(tree.findall('channel/item'))
+
+ def import_authors(self, tree):
+ """Retrieve all the authors used in posts
+ and convert it to new or existing user, and
+ return the convertion"""
+ self.write_out(self.style.STEP('- Importing authors\n'))
+
+ post_authors = set()
+ for item in tree.findall('channel/item'):
+ post_type = item.find('{%s}post_type' % WP_NS).text
+ if post_type == 'post':
+ post_authors.add(item.find(
+ '{http://purl.org/dc/elements/1.1/}creator').text)
+
+ self.write_out('%i authors found.\n' % len(post_authors))
+
+ authors = {}
+ for post_author in post_authors:
+ if self.default_author:
+ authors[post_author] = self.default_author
+ else:
+ authors[post_author] = self.migrate_author(post_author)
+ return authors
+
+ def migrate_author(self, author_name):
+ """Handle actions for migrating the users"""
+ action_text = "The author '%s' needs to be migrated to an User:\n"\
+ "1. Use an existing user ?\n"\
+ "2. Create a new user ?\n"\
+ "Please select a choice: " % author_name
+ while 42:
+ selection = raw_input(smart_str(action_text))
+ if selection in '12':
+ break
+ if selection == '1':
+ users = User.objects.all()
+ usernames = [user.username for user in users]
+ while 42:
+ user_text = "1. Select your user, by typing " \
+ "one of theses usernames:\n"\
+ "[%s]\n"\
+ "Please select a choice: " % ', '.join(usernames)
+ user_selected = raw_input(user_text)
+ if user_selected in usernames:
+ break
+ return users.get(username=user_selected)
+ else:
+ create_text = "2. Please type the email of the '%s' user: " % \
+ author_name
+ author_mail = raw_input(create_text)
+ try:
+ return User.objects.create_user(author_name, author_mail)
+ except IntegrityError:
+ return User.objects.get(username=author_name)
+
+ def import_objecttypes(self, Objecttype_nodes):
+ """Import all the objecttypes from 'wp:Objecttype' nodes,
+ because objecttypes in 'item' nodes are not necessarily
+ all the objecttypes and returning it in a dict for
+ database optimizations."""
+ self.write_out(self.style.STEP('- Importing objecttypes\n'))
+
+ objecttypes = {}
+ for Objecttype_node in Objecttype_nodes:
+ title = Objecttype_node.find('{%s}cat_name' % WP_NS).text[:255]
+ slug = Objecttype_node.find(
+ '{%s}Objecttype_nicename' % WP_NS).text[:255]
+ try:
+ parent = Objecttype_node.find(
+ '{%s}Objecttype_parent' % WP_NS).text[:255]
+ except TypeError:
+ parent = None
+ self.write_out('> %s... ' % title)
+ Objecttype, created = Objecttype.objects.get_or_create(
+ title=title, slug=slug, parent=objecttypes.get(parent))
+ objecttypes[title] = Objecttype
+ self.write_out(self.style.ITEM('OK\n'))
+ return objecttypes
+
+ def import_tags(self, tag_nodes):
+ """Import all the tags form 'wp:tag' nodes,
+ because tags in 'item' nodes are not necessarily
+ all the tags, then use only the nicename, because it's like
+ a slug and the true tag name may be not valid for url usage."""
+ self.write_out(self.style.STEP('- Importing tags\n'))
+ for tag_node in tag_nodes:
+ tag_name = tag_node.find(
+ '{%s}tag_slug' % WP_NS).text[:50]
+ self.write_out('> %s... ' % tag_name)
+ Tag.objects.get_or_create(name=tag_name)
+ self.write_out(self.style.ITEM('OK\n'))
+
+ def get_gbobject_tags(self, objecttypes):
+ """Return a list of gbobject's tags,
+ by using the nicename for url compatibility"""
+ tags = []
+ for Objecttype in objecttypes:
+ domain = Objecttype.attrib.get('domain', 'Objecttype')
+ if domain == 'tag' and Objecttype.attrib.get('nicename'):
+ tags.append(Objecttype.attrib.get('nicename'))
+ return tags
+
+ def get_gbobject_objecttypes(self, Objecttype_nodes):
+ """Return a list of gbobject's objecttypes
+ based of imported objecttypes"""
+ objecttypes = []
+ for Objecttype_node in Objecttype_nodes:
+ domain = Objecttype_node.attrib.get('domain')
+ if domain == 'Objecttype':
+ objecttypes.append(self.objecttypes[Objecttype_node.text])
+ return objecttypes
+
+ def import_gbobject(self, title, content, item_node):
+ """Importing an gbobject but some data are missing like
+ the image, related gbobjects, start_publication and end_publication.
+ start_publication and creation_date will use the same value,
+ wich is always in Wordpress $post->post_date"""
+ creation_date = datetime.strptime(
+ item_node.find('{%s}post_date' % WP_NS).text, '%Y-%m-%d %H:%M:%S')
+
+ excerpt = item_node.find('{%sexcerpt/}encoded' % WP_NS).text
+ if not excerpt:
+ if self.auto_excerpt:
+ excerpt = truncate_words(strip_tags(content), 50)
+ else:
+ excerpt = ''
+
+ gbobject_dict = {
+ 'content': content,
+ 'excerpt': excerpt,
+ # Prefer use this function than
+ # item_node.find('{%s}post_name' % WP_NS).text
+ # Because slug can be not well formated
+ 'slug': slugify(title)[:255] or 'post-%s' % item_node.find(
+ '{%s}post_id' % WP_NS).text,
+ 'tags': ', '.join(self.get_gbobject_tags(item_node.findall(
+ 'Objecttype'))),
+ 'status': self.REVERSE_STATUS[item_node.find(
+ '{%s}status' % WP_NS).text],
+ 'comment_enabled': item_node.find(
+ '{%s}comment_status' % WP_NS).text == 'open',
+ 'pingback_enabled': item_node.find(
+ '{%s}ping_status' % WP_NS).text == 'open',
+ 'featured': item_node.find('{%s}is_sticky' % WP_NS).text == '1',
+ 'password': item_node.find('{%s}post_password' % WP_NS).text or '',
+ 'login_required': item_node.find(
+ '{%s}status' % WP_NS).text == 'private',
+ 'creation_date': creation_date,
+ 'last_update': datetime.now(),
+ 'start_publication': creation_date}
+
+ gbobject, created = Gbobject.objects.get_or_create(title=title,
+ defaults=gbobject_dict)
+
+ gbobject.objecttypes.add(*self.get_gbobject_objecttypes(
+ item_node.findall('Objecttype')))
+ gbobject.authors.add(self.authors[item_node.find(
+ '{http://purl.org/dc/elements/1.1/}creator').text])
+ gbobject.sites.add(self.SITE)
+
+ #current_id = item_node.find('{%s}post_id' % WP_NS).text
+ #parent_id = item_node.find('%s}post_parent' % WP_NS).text
+
+ return gbobject
+
+ def import_gbobjects(self, items):
+ """Loops over items and find gbobject to import,
+ an gbobject need to have 'post_type' set to 'post' and
+ have content."""
+ self.write_out(self.style.STEP('- Importing gbobjects\n'))
+
+ for item_node in items:
+ title = (item_node.find('title').text or '')[:255]
+ post_type = item_node.find('{%s}post_type' % WP_NS).text
+ content = item_node.find(
+ '{http://purl.org/rss/1.0/modules/content/}encoded').text
+
+ if post_type == 'post' and content and title:
+ self.write_out('> %s... ' % title)
+ gbobject = self.import_gbobject(title, content, item_node)
+ self.write_out(self.style.ITEM('OK\n'))
+ self.import_comments(gbobject, item_node.findall(
+ '{%s}comment/' % WP_NS))
+ else:
+ self.write_out('> %s... ' % title, 2)
+ self.write_out(self.style.NOTICE('SKIPPED (not a post)\n'), 2)
+
+ def import_comments(self, gbobject, comment_nodes):
+ """Loops over comments nodes and import then
+ in django.contrib.comments"""
+ for comment_node in comment_nodes:
+ is_pingback = comment_node.find(
+ '{%s}comment_type' % WP_NS).text == 'pingback'
+ is_trackback = comment_node.find(
+ '{%s}comment_type' % WP_NS).text == 'trackback'
+
+ title = 'Comment #%s' % (comment_node.find(
+ '{%s}comment_id/' % WP_NS).text)
+ self.write_out(' > %s... ' % title)
+
+ content = comment_node.find(
+ '{%s}comment_content/' % WP_NS).text
+ if not content:
+ self.write_out(self.style.NOTICE('SKIPPED (unfilled)\n'))
+ return
+
+ submit_date = datetime.strptime(
+ comment_node.find('{%s}comment_date' % WP_NS).text,
+ '%Y-%m-%d %H:%M:%S')
+
+ approvation = comment_node.find(
+ '{%s}comment_approved' % WP_NS).text
+ is_public = True
+ is_removed = False
+ if approvation != '1':
+ is_removed = True
+ if approvation == 'spam':
+ is_public = False
+
+ comment_dict = {
+ 'content_object': gbobject,
+ 'site': self.SITE,
+ 'user_name': comment_node.find(
+ '{%s}comment_author/' % WP_NS).text[:50],
+ 'user_email': comment_node.find(
+ '{%s}comment_author_email/' % WP_NS).text or '',
+ 'user_url': comment_node.find(
+ '{%s}comment_author_url/' % WP_NS).text or '',
+ 'comment': content,
+ 'submit_date': submit_date,
+ 'ip_address': comment_node.find(
+ '{%s}comment_author_IP/' % WP_NS).text or '',
+ 'is_public': is_public,
+ 'is_removed': is_removed, }
+ comment = comments.get_model()(**comment_dict)
+ comment.save()
+ if approvation == 'spam':
+ comment.flags.create(
+ user=gbobject.authors.all()[0], flag='spam')
+ if is_pingback:
+ comment.flags.create(
+ user=gbobject.authors.all()[0], flag='pingback')
+ if is_trackback:
+ comment.flags.create(
+ user=gbobject.authors.all()[0], flag='trackback')
+
+ self.write_out(self.style.ITEM('OK\n'))
diff --git a/build/lib.linux-i686-2.6/objectapp/managers.py b/build/lib.linux-i686-2.6/objectapp/managers.py
new file mode 100644
index 0000000..9910581
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/managers.py
@@ -0,0 +1,146 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Managers of Objectapp"""
+from datetime import datetime
+
+from django.db import models
+from django.contrib.sites.models import Site
+
+DRAFT = 0
+HIDDEN = 1
+PUBLISHED = 2
+
+
+def tags_published():
+ """Return the published tags"""
+ from tagging.models import Tag
+ from objectapp.models import Gbobject
+ tags_gbobject_published = Tag.objects.usage_for_queryset(
+ Gbobject.published.all())
+ # Need to do that until the issue #44 of django-tagging is fixed
+ return Tag.objects.filter(name__in=[t.name for t in tags_gbobject_published])
+
+
+class AuthorPublishedManager(models.Manager):
+ """Manager to retrieve published authors"""
+
+ def get_query_set(self):
+ """Return published authors"""
+ now = datetime.now()
+ return super(AuthorPublishedManager, self).get_query_set().filter(
+ gbobjects__status=PUBLISHED,
+ gbobjects__start_publication__lte=now,
+ gbobjects__end_publication__gt=now,
+ gbobjects__sites=Site.objects.get_current()
+ ).distinct()
+
+
+def gbobjects_published(queryset):
+ """Return only the gbobjects published"""
+ now = datetime.now()
+ return queryset.filter(status=PUBLISHED,
+ start_publication__lte=now,
+ end_publication__gt=now,
+ sites=Site.objects.get_current())
+
+
+class GbobjectPublishedManager(models.Manager):
+ """Manager to retrieve published gbobjects"""
+
+ def get_query_set(self):
+ """Return published gbobjects"""
+ return gbobjects_published(
+ super(GbobjectPublishedManager, self).get_query_set())
+
+ def on_site(self):
+ """Return gbobjects published on current site"""
+ return super(GbobjectPublishedManager, self).get_query_set(
+ ).filter(sites=Site.objects.get_current())
+
+ def search(self, pattern):
+ """Top level search method on gbobjects"""
+ try:
+ return self.advanced_search(pattern)
+ except:
+ return self.basic_search(pattern)
+
+ def advanced_search(self, pattern):
+ """Advanced search on gbobjects"""
+ from objectapp.search import advanced_search
+ return advanced_search(pattern)
+
+ def basic_search(self, pattern):
+ """Basic search on gbobjects"""
+ lookup = None
+ for pattern in pattern.split():
+ query_part = models.Q(content__icontains=pattern) | \
+ models.Q(excerpt__icontains=pattern) | \
+ models.Q(title__icontains=pattern)
+ if lookup is None:
+ lookup = query_part
+ else:
+ lookup |= query_part
+
+ return self.get_query_set().filter(lookup)
diff --git a/build/lib.linux-i686-2.6/objectapp/migrations/0001_initial.py b/build/lib.linux-i686-2.6/objectapp/migrations/0001_initial.py
new file mode 100644
index 0000000..3c380ed
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/migrations/0001_initial.py
@@ -0,0 +1,459 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding model 'Gbobject'
+ db.create_table('objectapp_gbobject', (
+ ('node_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['gstudio.Node'], unique=True, primary_key=True)),
+ ('content', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
+ ('image', self.gf('django.db.models.fields.files.ImageField')(max_length=100, blank=True)),
+ ('excerpt', self.gf('django.db.models.fields.TextField')(blank=True)),
+ ('tags', self.gf('tagging.fields.TagField')()),
+ ('slug', self.gf('django.db.models.fields.SlugField')(max_length=255, db_index=True)),
+ ('status', self.gf('django.db.models.fields.IntegerField')(default=2)),
+ ('featured', self.gf('django.db.models.fields.BooleanField')(default=False)),
+ ('comment_enabled', self.gf('django.db.models.fields.BooleanField')(default=True)),
+ ('pingback_enabled', self.gf('django.db.models.fields.BooleanField')(default=True)),
+ ('creation_date', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
+ ('last_update', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
+ ('start_publication', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
+ ('end_publication', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2042, 3, 15, 0, 0))),
+ ('login_required', self.gf('django.db.models.fields.BooleanField')(default=False)),
+ ('password', self.gf('django.db.models.fields.CharField')(max_length=50, blank=True)),
+ ('template', self.gf('django.db.models.fields.CharField')(default='objectapp/gbobject_detail.html', max_length=250)),
+ ))
+ db.send_create_signal('objectapp', ['Gbobject'])
+
+ # Adding M2M table for field prior_nodes on 'Gbobject'
+ db.create_table('objectapp_gbobject_prior_nodes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('from_gbobject', models.ForeignKey(orm['objectapp.gbobject'], null=False)),
+ ('to_gbobject', models.ForeignKey(orm['objectapp.gbobject'], null=False))
+ ))
+ db.create_unique('objectapp_gbobject_prior_nodes', ['from_gbobject_id', 'to_gbobject_id'])
+
+ # Adding M2M table for field posterior_nodes on 'Gbobject'
+ db.create_table('objectapp_gbobject_posterior_nodes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('from_gbobject', models.ForeignKey(orm['objectapp.gbobject'], null=False)),
+ ('to_gbobject', models.ForeignKey(orm['objectapp.gbobject'], null=False))
+ ))
+ db.create_unique('objectapp_gbobject_posterior_nodes', ['from_gbobject_id', 'to_gbobject_id'])
+
+ # Adding M2M table for field objecttypes on 'Gbobject'
+ db.create_table('objectapp_gbobject_objecttypes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('gbobject', models.ForeignKey(orm['objectapp.gbobject'], null=False)),
+ ('nodetype', models.ForeignKey(orm['gstudio.nodetype'], null=False))
+ ))
+ db.create_unique('objectapp_gbobject_objecttypes', ['gbobject_id', 'nodetype_id'])
+
+ # Adding M2M table for field authors on 'Gbobject'
+ db.create_table('objectapp_gbobject_authors', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('gbobject', models.ForeignKey(orm['objectapp.gbobject'], null=False)),
+ ('user', models.ForeignKey(orm['auth.user'], null=False))
+ ))
+ db.create_unique('objectapp_gbobject_authors', ['gbobject_id', 'user_id'])
+
+ # Adding M2M table for field sites on 'Gbobject'
+ db.create_table('objectapp_gbobject_sites', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('gbobject', models.ForeignKey(orm['objectapp.gbobject'], null=False)),
+ ('site', models.ForeignKey(orm['sites.site'], null=False))
+ ))
+ db.create_unique('objectapp_gbobject_sites', ['gbobject_id', 'site_id'])
+
+ # Adding model 'Process'
+ db.create_table('objectapp_process', (
+ ('gbobject_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['objectapp.Gbobject'], unique=True, primary_key=True)),
+ ))
+ db.send_create_signal('objectapp', ['Process'])
+
+ # Adding M2M table for field processtypes on 'Process'
+ db.create_table('objectapp_process_processtypes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('process', models.ForeignKey(orm['objectapp.process'], null=False)),
+ ('processtype', models.ForeignKey(orm['gstudio.processtype'], null=False))
+ ))
+ db.create_unique('objectapp_process_processtypes', ['process_id', 'processtype_id'])
+
+ # Adding M2M table for field priorstate_attribute_set on 'Process'
+ db.create_table('objectapp_process_priorstate_attribute_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('process', models.ForeignKey(orm['objectapp.process'], null=False)),
+ ('attribute', models.ForeignKey(orm['gstudio.attribute'], null=False))
+ ))
+ db.create_unique('objectapp_process_priorstate_attribute_set', ['process_id', 'attribute_id'])
+
+ # Adding M2M table for field priorstate_relation_set on 'Process'
+ db.create_table('objectapp_process_priorstate_relation_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('process', models.ForeignKey(orm['objectapp.process'], null=False)),
+ ('relation', models.ForeignKey(orm['gstudio.relation'], null=False))
+ ))
+ db.create_unique('objectapp_process_priorstate_relation_set', ['process_id', 'relation_id'])
+
+ # Adding M2M table for field poststate_attribute_set on 'Process'
+ db.create_table('objectapp_process_poststate_attribute_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('process', models.ForeignKey(orm['objectapp.process'], null=False)),
+ ('attribute', models.ForeignKey(orm['gstudio.attribute'], null=False))
+ ))
+ db.create_unique('objectapp_process_poststate_attribute_set', ['process_id', 'attribute_id'])
+
+ # Adding M2M table for field poststate_relation_set on 'Process'
+ db.create_table('objectapp_process_poststate_relation_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('process', models.ForeignKey(orm['objectapp.process'], null=False)),
+ ('relation', models.ForeignKey(orm['gstudio.relation'], null=False))
+ ))
+ db.create_unique('objectapp_process_poststate_relation_set', ['process_id', 'relation_id'])
+
+ # Adding model 'System'
+ db.create_table('objectapp_system', (
+ ('gbobject_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['objectapp.Gbobject'], unique=True, primary_key=True)),
+ ))
+ db.send_create_signal('objectapp', ['System'])
+
+ # Adding M2M table for field systemtypes on 'System'
+ db.create_table('objectapp_system_systemtypes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('system', models.ForeignKey(orm['objectapp.system'], null=False)),
+ ('systemtype', models.ForeignKey(orm['gstudio.systemtype'], null=False))
+ ))
+ db.create_unique('objectapp_system_systemtypes', ['system_id', 'systemtype_id'])
+
+ # Adding M2M table for field gbobject_set on 'System'
+ db.create_table('objectapp_system_gbobject_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('system', models.ForeignKey(orm['objectapp.system'], null=False)),
+ ('gbobject', models.ForeignKey(orm['objectapp.gbobject'], null=False))
+ ))
+ db.create_unique('objectapp_system_gbobject_set', ['system_id', 'gbobject_id'])
+
+ # Adding M2M table for field relation_set on 'System'
+ db.create_table('objectapp_system_relation_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('system', models.ForeignKey(orm['objectapp.system'], null=False)),
+ ('relation', models.ForeignKey(orm['gstudio.relation'], null=False))
+ ))
+ db.create_unique('objectapp_system_relation_set', ['system_id', 'relation_id'])
+
+ # Adding M2M table for field attribute_set on 'System'
+ db.create_table('objectapp_system_attribute_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('system', models.ForeignKey(orm['objectapp.system'], null=False)),
+ ('attribute', models.ForeignKey(orm['gstudio.attribute'], null=False))
+ ))
+ db.create_unique('objectapp_system_attribute_set', ['system_id', 'attribute_id'])
+
+ # Adding M2M table for field process_set on 'System'
+ db.create_table('objectapp_system_process_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('system', models.ForeignKey(orm['objectapp.system'], null=False)),
+ ('process', models.ForeignKey(orm['objectapp.process'], null=False))
+ ))
+ db.create_unique('objectapp_system_process_set', ['system_id', 'process_id'])
+
+ # Adding M2M table for field system_set on 'System'
+ db.create_table('objectapp_system_system_set', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('from_system', models.ForeignKey(orm['objectapp.system'], null=False)),
+ ('to_system', models.ForeignKey(orm['objectapp.system'], null=False))
+ ))
+ db.create_unique('objectapp_system_system_set', ['from_system_id', 'to_system_id'])
+
+
+ def backwards(self, orm):
+
+ # Deleting model 'Gbobject'
+ db.delete_table('objectapp_gbobject')
+
+ # Removing M2M table for field prior_nodes on 'Gbobject'
+ db.delete_table('objectapp_gbobject_prior_nodes')
+
+ # Removing M2M table for field posterior_nodes on 'Gbobject'
+ db.delete_table('objectapp_gbobject_posterior_nodes')
+
+ # Removing M2M table for field objecttypes on 'Gbobject'
+ db.delete_table('objectapp_gbobject_objecttypes')
+
+ # Removing M2M table for field authors on 'Gbobject'
+ db.delete_table('objectapp_gbobject_authors')
+
+ # Removing M2M table for field sites on 'Gbobject'
+ db.delete_table('objectapp_gbobject_sites')
+
+ # Deleting model 'Process'
+ db.delete_table('objectapp_process')
+
+ # Removing M2M table for field processtypes on 'Process'
+ db.delete_table('objectapp_process_processtypes')
+
+ # Removing M2M table for field priorstate_attribute_set on 'Process'
+ db.delete_table('objectapp_process_priorstate_attribute_set')
+
+ # Removing M2M table for field priorstate_relation_set on 'Process'
+ db.delete_table('objectapp_process_priorstate_relation_set')
+
+ # Removing M2M table for field poststate_attribute_set on 'Process'
+ db.delete_table('objectapp_process_poststate_attribute_set')
+
+ # Removing M2M table for field poststate_relation_set on 'Process'
+ db.delete_table('objectapp_process_poststate_relation_set')
+
+ # Deleting model 'System'
+ db.delete_table('objectapp_system')
+
+ # Removing M2M table for field systemtypes on 'System'
+ db.delete_table('objectapp_system_systemtypes')
+
+ # Removing M2M table for field gbobject_set on 'System'
+ db.delete_table('objectapp_system_gbobject_set')
+
+ # Removing M2M table for field relation_set on 'System'
+ db.delete_table('objectapp_system_relation_set')
+
+ # Removing M2M table for field attribute_set on 'System'
+ db.delete_table('objectapp_system_attribute_set')
+
+ # Removing M2M table for field process_set on 'System'
+ db.delete_table('objectapp_system_process_set')
+
+ # Removing M2M table for field system_set on 'System'
+ db.delete_table('objectapp_system_system_set')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'gstudio.attribute': {
+ 'Meta': {'unique_together': "(('subject_scope', 'subject', 'attributetype_scope', 'attributetype', 'value_scope', 'svalue'),)", 'object_name': 'Attribute', '_ormbases': ['gstudio.Edge']},
+ 'attributetype': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gstudio.Attributetype']"}),
+ 'attributetype_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'edge_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Edge']", 'unique': 'True', 'primary_key': 'True'}),
+ 'subject': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subject_of'", 'to': "orm['gstudio.NID']"}),
+ 'subject_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'svalue': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'value_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'})
+ },
+ 'gstudio.attributetype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Attributetype', '_ormbases': ['gstudio.Nodetype']},
+ 'applicable_nodetypes': ('django.db.models.fields.CharField', [], {'default': "'OT'", 'max_length': '2'}),
+ 'auto_now': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'auto_now_add': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'blank': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'dataType': ('django.db.models.fields.CharField', [], {'default': "'01'", 'max_length': '2'}),
+ 'decimal_places': ('django.db.models.fields.IntegerField', [], {'max_length': '2', 'null': 'True', 'blank': 'True'}),
+ 'default': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'editable': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'help_text': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'max_digits': ('django.db.models.fields.IntegerField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}),
+ 'min_length': ('django.db.models.fields.IntegerField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
+ 'nodetype_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Nodetype']", 'unique': 'True', 'primary_key': 'True'}),
+ 'null': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'path': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'required': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'subjecttype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subjecttype_of'", 'to': "orm['gstudio.NID']"}),
+ 'unique': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'upload_to': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'validators': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'validators_rel_+'", 'null': 'True', 'to': "orm['gstudio.Attributetype']"}),
+ 'verbose_name': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'verify_exists': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'gstudio.edge': {
+ 'Meta': {'object_name': 'Edge', '_ormbases': ['gstudio.NID']},
+ 'nid_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.NID']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ 'gstudio.metatype': {
+ 'Meta': {'ordering': "['title']", 'object_name': 'Metatype', '_ormbases': ['gstudio.Node']},
+ 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Node']", 'unique': 'True', 'primary_key': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['gstudio.Metatype']"}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'gstudio.nid': {
+ 'Meta': {'object_name': 'NID'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ },
+ 'gstudio.node': {
+ 'Meta': {'object_name': 'Node', '_ormbases': ['gstudio.NID']},
+ 'altnames': ('tagging.fields.TagField', [], {'null': 'True'}),
+ 'nid_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.NID']", 'unique': 'True', 'primary_key': 'True'}),
+ 'plural': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'rating_score': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+ 'rating_votes': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'blank': 'True'})
+ },
+ 'gstudio.nodetype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Nodetype', '_ormbases': ['gstudio.Node']},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'nodetypes'", 'blank': 'True', 'to': "orm['auth.User']"}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'login_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'metatypes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'member_types'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Metatype']"}),
+ 'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Node']", 'unique': 'True', 'primary_key': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'pingback_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'posterior_nodes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'posterior_nodes_rel_+'", 'null': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'prior_nodes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'prior_nodes_rel_+'", 'null': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'nodetypes'", 'symmetrical': 'False', 'to': "orm['sites.Site']"}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'template': ('django.db.models.fields.CharField', [], {'default': "'gstudio/nodetype_detail.html'", 'max_length': '250'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'gstudio.processtype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Processtype', '_ormbases': ['gstudio.Nodetype']},
+ 'changing_attributetype_set': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "' changing_attributetype_set_of'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Attributetype']"}),
+ 'changing_relationtype_set': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'changing_relationtype_set_of'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Relationtype']"}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'nodetype_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Nodetype']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ 'gstudio.relation': {
+ 'Meta': {'unique_together': "(('left_subject_scope', 'left_subject', 'relationtype_scope', 'relationtype', 'right_subject_scope', 'right_subject'),)", 'object_name': 'Relation', '_ormbases': ['gstudio.Edge']},
+ 'edge_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Edge']", 'unique': 'True', 'primary_key': 'True'}),
+ 'left_subject': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'left_subject_of'", 'to': "orm['gstudio.NID']"}),
+ 'left_subject_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'relationtype': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['gstudio.Relationtype']"}),
+ 'relationtype_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'right_subject': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'right_subject_of'", 'to': "orm['gstudio.NID']"}),
+ 'right_subject_scope': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'})
+ },
+ 'gstudio.relationtype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Relationtype', '_ormbases': ['gstudio.Nodetype']},
+ 'inverse': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'is_reflexive': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'is_symmetrical': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'is_transitive': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
+ 'left_applicable_nodetypes': ('django.db.models.fields.CharField', [], {'default': "'OT'", 'max_length': '2'}),
+ 'left_cardinality': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'left_subjecttype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'left_subjecttype_of'", 'to': "orm['gstudio.NID']"}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'nodetype_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Nodetype']", 'unique': 'True', 'primary_key': 'True'}),
+ 'right_applicable_nodetypes': ('django.db.models.fields.CharField', [], {'default': "'OT'", 'max_length': '2'}),
+ 'right_cardinality': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'right_subjecttype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'right_subjecttype_of'", 'to': "orm['gstudio.NID']"})
+ },
+ 'gstudio.systemtype': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Systemtype', '_ormbases': ['gstudio.Nodetype']},
+ 'attributetype_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'attributetype_set_of'", 'blank': 'True', 'to': "orm['gstudio.Attributetype']"}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'metatype_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'metatype_set_of'", 'blank': 'True', 'to': "orm['gstudio.Metatype']"}),
+ 'nodetype_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Nodetype']", 'unique': 'True', 'primary_key': 'True'}),
+ 'nodetype_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'nodetype_set_of'", 'blank': 'True', 'to': "orm['gstudio.Nodetype']"}),
+ 'processtype_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'processtype_set_of'", 'blank': 'True', 'to': "orm['gstudio.Processtype']"}),
+ 'relationtype_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'relationtype_set_of'", 'blank': 'True', 'to': "orm['gstudio.Relationtype']"})
+ },
+ 'objectapp.gbobject': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Gbobject', '_ormbases': ['gstudio.Node']},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'gbobjects'", 'blank': 'True', 'to': "orm['auth.User']"}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'login_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['gstudio.Node']", 'unique': 'True', 'primary_key': 'True'}),
+ 'objecttypes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'member_objects'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Nodetype']"}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'pingback_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'posterior_nodes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'posterior_nodes_rel_+'", 'null': 'True', 'to': "orm['objectapp.Gbobject']"}),
+ 'prior_nodes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'prior_nodes_rel_+'", 'null': 'True', 'to': "orm['objectapp.Gbobject']"}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'gbobjects'", 'symmetrical': 'False', 'to': "orm['sites.Site']"}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'template': ('django.db.models.fields.CharField', [], {'default': "'objectapp/gbobject_detail.html'", 'max_length': '250'})
+ },
+ 'objectapp.process': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Process', '_ormbases': ['objectapp.Gbobject']},
+ 'gbobject_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['objectapp.Gbobject']", 'unique': 'True', 'primary_key': 'True'}),
+ 'poststate_attribute_set': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'in_post_state_attrset_of'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Attribute']"}),
+ 'poststate_relation_set': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'in_post_state_relset_of'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Relation']"}),
+ 'priorstate_attribute_set': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'in_prior_state_attrset_of'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Attribute']"}),
+ 'priorstate_relation_set': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'in_prior_state_relset_of'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Relation']"}),
+ 'processtypes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'member_processes'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Processtype']"})
+ },
+ 'objectapp.system': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'System', '_ormbases': ['objectapp.Gbobject']},
+ 'attribute_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'in_attribute_set_of'", 'blank': 'True', 'to': "orm['gstudio.Attribute']"}),
+ 'gbobject_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['objectapp.Gbobject']", 'unique': 'True', 'primary_key': 'True'}),
+ 'gbobject_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'in_gbobject_set_of'", 'blank': 'True', 'to': "orm['objectapp.Gbobject']"}),
+ 'process_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'in_process_set_of'", 'blank': 'True', 'to': "orm['objectapp.Process']"}),
+ 'relation_set': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'in_relation_set_of'", 'blank': 'True', 'to': "orm['gstudio.Relation']"}),
+ 'system_set': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'system_set_rel_+'", 'blank': 'True', 'to': "orm['objectapp.System']"}),
+ 'systemtypes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'member_systems'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['gstudio.Systemtype']"})
+ },
+ 'sites.site': {
+ 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ }
+ }
+
+ complete_apps = ['objectapp']
diff --git a/build/lib.linux-i686-2.6/objectapp/migrations/__init__.py b/build/lib.linux-i686-2.6/objectapp/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/migrations/__init__.py
diff --git a/build/lib.linux-i686-2.6/objectapp/models.py b/build/lib.linux-i686-2.6/objectapp/models.py
new file mode 100644
index 0000000..cc8a9ee
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/models.py
@@ -0,0 +1,754 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Models of Objectapp"""
+import warnings
+from datetime import datetime
+
+from django.db import models
+from django.db.models import Q
+from django.utils.html import strip_tags
+from django.utils.html import linebreaks
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.db.models.signals import post_save
+from django.utils.importlib import import_module
+from django.contrib import comments
+from django.contrib.comments.models import CommentFlag
+from django.contrib.comments.moderation import moderator
+from django.utils.translation import ugettext_lazy as _
+import json
+from django.contrib.markup.templatetags.markup import markdown
+from django.contrib.markup.templatetags.markup import textile
+from django.contrib.markup.templatetags.markup import restructuredtext
+
+
+from djangoratings.fields import RatingField
+from tagging.fields import TagField
+from gstudio.models import Nodetype
+from gstudio.models import Objecttype
+from gstudio.models import Relationtype
+from gstudio.models import Systemtype
+from gstudio.models import Processtype
+from gstudio.models import Attributetype
+from gstudio.models import Attribute
+from gstudio.models import Relation
+from gstudio.models import Node
+from gstudio.models import Edge
+from gstudio.models import Author
+
+import reversion
+from objectapp.settings import UPLOAD_TO
+from objectapp.settings import MARKUP_LANGUAGE
+from objectapp.settings import GBOBJECT_TEMPLATES
+from objectapp.settings import GBOBJECT_BASE_MODEL
+from objectapp.settings import MARKDOWN_EXTENSIONS
+from objectapp.settings import AUTO_CLOSE_COMMENTS_AFTER
+from objectapp.managers import gbobjects_published
+from objectapp.managers import GbobjectPublishedManager
+from objectapp.managers import AuthorPublishedManager
+from objectapp.managers import DRAFT, HIDDEN, PUBLISHED
+from objectapp.moderator import GbobjectCommentModerator
+from objectapp.url_shortener import get_url_shortener
+from objectapp.signals import ping_directories_handler
+from objectapp.signals import ping_external_urls_handler
+
+'''
+class Author(User):
+ """Proxy Model around User"""
+
+ objects = models.Manager()
+ published = AuthorPublishedManager()
+
+ def gbobjects_published(self):
+ """Return only the gbobjects published"""
+ return gbobjects_published(self.gbobjects)
+
+ #@models.permalink
+ def get_absolute_url(self):
+ """Return author's URL"""
+ return "/authors/%s/" %(self.username)
+ #return ('objectapp_author_detail', (self.username,))
+
+ class Meta:
+ """Author's Meta"""
+ proxy = True
+'''
+
+
+class Gbobject(Node):
+ """
+ Member nodes of object types. This is actually to be named the
+ Object class, since 'Object' is a reserved name in Python, we
+ prefix this with 'Gb', to suggest that it is an object of the gnowledge
+ base. System and Process classes also inherit this class.
+ """
+
+
+ STATUS_CHOICES = ((DRAFT, _('draft')),
+ (HIDDEN, _('hidden')),
+ (PUBLISHED, _('published')))
+
+ content = models.TextField(_('content'), null=True, blank=True)
+ content_org = models.TextField(_('content'), null=True, blank=True)
+ image = models.ImageField(_('image'), upload_to=UPLOAD_TO,
+ blank=True, help_text=_('used for illustration'))
+
+ excerpt = models.TextField(_('excerpt'), blank=True,
+ help_text=_('optional element'))
+
+ prior_nodes = models.ManyToManyField('self', null=True, blank=True,
+ verbose_name=_('depends on'),
+ related_name='posterior_nodes')
+
+ posterior_nodes = models.ManyToManyField('self', null=True, blank=True,
+ verbose_name=_('required for'),
+ related_name='prior_nodes')
+
+
+ tags = TagField(_('tags'))
+ objecttypes = models.ManyToManyField(Nodetype, verbose_name=_('member of'),
+ related_name='member_objects',
+ blank=True, null=True)
+
+
+ authors = models.ManyToManyField(User, verbose_name=_('authors'),
+ related_name='gbobjects',
+ blank=True, null=False)
+ status = models.IntegerField(choices=STATUS_CHOICES, default=PUBLISHED)
+
+ featured = models.BooleanField(_('featured'), default=False)
+ comment_enabled = models.BooleanField(_('comment enabled'), default=True)
+ pingback_enabled = models.BooleanField(_('linkback enabled'), default=True)
+
+
+ start_publication = models.DateTimeField(_('start publication'),
+ help_text=_('date start publish'),
+ default=datetime.now)
+ end_publication = models.DateTimeField(_('end publication'),
+ help_text=_('date end publish'),
+ default=datetime(2042, 3, 15))
+
+ sites = models.ManyToManyField(Site, verbose_name=_('sites publication'),
+ related_name='gbobjects')
+
+ login_required = models.BooleanField(
+ _('login required'), default=False,
+ help_text=_('only authenticated users can view the gbobject'))
+ password = models.CharField(
+ _('password'), max_length=50, blank=True,
+ help_text=_('protect the gbobject with a password'))
+
+ template = models.CharField(
+ _('template'), max_length=250,
+ default='objectapp/gbobject_detail.html',
+ choices=[('objectapp/gbobject_detail.html', _('Default template'))] + \
+ GBOBJECT_TEMPLATES,
+ help_text=_('template used to display the gbobject'))
+ rurl=models.URLField(_('rurl'),verify_exists=True,null=True, blank=True)
+ objects = models.Manager()
+ published = GbobjectPublishedManager()
+
+
+ def get_relations(self):
+ relation_set = {}
+ # ALGO to find the relations and their left-subjecttypes and right_subjecttypes
+ # 1. Get the relations containing a reference to the object. Retrieve where it occurs (left or right)
+ # 2. Find out which RT they come from.
+ # 3. For each RT, create a dict key and a value as a dict. And add the relation as a new key-value pair (rid:subject).
+ # 4. If self is in right value, then add inverse relation as RT and add the relation as a new key-value pair (rid:subject).
+
+ left_relset = Relation.objects.filter(left_subject=self.id)
+ right_relset = Relation.objects.filter(right_subject=self.id)
+
+ #return left_relset + right_relset
+
+ # RT dictionary to store a single relation
+ rel_dict ={}
+ rel_dict['left-subjecttypes'] = {}
+ rel_dict['right_subjecttypes'] ={}
+
+
+ for relation in left_relset:
+ # check if relation already exists
+ if relation.relationtype.title not in rel_dict['left-subjecttypes'].keys():
+ # create a new list field and add to it
+ rel_dict['left-subjecttypes'][str(relation.relationtype.title)] = []
+ # add
+ rel_dict['left-subjecttypes'][str(relation.relationtype.title)].append(relation)
+
+ for relation in right_relset:
+ # check if relation exists
+ if relation.relationtype.inverse not in rel_dict['right_subjecttypes'].keys():
+ # create a new list key field and add to it
+ rel_dict['right_subjecttypes'][str(relation.relationtype.inverse)] = []
+ # add to the existing key
+ rel_dict['right_subjecttypes'][str(relation.relationtype.inverse)].append(relation)
+
+ relation_set.update(rel_dict['left-subjecttypes'])
+ relation_set.update(rel_dict['right_subjecttypes'])
+
+ return relation_set
+
+
+ def get_attributes(self):
+ attributes_dict = {}
+ all_attributes=self.subject_of.all()
+ for attributes in all_attributes:
+ val=[]
+ atr_key=attributes.attributetype.title
+ val.append(attributes.svalue)
+
+ if attributes_dict:
+ fl=0
+ itms=attributes_dict
+
+ for key,value in itms.items():
+ if atr_key in key:
+ fl=1
+ if type(value) <> list:
+ t=[]
+ t.append(value)
+ val.extend(t)
+
+ else:
+
+ val.extend(value)
+
+ attributes_dict[atr_key]=val
+
+ return attributes_dict
+
+
+
+ def get_possible_rels(self):
+ """
+ Gets the relations possible for this metatype
+ 1. Recursively create a set of all the ancestors i.e. parent/subtypes of the MT.
+ 2. Get all the R's linked to each ancestor
+ """
+ #Step 1.
+ ancestor_list = []
+ this_parent = self.parent
+
+ # append
+ while this_parent:
+ ancestor_list.append(this_parent)
+ this_parent = this_parent.parent
+
+ #Step 2.
+ rels = {}
+ rt_set = Relation.objects.all()
+ right_subset = []
+ left_subset = []
+
+ for each in ancestor_list:
+ # retrieve all the RT's from each ancestor
+ right_subset.extend(rt_set.filter(subject1=each.id))
+ left_subset.extend(rt_set.filter(subject2=each.id))
+
+ rels['possible_leftroles'] = left_subset
+ rels['possible_rightroles'] = right_subset
+
+ return rels
+
+
+ def get_possible_attributes(self):
+ """
+ Gets the relations possible for this metatype
+ 1. Recursively create a set of all the ancestors i.e. parent/subtypes of the MT.
+ 2. Get all the RT's linked to each ancestor
+ """
+ #Step 1.
+ ancestor_list = []
+ this_parent = self.parent
+
+ # recursive thru parent field and append
+ while this_parent:
+ ancestor_list.append(this_parent)
+ this_parent = this_parent.parent
+
+ #Step 2.
+ attrs = []
+
+ for each in ancestor_list:
+ # retrieve all the AT's from each ancestor
+ attrs.extend(Attribute.objects.filter(subject=each.id))
+
+ return attrs
+
+
+
+
+ @property
+ def get_nbh(self):
+ """
+ Returns the neighbourhood of the object
+ """
+ fields = ['title','altname','pluralform']
+ nbh = {}
+ nbh['title'] = self.title
+ nbh['altnames'] = self.altnames
+ nbh['plural'] = self.plural
+ nbh['content'] = self.content
+ #return all OTs the object is linked to
+ nbh['member_of'] = self.objecttypes.all()
+
+ # get all the relations of the object
+ nbh.update(self.get_relations())
+ nbh.update(self.get_attributes())
+ # encapsulate the dictionary with its node name as key
+ return nbh
+
+
+ def get_graph_json(self):
+
+
+ # predicate_id={"plural":"a1","altnames":"a2","contains_members":"a3","contains_subtypes":"a4","prior_nodes":"a5", "posterior_nodes":"a6"}
+ g_json = {}
+ g_json["node_metadata"]= []
+
+
+ nbh = self.get_nbh
+ predicate_id = {}
+ counter = 1
+ for key in nbh.keys():
+ val = "a" + str(counter)
+ predicate_id[key] = val
+ counter = counter + 1
+ #print predicate_id
+
+ attr_counter = -1
+
+ this_node = {"_id":str(self.id),"title":self.title,"screen_name":self.title, "url":self.get_absolute_url()}
+ g_json["node_metadata"].append(this_node)
+
+ for key in predicate_id.keys():
+ if nbh[key]:
+ try:
+ g_json[str(key)]=[]
+ g_json["node_metadata"].append({"_id":str(predicate_id[key]),"screen_name":key})
+ g_json[str(key)].append({"from":self.id , "to":predicate_id[key],"value":1, "level":1 })
+ if not isinstance(nbh[key],basestring):
+ for item in nbh[key]:
+ # user
+ g_json["node_metadata"].append({"_id":str(item.id),"screen_name":item.title, "title":item.title, "url":item.get_absolute_url()})
+ g_json[str(key)].append({"from":predicate_id[key] , "to":item.id ,"value":1 })
+
+ else:
+ #value={nbh["plural"]:"a4",nbh["altnames"]:"a5"}
+ #this_node[str(key)]=nbh[key] key, nbh[key]
+ #for item in value.keys():
+ g_json["node_metadata"].append({"_id":attr_counter,"screen_name":nbh[key]})
+ g_json[str(key)].append({"from":predicate_id[key] , "to":attr_counter ,"value":1, "level":2 })
+ attr_counter-=1
+
+ except:
+ pass
+ print g_json
+ return json.dumps(g_json)
+
+
+ @property
+ def get_relations1(self):
+ """
+ Returns all the relations of the nodetype
+ """
+ relations={}
+ reltype={}
+ left_relations=Relation.objects.filter(left_subject=self.id)
+ if left_relations:
+ for each in left_relations:
+ relation=each.relationtype.title
+ predicate=each.right_subject
+ predicate_values=[]
+ if reltype:
+ fl=0
+ for key,value in reltype.items():
+ if type(value) <> list:
+ t=[]
+ t.append(value)
+ predicate_values=t
+ else:
+ predicate_values=value
+ if each.relationtype.title==key:
+ fl=1
+ predicate_values.append(predicate)
+ reltype[key]=predicate_values
+ if fl==0:
+ predicate_values=predicate
+ reltype[relation]=predicate_values
+ else:
+ predicate_values.append(predicate)
+ reltype[relation]=predicate_values
+ relations['lrelations']=reltype
+
+ right_relations=Relation.objects.filter(right_subject=self.id)
+ reltype={}
+ if right_relations:
+ for each in right_relations:
+ relation=each.relationtype.inverse
+ predicate=each.left_subject
+ predicate_values=[]
+ if reltype:
+ fl=0
+ for key,value in reltype.items():
+ if type(value) <> list:
+ t=[]
+ t.append(value)
+ prdicate_values=t
+ else:
+ predicate_values=value
+ if each.relationtype.inverse==key:
+ fl=1
+ predicate_values.append(predicate)
+ reltype[key]=predicate_values
+
+ if fl==0:
+ predicate_values=predicate
+ reltype[relation]=predicate_values
+
+ else:
+ predicate_values.append(predicate)
+ reltype[relation]=predicate_values
+ relations['rrelations']=reltype
+ return relations
+ @property
+ def get_rendered_nbh(self):
+ """
+ Returns the neighbourhood of the object
+ """
+ fields = ['title','altname','pluralform']
+ nbh = {}
+ nbh['title'] = self.title
+ nbh['altnames'] = self.altnames
+ nbh['plural']=self.plural
+ nbh['content'] = self.content
+ #return all OTs the object is linked to
+ member_of_dict = {}
+ for each in self.objecttypes.all():
+ member_of_dict[each.title]= each.get_absolute_url()
+ nbh['member_of']=member_of_dict
+
+ pnode_dict = {}
+ for each in self.prior_nodes.all():
+ pnode_dict[each.title]= each.get_absolute_url()
+ nbh['priornodes']=pnode_dict
+
+ pnode_dict = {}
+ for each in self.posterior_nodes.all():
+ pnode_dict[each.title]= each.get_absolute_url()
+ nbh['posteriornodes']=pnode_dict
+
+ #get Relations
+ relns={}
+ rellft={}
+ relrgt={}
+ if self.get_relations1:
+ NTrelns=self.get_relations1
+ for key,value in NTrelns.items():
+ if key=="rrelations":
+ relrgt={}
+ for rgtkey,rgtvalue in value.items():
+ relnvalue={}
+ if isinstance(rgtvalue,list):
+ for items in rgtvalue:
+ relnvalue[items]=items.get_absolute_url()
+ else:
+ relnvalue[rgtvalue]=rgtvalue.get_absolute_url()
+
+ relrgt[rgtkey]=relnvalue
+
+ else:
+ rellft={}
+ relns['left']=rellft
+ for lftkey,lftvalue in value.items():
+ relnvalue={}
+ if isinstance(lftvalue,list):
+ for items in lftvalue:
+ relnvalue[items]=items.get_absolute_url()
+ else:
+ relnvalue[lftvalue]=lftvalue.get_absolute_url()
+
+ rellft[lftkey]=relnvalue
+
+ nbh['relations']=relrgt
+ nbh['relations'].update(rellft)
+
+
+ #get Attributes
+ attributes =self.get_attributes()
+ nbh['attributes']=attributes
+ return nbh
+
+
+
+ @property
+ def html_content(self):
+ """Return the content correctly formatted"""
+ if MARKUP_LANGUAGE == 'markdown':
+ return markdown(self.content, MARKDOWN_EXTENSIONS)
+ elif MARKUP_LANGUAGE == 'textile':
+ return textile(self.content)
+ elif MARKUP_LANGUAGE == 'restructuredtext':
+ return restructuredtext(self.content)
+ elif not '</p>' in self.content:
+ return linebreaks(self.content)
+ return self.content
+
+
+ @property
+ def previous_gbobject(self):
+ """Return the previous gbobject"""
+ gbobjects = Gbobject.published.filter(
+ creation_date__lt=self.creation_date)[:1]
+ if gbobjects:
+ return gbobjects[0]
+
+ @property
+ def next_gbobject(self):
+ """Return the next gbobject"""
+ gbobjects = Gbobject.published.filter(
+ creation_date__gt=self.creation_date).order_by('creation_date')[:1]
+ if gbobjects:
+ return gbobjects[0]
+
+ @property
+ def word_count(self):
+ """Count the words of an gbobject"""
+ return len(strip_tags(self.html_content).split())
+
+ @property
+ def is_actual(self):
+ """Check if an gbobject is within publication period"""
+ now = datetime.now()
+ return now >= self.start_publication and now < self.end_publication
+
+ @property
+ def is_visible(self):
+ """Check if an gbobject is visible on site"""
+ return self.is_actual and self.status == PUBLISHED
+
+ @property
+ def related_published(self):
+ """Return only related gbobjects published"""
+ return gbobjects_published(self.related)
+
+ @property
+ def discussions(self):
+ """Return published discussions"""
+ return comments.get_model().objects.for_model(
+ self).filter(is_public=True)
+
+ @property
+ def comments(self):
+ """Return published comments"""
+ return self.discussions.filter(Q(flags=None) | Q(
+ flags__flag=CommentFlag.MODERATOR_APPROVAL))
+
+ @property
+ def pingbacks(self):
+ """Return published pingbacks"""
+ return self.discussions.filter(flags__flag='pingback')
+
+ @property
+ def trackbacks(self):
+ """Return published trackbacks"""
+ return self.discussions.filter(flags__flag='trackback')
+
+ @property
+ def comments_are_open(self):
+ """Check if comments are open"""
+ if AUTO_CLOSE_COMMENTS_AFTER and self.comment_enabled:
+ return (datetime.now() - self.start_publication).days < \
+ AUTO_CLOSE_COMMENTS_AFTER
+ return self.comment_enabled
+
+ @property
+ def short_url(self):
+ """Return the gbobject's short url"""
+ return get_url_shortener()(self)
+
+ def __unicode__(self):
+ return self.title
+
+ @property
+ def memberof_sentence(self):
+ """Return the objecttype of which the gbobject is a member of"""
+
+ if self.objecttypes.count:
+ for each in self.objecttypes.all():
+ return '%s is a member of objecttype %s' % (self.title, each)
+ return '%s is not a fully defined name, consider making it a member of a suitable objecttype' % (self.title)
+
+
+ @models.permalink
+ def get_absolute_url(self):
+ """Return gbobject's URL"""
+ return ('objectapp_gbobject_detail', (), {
+ 'year': self.creation_date.strftime('%Y'),
+ 'month': self.creation_date.strftime('%m'),
+ 'day': self.creation_date.strftime('%d'),
+ 'slug': self.slug})
+
+ class Meta:
+ """Gbobject's Meta"""
+ ordering = ['-creation_date']
+ verbose_name = _('object')
+ verbose_name_plural = _('objects')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+
+class Process(Gbobject):
+
+ """
+ A store processes, events or changes described as changes in attributes and relations
+ """
+ processtypes = models.ManyToManyField(Processtype, verbose_name=_('member of process type'),
+ related_name='member_processes',
+ blank=True, null=True)
+ priorstate_attribute_set = models.ManyToManyField(Attribute, null=True, blank=True,
+ verbose_name=_('in prior state attribute set of'),
+ related_name='in_prior_state_attrset_of')
+ priorstate_relation_set = models.ManyToManyField(Relation, null=True, blank=True,
+ verbose_name=_('priorsate of relation set'),
+ related_name='in_prior_state_relset_of')
+
+ poststate_attribute_set = models.ManyToManyField(Attribute, null=True, blank=True,
+ verbose_name=_('poststate of attribute set'),
+ related_name='in_post_state_attrset_of')
+
+ poststate_relation_set = models.ManyToManyField(Relation, null=True, blank=True,
+ verbose_name=_('in poststate of relation set'),
+ related_name='in_post_state_relset_of')
+
+
+
+
+ def __unicode__(self):
+ return self.title
+
+ class Meta:
+ verbose_name = _('process')
+ verbose_name_plural = _('processes')
+ permissions = (('can_view_all', 'Can view all'),
+ ('can_change_author', 'Can change author'), )
+
+
+class System(Gbobject):
+
+ """
+ instance of a Systemtype
+ """
+
+ systemtypes = models.ManyToManyField(Systemtype, verbose_name=_('member of systemtype'),
+ related_name='member_systems',
+ blank=True, null=True)
+
+ gbobject_set = models.ManyToManyField(Gbobject, related_name="in_gbobject_set_of",
+ verbose_name='objects in the system',
+ blank=True, null=False)
+
+ relation_set = models.ManyToManyField(Relation, related_name="in_relation_set_of",
+ verbose_name='relations in the system',
+ blank=True, null=False)
+
+ attribute_set = models.ManyToManyField(Attribute, related_name="in_attribute_set_of",
+ verbose_name='attributes in the system',
+ blank=True, null=False)
+
+ process_set = models.ManyToManyField(Process, related_name="in_process_set_of",
+ verbose_name='processes in the system',
+ blank=True, null=False)
+
+ system_set = models.ManyToManyField('self', related_name="in_system_set_of",
+ verbose_name='nested systems',
+ blank=True, null=False)
+
+
+ def __unicode__(self):
+ return self.title
+
+
+
+if not reversion.is_registered(Process):
+ reversion.register(Process, follow=["priorstate_attribute_set", "priorstate_relation_set", "poststate_attribute_set", "poststate_relation_set", "prior_nodes", "posterior_nodes"])
+
+if not reversion.is_registered(System):
+ reversion.register(System, follow=["systemtypes", "gbobject_set", "relation_set", "attribute_set", "process_set", "system_set", "prior_nodes", "posterior_nodes"])
+
+if not reversion.is_registered(Gbobject):
+ reversion.register(Gbobject, follow=["objecttypes", "prior_nodes", "posterior_nodes"])
+
+
+moderator.register(Gbobject, GbobjectCommentModerator)
+
+post_save.connect(ping_directories_handler, sender=Gbobject,
+ dispatch_uid='objectapp.gbobject.post_save.ping_directories')
+post_save.connect(ping_external_urls_handler, sender=Gbobject,
+ dispatch_uid='objectapp.gbobject.post_save.ping_external_urls')
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/moderator.py b/build/lib.linux-i686-2.6/objectapp/moderator.py
new file mode 100644
index 0000000..3b87440
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/moderator.py
@@ -0,0 +1,194 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Moderator of Objectapp comments"""
+from django.conf import settings
+from django.template import Context
+from django.template import loader
+from django.core.mail import send_mail
+from django.core.mail import EmailMessage
+from django.contrib.sites.models import Site
+from django.utils.translation import activate
+from django.utils.translation import get_language
+from django.utils.translation import ugettext_lazy as _
+from django.contrib.comments.moderation import CommentModerator
+
+from objectapp.settings import PROTOCOL
+from objectapp.settings import MAIL_COMMENT_REPLY
+from objectapp.settings import MAIL_COMMENT_AUTHORS
+from objectapp.settings import AUTO_MODERATE_COMMENTS
+from objectapp.settings import AUTO_CLOSE_COMMENTS_AFTER
+from objectapp.settings import MAIL_COMMENT_NOTIFICATION_RECIPIENTS
+from objectapp.settings import SPAM_CHECKER_BACKENDS
+from objectapp.spam_checker import check_is_spam
+
+
+class GbobjectCommentModerator(CommentModerator):
+ """Moderate the comment of Gbobject"""
+ email_reply = MAIL_COMMENT_REPLY
+ email_authors = MAIL_COMMENT_AUTHORS
+ enable_field = 'comment_enabled'
+ auto_close_field = 'start_publication'
+ close_after = AUTO_CLOSE_COMMENTS_AFTER
+ spam_checker_backends = SPAM_CHECKER_BACKENDS
+ auto_moderate_comments = AUTO_MODERATE_COMMENTS
+ mail_comment_notification_recipients = MAIL_COMMENT_NOTIFICATION_RECIPIENTS
+
+ def email(self, comment, content_object, request):
+ if comment.is_public:
+ current_language = get_language()
+ try:
+ activate(settings.LANGUAGE_CODE)
+ if self.mail_comment_notification_recipients:
+ self.do_email_notification(comment, content_object,
+ request)
+ if self.email_authors:
+ self.do_email_authors(comment, content_object,
+ request)
+ if self.email_reply:
+ self.do_email_reply(comment, content_object, request)
+ finally:
+ activate(current_language)
+
+ def do_email_notification(self, comment, content_object, request):
+ """Send email notification of a new comment to site staff when email
+ notifications have been requested."""
+ site = Site.objects.get_current()
+ template = loader.get_template(
+ 'comments/comment_notification_email.txt')
+ context = Context({'comment': comment, 'site': site,
+ 'protocol': PROTOCOL,
+ 'content_object': content_object})
+ subject = _('[%(site)s] New comment posted on "%(title)s"') % \
+ {'site': site.name,
+ 'title': content_object.title}
+ message = template.render(context)
+ send_mail(subject, message, settings.DEFAULT_FROM_EMAIL,
+ self.mail_comment_notification_recipients,
+ fail_silently=not settings.DEBUG)
+
+ def do_email_authors(self, comment, content_object, request):
+ """Send email notification of a new comment to the authors of the
+ gbobject when email notifications have been requested."""
+ exclude_list = self.mail_comment_notification_recipients
+ recipient_list = set([author.email
+ for author in content_object.authors.all()]) ^ \
+ set(exclude_list)
+
+ if recipient_list:
+ site = Site.objects.get_current()
+ template = loader.get_template(
+ 'comments/comment_authors_email.txt')
+ context = Context({'comment': comment, 'site': site,
+ 'protocol': PROTOCOL,
+ 'content_object': content_object})
+ subject = _('[%(site)s] New comment posted on "%(title)s"') % \
+ {'site': site.name,
+ 'title': content_object.title}
+ message = template.render(context)
+ send_mail(subject, message, settings.DEFAULT_FROM_EMAIL,
+ recipient_list, fail_silently=not settings.DEBUG)
+
+ def do_email_reply(self, comment, content_object, request):
+ """Send email notification of a new comment to the authors of
+ the previous comments when email notifications have been requested."""
+ exclude_list = self.mail_comment_notification_recipients + \
+ [author.email
+ for author in content_object.authors.all()] + \
+ [comment.userinfo['email']]
+ recipient_list = set([comment.userinfo['email']
+ for comment in content_object.comments
+ if comment.userinfo['email']]) ^ \
+ set(exclude_list)
+
+ if recipient_list:
+ site = Site.objects.get_current()
+ template = loader.get_template('comments/comment_reply_email.txt')
+ context = Context({'comment': comment, 'site': site,
+ 'protocol': PROTOCOL,
+ 'content_object': content_object})
+ subject = _('[%(site)s] New comment posted on "%(title)s"') % \
+ {'site': site.name,
+ 'title': content_object.title}
+ message = template.render(context)
+ mail = EmailMessage(subject, message,
+ settings.DEFAULT_FROM_EMAIL,
+ bcc=recipient_list)
+ mail.send(fail_silently=not settings.DEBUG)
+
+ def moderate(self, comment, content_object, request):
+ """Determine whether a given comment on a given object should be
+ allowed to show up immediately, or should be marked non-public
+ and await approval."""
+ if self.auto_moderate_comments:
+ return True
+
+ if check_is_spam(comment, content_object, request,
+ self.spam_checker_backends):
+ comment.save()
+ user = comment.content_object.authors.all()[0]
+ comment.flags.create(user=user, flag='spam')
+ return True
+
+ return False
diff --git a/build/lib.linux-i686-2.6/objectapp/ping.py b/build/lib.linux-i686-2.6/objectapp/ping.py
new file mode 100644
index 0000000..3a816e3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/ping.py
@@ -0,0 +1,231 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Pings utilities for Objectapp"""
+import socket
+import xmlrpclib
+import threading
+from urllib2 import urlopen
+from urlparse import urlsplit
+from logging import getLogger
+
+from BeautifulSoup import BeautifulSoup
+
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+
+from objectapp.settings import PROTOCOL
+
+
+class URLRessources(object):
+ """Object defining the ressources of the website"""
+
+ def __init__(self):
+ self.current_site = Site.objects.get_current()
+ self.site_url = '%s://%s' % (PROTOCOL, self.current_site.domain)
+ self.blog_url = '%s%s' % (self.site_url,
+ reverse('objectapp_gbobject_archive_index'))
+ self.blog_feed = '%s%s' % (self.site_url,
+ reverse('objectapp_gbobject_latest_feed'))
+
+
+class DirectoryPinger(threading.Thread):
+ """Threaded Directory Pinger"""
+
+ def __init__(self, server_name, gbobjects, timeout=10, start_now=True):
+ self.results = []
+ self.timeout = timeout
+ self.gbobjects = gbobjects
+ self.server_name = server_name
+ self.server = xmlrpclib.ServerProxy(self.server_name)
+ self.ressources = URLRessources()
+
+ threading.Thread.__init__(self)
+ if start_now:
+ self.start()
+
+ def run(self):
+ """Ping gbobjects to a Directory in a Thread"""
+ logger = getLogger('objectapp.ping.directory')
+ socket.setdefaulttimeout(self.timeout)
+ for gbobject in self.gbobjects:
+ reply = self.ping_gbobject(gbobject)
+ self.results.append(reply)
+ logger.info('%s : %s' % (self.server_name, reply['message']))
+ socket.setdefaulttimeout(None)
+
+ def ping_gbobject(self, gbobject):
+ """Ping an gbobject to a Directory"""
+ gbobject_url = '%s%s' % (self.ressources.site_url,
+ gbobject.get_absolute_url())
+ objecttypes = '|'.join([c.title for c in gbobject.objecttypes.all()])
+
+ try:
+ reply = self.server.weblogUpdates.extendedPing(
+ self.ressources.current_site.name,
+ self.ressources.blog_url, gbobject_url,
+ self.ressources.blog_feed, objecttypes)
+ except Exception:
+ try:
+ reply = self.server.weblogUpdates.ping(
+ self.ressources.current_site.name,
+ self.ressources.blog_url, gbobject_url,
+ objecttypes)
+ except Exception:
+ reply = {'message': '%s is an invalid directory.' % \
+ self.server_name,
+ 'flerror': True}
+ return reply
+
+
+class ExternalUrlsPinger(threading.Thread):
+ """Threaded ExternalUrls Pinger"""
+
+ def __init__(self, gbobject, timeout=10, start_now=True):
+ self.results = []
+ self.gbobject = gbobject
+ self.timeout = timeout
+ self.ressources = URLRessources()
+ self.gbobject_url = '%s%s' % (self.ressources.site_url,
+ self.gbobject.get_absolute_url())
+
+ threading.Thread.__init__(self)
+ if start_now:
+ self.start()
+
+ def run(self):
+ """Ping external URLS in a Thread"""
+ logger = getLogger('objectapp.ping.external_urls')
+ socket.setdefaulttimeout(self.timeout)
+
+ external_urls = self.find_external_urls(self.gbobject)
+ external_urls_pingable = self.find_pingback_urls(external_urls)
+
+ for url, server_name in external_urls_pingable.items():
+ reply = self.pingback_url(server_name, url)
+ self.results.append(reply)
+ logger.info('%s : %s' % (url, reply))
+
+ socket.setdefaulttimeout(None)
+
+ def is_external_url(self, url, site_url):
+ """Check of the url in an external url"""
+ url_splitted = urlsplit(url)
+ if not url_splitted.netloc:
+ return False
+ return url_splitted.netloc != urlsplit(site_url).netloc
+
+ def find_external_urls(self, gbobject):
+ """Find external urls in an gbobject"""
+ soup = BeautifulSoup(gbobject.html_content)
+ external_urls = [a['href'] for a in soup.findAll('a')
+ if self.is_external_url(
+ a['href'], self.ressources.site_url)]
+ return external_urls
+
+ def find_pingback_href(self, content):
+ """Try to find Link markup to pingback url"""
+ soup = BeautifulSoup(content)
+ for link in soup.findAll('link'):
+ dict_attr = dict(link.attrs)
+ if 'rel' in dict_attr and 'href' in dict_attr:
+ if dict_attr['rel'].lower() == 'pingback':
+ return dict_attr.get('href')
+
+ def find_pingback_urls(self, urls):
+ """Find the pingback urls of each urls"""
+ pingback_urls = {}
+
+ for url in urls:
+ try:
+ page = urlopen(url)
+ headers = page.info()
+
+ if 'text/' not in headers.get('Content-Type', '').lower():
+ continue
+
+ server_url = headers.get('X-Pingback')
+ if not server_url:
+ server_url = self.find_pingback_href(page.read())
+
+ if server_url:
+ server_url_splitted = urlsplit(server_url)
+ if not server_url_splitted.netloc:
+ url_splitted = urlsplit(url)
+ server_url = '%s://%s%s' % (url_splitted.scheme,
+ url_splitted.netloc,
+ server_url)
+ pingback_urls[url] = server_url
+ except IOError:
+ pass
+ return pingback_urls
+
+ def pingback_url(self, server_name, target_url):
+ """Do a pingback call for the target url"""
+ try:
+ server = xmlrpclib.ServerProxy(server_name)
+ reply = server.pingback.ping(self.gbobject_url, target_url)
+ except (xmlrpclib.Error, socket.error):
+ reply = '%s cannot be pinged.' % target_url
+ return reply
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/__init__.py b/build/lib.linux-i686-2.6/objectapp/plugins/__init__.py
new file mode 100644
index 0000000..499b630
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/__init__.py
@@ -0,0 +1 @@
+"""Plugins for Objectapp"""
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/admin.py b/build/lib.linux-i686-2.6/objectapp/plugins/admin.py
new file mode 100644
index 0000000..677ea8b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/admin.py
@@ -0,0 +1,78 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Admin of Objectapp CMS Plugins"""
+from django.contrib import admin
+from django.template import RequestContext
+from django.utils.translation import ugettext_lazy as _
+
+from cms.plugin_rendering import render_placeholder
+from cms.admin.placeholderadmin import PlaceholderAdmin
+
+from objectapp.models import Gbobject
+from objectapp.admin.gbobject import GbobjectAdmin
+from objectapp.settings import GBOBJECT_BASE_MODEL
+
+
+class GbobjectPlaceholderAdmin(PlaceholderAdmin, GbobjectAdmin):
+ """GbobjectPlaceholder Admin"""
+ fieldsets = ((None, {'fields': ('title', 'image', 'status')}),
+ (_('Content'), {'fields': ('content_placeholder',),
+ 'classes': ('plugin-holder',
+ 'plugin-holder-nopage')}),
+ (_('Options'), {'fields': ('featured', 'excerpt', 'template',
+ 'related', 'authors',
+ 'creation_date',
+ 'start_publication',
+ 'end_publication'),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Privacy'), {'fields': ('password', 'login_required',),
+ 'classes': ('collapse', 'collapse-closed')}),
+ (_('Discussion'), {'fields': ('comment_enabled',
+ 'pingback_enabled')}),
+ (_('Publication'), {'fields': ('sites', 'objecttypes',
+ 'tags', 'slug')}))
+
+ def save_model(self, request, gbobject, form, change):
+ """Fill the content field with the interpretation
+ of the placeholder"""
+ context = RequestContext(request)
+ gbobject.content = render_placeholder(gbobject.content_placeholder, context)
+ super(GbobjectPlaceholderAdmin, self).save_model(
+ request, gbobject, form, change)
+
+
+if GBOBJECT_BASE_MODEL == 'objectapp.plugins.placeholder.GbobjectPlaceholder':
+ admin.site.unregister(Gbobject)
+ admin.site.register(Gbobject, GbobjectPlaceholderAdmin)
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/cms_app.py b/build/lib.linux-i686-2.6/objectapp/plugins/cms_app.py
new file mode 100644
index 0000000..01b0313
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/cms_app.py
@@ -0,0 +1,63 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Applications hooks for objectapp.plugins"""
+from django.utils.translation import ugettext_lazy as _
+
+from cms.app_base import CMSApp
+from cms.apphook_pool import apphook_pool
+
+from objectapp.plugins.settings import APP_MENUS
+
+
+class ObjectappApphook(CMSApp):
+ """Objectapp's Apphook"""
+ name = _('Objectapp App Hook')
+ urls = ['objectapp.urls']
+ menus = APP_MENUS
+
+apphook_pool.register(ObjectappApphook)
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/cms_plugins.py b/build/lib.linux-i686-2.6/objectapp/plugins/cms_plugins.py
new file mode 100644
index 0000000..e72496b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/cms_plugins.py
@@ -0,0 +1,182 @@
+g# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Plugins for CMS"""
+import itertools
+
+from django.conf import settings
+from django.utils.translation import ugettext as _
+
+from tagging.models import TaggedItem
+from cms.plugin_base import CMSPluginBase
+from cms.plugin_pool import plugin_pool
+
+from objectapp.models import Gbobject
+from objectapp.models import Author
+from objectapp.managers import tags_published
+from objectapp.plugins.models import RandomGbobjectsPlugin
+from objectapp.plugins.models import LatestGbobjectsPlugin
+from objectapp.plugins.models import SelectedGbobjectsPlugin
+
+
+class CMSLatestGbobjectsPlugin(CMSPluginBase):
+ """Django-cms plugin for the latest gbobjects filtered"""
+ module = _('gbobjects')
+ model = LatestGbobjectsPlugin
+ name = _('Latest gbobjects')
+ render_template = 'objectapp/cms/gbobject_list.html'
+ filter_horizontal = ['objecttypes', 'authors', 'tags']
+ fieldsets = (
+ (None, {
+ 'fields': (
+ 'number_of_gbobjects',
+ 'template_to_render'
+ )
+ }),
+ (_('Sorting'), {
+ 'fields': (
+ 'objecttypes',
+ 'authors',
+ 'tags'
+ ),
+ 'classes': (
+ 'collapse',
+ )
+ }),
+ (_('Advanced'), {
+ 'fields': (
+ 'subobjecttypes',
+ ),
+ }),
+ )
+
+ text_enabled = True
+
+ def formfield_for_manytomany(self, db_field, request, **kwargs):
+ """Filtering manytomany field"""
+ if db_field.name == 'authors':
+ kwargs['queryset'] = Author.published.all()
+ if db_field.name == 'tags':
+ kwargs['queryset'] = tags_published()
+ return super(CMSLatestGbobjectsPlugin, self).formfield_for_manytomany(
+ db_field, request, **kwargs)
+
+ def render(self, context, instance, placeholder):
+ """Update the context with plugin's data"""
+ gbobjects = Gbobject.published.all()
+
+ if instance.objecttypes.count():
+ cats = instance.objecttypes.all()
+
+ if instance.subobjecttypes:
+ cats = itertools.chain(cats, *[c.get_descendants()
+ for c in cats])
+
+ gbobjects = gbobjects.filter(objecttypes__in=cats)
+ if instance.authors.count():
+ gbobjects = gbobjects.filter(authors__in=instance.authors.all())
+ if instance.tags.count():
+ gbobjects = TaggedItem.objects.get_union_by_model(
+ gbobjects, instance.tags.all())
+
+ gbobjects = gbobjects.distinct()[:instance.number_of_gbobjects]
+ context.update({'gbobjects': gbobjects,
+ 'object': instance,
+ 'placeholder': placeholder})
+ return context
+
+ def icon_src(self, instance):
+ """Icon source of the plugin"""
+ return settings.STATIC_URL + u'objectapp/img/plugin.png'
+
+
+class CMSSelectedGbobjectsPlugin(CMSPluginBase):
+ """Django-cms plugin for a selection of gbobjects"""
+ module = _('gbobjects')
+ model = SelectedGbobjectsPlugin
+ name = _('Selected gbobjects')
+ render_template = 'objectapp/cms/gbobject_list.html'
+ fields = ('gbobjects', 'template_to_render')
+ filter_horizontal = ['gbobjects']
+ text_enabled = True
+
+ def render(self, context, instance, placeholder):
+ """Update the context with plugin's data"""
+ context.update({'gbobjects': instance.gbobjects.all(),
+ 'object': instance,
+ 'placeholder': placeholder})
+ return context
+
+ def icon_src(self, instance):
+ """Icon source of the plugin"""
+ return settings.STATIC_URL + u'objectapp/img/plugin.png'
+
+
+class CMSRandomGbobjectsPlugin(CMSPluginBase):
+ """Django-cms plugin for random gbobjects"""
+ module = _('gbobjects')
+ model = RandomGbobjectsPlugin
+ name = _('Random gbobjects')
+ render_template = 'objectapp/cms/random_gbobjects.html'
+ fields = ('number_of_gbobjects', 'template_to_render')
+ text_enabled = True
+
+ def render(self, context, instance, placeholder):
+ """Update the context with plugin's data"""
+ context.update(
+ {'number_of_gbobjects': instance.number_of_gbobjects,
+ 'template_to_render': str(instance.template_to_render) or
+ 'objectapp/tags/random_gbobjects.html'})
+ return context
+
+ def icon_src(self, instance):
+ """Icon source of the plugin"""
+ return settings.STATIC_URL + u'objectapp/img/plugin.png'
+
+plugin_pool.register_plugin(CMSLatestGbobjectsPlugin)
+plugin_pool.register_plugin(CMSSelectedGbobjectsPlugin)
+plugin_pool.register_plugin(CMSRandomGbobjectsPlugin)
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/menu.py b/build/lib.linux-i686-2.6/objectapp/plugins/menu.py
new file mode 100644
index 0000000..1f9871e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/menu.py
@@ -0,0 +1,180 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Menus for objectapp.plugins"""
+from django.core.urlresolvers import reverse
+from django.utils.translation import ugettext_lazy as _
+
+from menus.base import Modifier
+from menus.base import NavigationNode
+from menus.menu_pool import menu_pool
+from cms.menu_bases import CMSAttachMenu
+
+from objectapp.models import Gbobject
+from objectapp.models import Author
+from objectapp.models import Objecttype
+from objectapp.managers import tags_published
+from objectapp.plugins.settings import HIDE_GBOBJECT_MENU
+
+
+class GbobjectMenu(CMSAttachMenu):
+ """Menu for the gbobjects organized by archives dates"""
+ name = _('Objectapp Gbobject Menu')
+
+ def get_nodes(self, request):
+ """Return menu's node for gbobjects"""
+ nodes = []
+ archives = []
+ attributes = {'hidden': HIDE_GBOBJECT_MENU}
+ for gbobject in Gbobject.published.all():
+ year = gbobject.creation_date.strftime('%Y')
+ month = gbobject.creation_date.strftime('%m')
+ month_text = gbobject.creation_date.strftime('%b')
+ day = gbobject.creation_date.strftime('%d')
+
+ key_archive_year = 'year-%s' % year
+ key_archive_month = 'month-%s-%s' % (year, month)
+ key_archive_day = 'day-%s-%s-%s' % (year, month, day)
+
+ if not key_archive_year in archives:
+ nodes.append(NavigationNode(
+ year, reverse('objectapp_gbobject_archive_year', args=[year]),
+ key_archive_year, attr=attributes))
+ archives.append(key_archive_year)
+
+ if not key_archive_month in archives:
+ nodes.append(NavigationNode(
+ month_text,
+ reverse('objectapp_gbobject_archive_month', args=[year, month]),
+ key_archive_month, key_archive_year,
+ attr=attributes))
+ archives.append(key_archive_month)
+
+ if not key_archive_day in archives:
+ nodes.append(NavigationNode(
+ day, reverse('objectapp_gbobject_archive_day',
+ args=[year, month, day]),
+ key_archive_day, key_archive_month,
+ attr=attributes))
+ archives.append(key_archive_day)
+
+ nodes.append(NavigationNode(gbobject.title, gbobject.get_absolute_url(),
+ gbobject.pk, key_archive_day))
+ return nodes
+
+
+class ObjecttypeMenu(CMSAttachMenu):
+ """Menu for the objecttypes"""
+ name = _('Objectapp Objecttype Menu')
+
+ def get_nodes(self, request):
+ """Return menu's node for objecttypes"""
+ nodes = []
+ nodes.append(NavigationNode(_('Objecttypes'),
+ reverse('objectapp_Objecttype_list'),
+ 'objecttypes'))
+ for Objecttype in Objecttype.objects.all():
+ nodes.append(NavigationNode(Objecttype.title,
+ Objecttype.get_absolute_url(),
+ Objecttype.pk, 'objecttypes'))
+ return nodes
+
+
+class AuthorMenu(CMSAttachMenu):
+ """Menu for the authors"""
+ name = _('Objectapp Author Menu')
+
+ def get_nodes(self, request):
+ """Return menu's node for authors"""
+ nodes = []
+ nodes.append(NavigationNode(_('Authors'),
+ reverse('objectapp_author_list'),
+ 'authors'))
+ for author in Author.published.all():
+ nodes.append(NavigationNode(author.username,
+ reverse('objectapp_author_detail',
+ args=[author.username]),
+ author.pk, 'authors'))
+ return nodes
+
+
+class TagMenu(CMSAttachMenu):
+ """Menu for the tags"""
+ name = _('Objectapp Tag Menu')
+
+ def get_nodes(self, request):
+ """Return menu's node for tags"""
+ nodes = []
+ nodes.append(NavigationNode(_('Tags'), reverse('objectapp_tag_list'),
+ 'tags'))
+ for tag in tags_published():
+ nodes.append(NavigationNode(tag.name,
+ reverse('objectapp_tag_detail',
+ args=[tag.name]),
+ tag.pk, 'tags'))
+ return nodes
+
+
+class GbobjectModifier(Modifier):
+ """Menu Modifier for gbobjects,
+ hide the MenuGbobject in navigation, not in breadcrumbs"""
+
+ def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
+ """Modify nodes of a menu"""
+ if breadcrumb:
+ return nodes
+ for node in nodes:
+ if node.attr.get('hidden'):
+ nodes.remove(node)
+ return nodes
+
+
+menu_pool.register_menu(GbobjectMenu)
+menu_pool.register_menu(ObjecttypeMenu)
+menu_pool.register_menu(AuthorMenu)
+menu_pool.register_menu(TagMenu)
+menu_pool.register_modifier(GbobjectModifier)
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0001_initial.py b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0001_initial.py
new file mode 100644
index 0000000..893309e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0001_initial.py
@@ -0,0 +1,151 @@
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding model 'LatestGbobjectsPlugin'
+ db.create_table('cmsplugin_latestgbobjectsplugin', (
+ ('Objecttype', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['objectapp.Objecttype'], null=True, blank=True)),
+ ('cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)),
+ ('number_of_gbobjects', self.gf('django.db.models.fields.IntegerField')(default=5)),
+ ('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)),
+ ))
+ db.send_create_signal('plugins', ['LatestGbobjectsPlugin'])
+
+ # Adding model 'SelectedGbobjectsPlugin'
+ db.create_table('cmsplugin_selectedgbobjectsplugin', (
+ ('cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)),
+ ))
+ db.send_create_signal('plugins', ['SelectedGbobjectsPlugin'])
+
+ # Adding M2M table for field gbobjects on 'SelectedGbobjectsPlugin'
+ db.create_table('plugins_selectedgbobjectsplugin_gbobjects', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('selectedgbobjectsplugin', models.ForeignKey(orm['plugins.selectedgbobjectsplugin'], null=False)),
+ ('gbobject', models.ForeignKey(orm['objectapp.gbobject'], null=False))
+ ))
+ db.create_unique('plugins_selectedgbobjectsplugin_gbobjects', ['selectedgbobjectsplugin_id', 'gbobject_id'])
+
+ def backwards(self, orm):
+
+ # Deleting model 'LatestGbobjectsPlugin'
+ db.delete_table('cmsplugin_latestgbobjectsplugin')
+
+ # Deleting model 'SelectedGbobjectsPlugin'
+ db.delete_table('cmsplugin_selectedgbobjectsplugin')
+
+ # Removing M2M table for field gbobjects on 'SelectedGbobjectsPlugin'
+ db.delete_table('plugins_selectedgbobjectsplugin_gbobjects')
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'cms.cmsplugin': {
+ 'Meta': {'object_name': 'CMSPlugin'},
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'language': ('django.db.models.fields.CharField', [], {'max_length': '5', 'db_index': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
+ 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
+ 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'publisher_is_draft': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True', 'blank': 'True'}),
+ 'publisher_public': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'publisher_draft'", 'unique': 'True', 'null': 'True', 'to': "orm['cms.CMSPlugin']"}),
+ 'publisher_state': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'cms.placeholder': {
+ 'Meta': {'object_name': 'Placeholder'},
+ 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'plugins.latestgbobjectsplugin': {
+ 'Meta': {'object_name': 'LatestGbobjectsPlugin', 'db_table': "'cmsplugin_latestgbobjectsplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'Objecttype': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['objectapp.Objecttype']", 'null': 'True', 'blank': 'True'}),
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_gbobjects': ('django.db.models.fields.IntegerField', [], {'default': '5'})
+ },
+ 'plugins.selectedgbobjectsplugin': {
+ 'Meta': {'object_name': 'SelectedGbobjectsPlugin', 'db_table': "'cmsplugin_selectedgbobjectsplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'gbobjects': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['objectapp.Gbobject']", 'symmetrical': 'False'})
+ },
+ 'sites.site': {
+ 'Meta': {'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'objectapp.Objecttype': {
+ 'Meta': {'object_name': 'Objecttype'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'objectapp.gbobject': {
+ 'Meta': {'object_name': 'Gbobject'},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'objecttypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['objectapp.Objecttype']", 'symmetrical': 'False'}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'related': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'related_rel_+'", 'null': 'True', 'to': "orm['objectapp.Gbobject']"}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ }
+ }
+
+ complete_apps = ['plugins']
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0002_auto__add_field_latestgbobjectsplugin_template_to_render__add_field_sele.py b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0002_auto__add_field_latestgbobjectsplugin_template_to_render__add_field_sele.py
new file mode 100644
index 0000000..f1a52a2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0002_auto__add_field_latestgbobjectsplugin_template_to_render__add_field_sele.py
@@ -0,0 +1,132 @@
+from south.db import db
+from south.v2 import SchemaMigration
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'LatestGbobjectsPlugin.template_to_render'
+ db.add_column('cmsplugin_latestgbobjectsplugin', 'template_to_render', self.gf('django.db.models.fields.CharField')(default='objectapp/cms/gbobject_list.html', max_length=250, blank=True), keep_default=False)
+
+ # Adding field 'SelectedGbobjectsPlugin.template_to_render'
+ db.add_column('cmsplugin_selectedgbobjectsplugin', 'template_to_render', self.gf('django.db.models.fields.CharField')(default='objectapp/cms/gbobject_list.html', max_length=250, blank=True), keep_default=False)
+
+ def backwards(self, orm):
+
+ # Deleting field 'LatestGbobjectsPlugin.template_to_render'
+ db.delete_column('cmsplugin_latestgbobjectsplugin', 'template_to_render')
+
+ # Deleting field 'SelectedGbobjectsPlugin.template_to_render'
+ db.delete_column('cmsplugin_selectedgbobjectsplugin', 'template_to_render')
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'cms.cmsplugin': {
+ 'Meta': {'object_name': 'CMSPlugin'},
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'language': ('django.db.models.fields.CharField', [], {'max_length': '5', 'db_index': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
+ 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
+ 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'publisher_is_draft': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True', 'blank': 'True'}),
+ 'publisher_public': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'publisher_draft'", 'unique': 'True', 'null': 'True', 'to': "orm['cms.CMSPlugin']"}),
+ 'publisher_state': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'cms.placeholder': {
+ 'Meta': {'object_name': 'Placeholder'},
+ 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'plugins.latestgbobjectsplugin': {
+ 'Meta': {'object_name': 'LatestGbobjectsPlugin', 'db_table': "'cmsplugin_latestgbobjectsplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'Objecttype': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['objectapp.Objecttype']", 'null': 'True', 'blank': 'True'}),
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_gbobjects': ('django.db.models.fields.IntegerField', [], {'default': '5'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'plugins.selectedgbobjectsplugin': {
+ 'Meta': {'object_name': 'SelectedGbobjectsPlugin', 'db_table': "'cmsplugin_selectedgbobjectsplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'gbobjects': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['objectapp.Gbobject']", 'symmetrical': 'False'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'sites.site': {
+ 'Meta': {'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'objectapp.Objecttype': {
+ 'Meta': {'object_name': 'Objecttype'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'objectapp.gbobject': {
+ 'Meta': {'object_name': 'Gbobject'},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'objecttypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['objectapp.Objecttype']", 'symmetrical': 'False'}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'related': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'related_rel_+'", 'null': 'True', 'to': "orm['objectapp.Gbobject']"}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ }
+ }
+
+ complete_apps = ['plugins']
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0003_auto__del_field_latestgbobjectsplugin_objecttype__del_field_latestgbobjectsp.py b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0003_auto__del_field_latestgbobjectsplugin_objecttype__del_field_latestgbobjectsp.py
new file mode 100644
index 0000000..4aefa95
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0003_auto__del_field_latestgbobjectsplugin_objecttype__del_field_latestgbobjectsp.py
@@ -0,0 +1,172 @@
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Deleting field 'LatestGbobjectsPlugin.Objecttype'
+ db.delete_column('cmsplugin_latestgbobjectsplugin', 'Objecttype_id')
+
+ # Deleting field 'LatestGbobjectsPlugin.author'
+ db.delete_column('cmsplugin_latestgbobjectsplugin', 'author_id')
+
+ # Adding M2M table for field tags on 'LatestGbobjectsPlugin'
+ db.create_table('plugins_latestgbobjectsplugin_tags', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('latestgbobjectsplugin', models.ForeignKey(orm['plugins.latestgbobjectsplugin'], null=False)),
+ ('tag', models.ForeignKey(orm['tagging.tag'], null=False))
+ ))
+ db.create_unique('plugins_latestgbobjectsplugin_tags', ['latestgbobjectsplugin_id', 'tag_id'])
+
+ # Adding M2M table for field objecttypes on 'LatestGbobjectsPlugin'
+ db.create_table('plugins_latestgbobjectsplugin_objecttypes', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('latestgbobjectsplugin', models.ForeignKey(orm['plugins.latestgbobjectsplugin'], null=False)),
+ ('Objecttype', models.ForeignKey(orm['objectapp.Objecttype'], null=False))
+ ))
+ db.create_unique('plugins_latestgbobjectsplugin_objecttypes', ['latestgbobjectsplugin_id', 'Objecttype_id'])
+
+ # Adding M2M table for field authors on 'LatestGbobjectsPlugin'
+ db.create_table('plugins_latestgbobjectsplugin_authors', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('latestgbobjectsplugin', models.ForeignKey(orm['plugins.latestgbobjectsplugin'], null=False)),
+ ('user', models.ForeignKey(orm['auth.user'], null=False))
+ ))
+ db.create_unique('plugins_latestgbobjectsplugin_authors', ['latestgbobjectsplugin_id', 'user_id'])
+
+ def backwards(self, orm):
+
+ # Adding field 'LatestGbobjectsPlugin.Objecttype'
+ db.add_column('cmsplugin_latestgbobjectsplugin', 'Objecttype', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['objectapp.Objecttype'], null=True, blank=True), keep_default=False)
+
+ # Adding field 'LatestGbobjectsPlugin.author'
+ db.add_column('cmsplugin_latestgbobjectsplugin', 'author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True), keep_default=False)
+
+ # Removing M2M table for field tags on 'LatestGbobjectsPlugin'
+ db.delete_table('plugins_latestgbobjectsplugin_tags')
+
+ # Removing M2M table for field objecttypes on 'LatestGbobjectsPlugin'
+ db.delete_table('plugins_latestgbobjectsplugin_objecttypes')
+
+ # Removing M2M table for field authors on 'LatestGbobjectsPlugin'
+ db.delete_table('plugins_latestgbobjectsplugin_authors')
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'cms.cmsplugin': {
+ 'Meta': {'object_name': 'CMSPlugin'},
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'language': ('django.db.models.fields.CharField', [], {'max_length': '5', 'db_index': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
+ 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
+ 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'publisher_is_draft': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True', 'blank': 'True'}),
+ 'publisher_public': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'publisher_draft'", 'unique': 'True', 'null': 'True', 'to': "orm['cms.CMSPlugin']"}),
+ 'publisher_state': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'cms.placeholder': {
+ 'Meta': {'object_name': 'Placeholder'},
+ 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'plugins.latestgbobjectsplugin': {
+ 'Meta': {'object_name': 'LatestGbobjectsPlugin', 'db_table': "'cmsplugin_latestgbobjectsplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'objecttypes': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['objectapp.Objecttype']", 'null': 'True', 'blank': 'True'}),
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_gbobjects': ('django.db.models.fields.IntegerField', [], {'default': '5'}),
+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['tagging.Tag']", 'null': 'True', 'blank': 'True'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'plugins.selectedgbobjectsplugin': {
+ 'Meta': {'object_name': 'SelectedGbobjectsPlugin', 'db_table': "'cmsplugin_selectedgbobjectsplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'gbobjects': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['objectapp.Gbobject']", 'symmetrical': 'False'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'sites.site': {
+ 'Meta': {'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'tagging.tag': {
+ 'Meta': {'object_name': 'Tag'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'})
+ },
+ 'objectapp.Objecttype': {
+ 'Meta': {'object_name': 'Objecttype'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'objectapp.gbobject': {
+ 'Meta': {'object_name': 'Gbobject'},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'objecttypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['objectapp.Objecttype']", 'symmetrical': 'False'}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'related': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'related_rel_+'", 'null': 'True', 'to': "orm['objectapp.Gbobject']"}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ }
+ }
+
+ complete_apps = ['plugins']
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0004_auto__add_field_latestgbobjectsplugin_subobjecttypes.py b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0004_auto__add_field_latestgbobjectsplugin_subobjecttypes.py
new file mode 100644
index 0000000..448e480
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0004_auto__add_field_latestgbobjectsplugin_subobjecttypes.py
@@ -0,0 +1,142 @@
+from south.db import db
+from south.v2 import SchemaMigration
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'LatestGbobjectsPlugin.subobjecttypes'
+ db.add_column('cmsplugin_latestgbobjectsplugin', 'subobjecttypes', self.gf('django.db.models.fields.BooleanField')(default=True), keep_default=False)
+
+ def backwards(self, orm):
+
+ # Deleting field 'LatestGbobjectsPlugin.subobjecttypes'
+ db.delete_column('cmsplugin_latestgbobjectsplugin', 'subobjecttypes')
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'cms.cmsplugin': {
+ 'Meta': {'object_name': 'CMSPlugin'},
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
+ 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
+ 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'publisher_is_draft': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
+ 'publisher_public': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'publisher_draft'", 'unique': 'True', 'null': 'True', 'to': "orm['cms.CMSPlugin']"}),
+ 'publisher_state': ('django.db.models.fields.SmallIntegerField', [], {'default': '0', 'db_index': 'True'}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'cms.placeholder': {
+ 'Meta': {'object_name': 'Placeholder'},
+ 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'plugins.latestgbobjectsplugin': {
+ 'Meta': {'object_name': 'LatestGbobjectsPlugin', 'db_table': "'cmsplugin_latestgbobjectsplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'objecttypes': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['objectapp.Objecttype']", 'null': 'True', 'blank': 'True'}),
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_gbobjects': ('django.db.models.fields.IntegerField', [], {'default': '5'}),
+ 'subobjecttypes': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['tagging.Tag']", 'null': 'True', 'blank': 'True'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'plugins.selectedgbobjectsplugin': {
+ 'Meta': {'object_name': 'SelectedGbobjectsPlugin', 'db_table': "'cmsplugin_selectedgbobjectsplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'gbobjects': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['objectapp.Gbobject']", 'symmetrical': 'False'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'sites.site': {
+ 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'tagging.tag': {
+ 'Meta': {'ordering': "('name',)", 'object_name': 'Tag'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'})
+ },
+ 'objectapp.Objecttype': {
+ 'Meta': {'ordering': "['title']", 'object_name': 'Objecttype'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['objectapp.Objecttype']"}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'objectapp.gbobject': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Gbobject'},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'objecttypes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['objectapp.Objecttype']", 'symmetrical': 'False'}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'login_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'pingback_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'related': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'related_rel_+'", 'null': 'True', 'to': "orm['objectapp.Gbobject']"}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'template': ('django.db.models.fields.CharField', [], {'max_length': '250'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ }
+ }
+
+ complete_apps = ['plugins']
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0005_auto__add_randomgbobjectsplugin.py b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0005_auto__add_randomgbobjectsplugin.py
new file mode 100644
index 0000000..baa01a8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/0005_auto__add_randomgbobjectsplugin.py
@@ -0,0 +1,151 @@
+from south.db import db
+from south.v2 import SchemaMigration
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding model 'RandomGbobjectsPlugin'
+ db.create_table('cmsplugin_randomgbobjectsplugin', (
+ ('cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)),
+ ('number_of_gbobjects', self.gf('django.db.models.fields.IntegerField')(default=5)),
+ ('template_to_render', self.gf('django.db.models.fields.CharField')(max_length=250, blank=True)),
+ ))
+ db.send_create_signal('plugins', ['RandomGbobjectsPlugin'])
+
+ def backwards(self, orm):
+
+ # Deleting model 'RandomGbobjectsPlugin'
+ db.delete_table('cmsplugin_randomgbobjectsplugin')
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'cms.cmsplugin': {
+ 'Meta': {'object_name': 'CMSPlugin'},
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}),
+ 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
+ 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'cms.placeholder': {
+ 'Meta': {'object_name': 'Placeholder'},
+ 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'plugins.latestgbobjectsplugin': {
+ 'Meta': {'object_name': 'LatestGbobjectsPlugin', 'db_table': "'cmsplugin_latestgbobjectsplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'objecttypes': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['objectapp.Objecttype']", 'null': 'True', 'blank': 'True'}),
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_gbobjects': ('django.db.models.fields.IntegerField', [], {'default': '5'}),
+ 'subobjecttypes': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['tagging.Tag']", 'null': 'True', 'blank': 'True'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'plugins.randomgbobjectsplugin': {
+ 'Meta': {'object_name': 'RandomGbobjectsPlugin', 'db_table': "'cmsplugin_randomgbobjectsplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'number_of_gbobjects': ('django.db.models.fields.IntegerField', [], {'default': '5'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'plugins.selectedgbobjectsplugin': {
+ 'Meta': {'object_name': 'SelectedGbobjectsPlugin', 'db_table': "'cmsplugin_selectedgbobjectsplugin'", '_ormbases': ['cms.CMSPlugin']},
+ 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}),
+ 'gbobjects': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['objectapp.Gbobject']", 'symmetrical': 'False'}),
+ 'template_to_render': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
+ },
+ 'sites.site': {
+ 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
+ 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'tagging.tag': {
+ 'Meta': {'ordering': "('name',)", 'object_name': 'Tag'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'})
+ },
+ 'objectapp.Objecttype': {
+ 'Meta': {'ordering': "['title']", 'object_name': 'Objecttype'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['objectapp.Objecttype']"}),
+ 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'})
+ },
+ 'objectapp.gbobject': {
+ 'Meta': {'ordering': "['-creation_date']", 'object_name': 'Gbobject'},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'objecttypes': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['objectapp.Objecttype']", 'null': 'True', 'blank': 'True'}),
+ 'comment_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'content': ('django.db.models.fields.TextField', [], {}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'end_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2042, 3, 15, 0, 0)'}),
+ 'excerpt': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+ 'last_update': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'login_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'pingback_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'related': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'related_rel_+'", 'null': 'True', 'to': "orm['objectapp.Gbobject']"}),
+ 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['sites.Site']", 'symmetrical': 'False'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+ 'start_publication': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'tags': ('tagging.fields.TagField', [], {}),
+ 'template': ('django.db.models.fields.CharField', [], {'default': "'objectapp/gbobject_detail.html'", 'max_length': '250'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ }
+ }
+
+ complete_apps = ['plugins']
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/migrations/__init__.py b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/__init__.py
new file mode 100644
index 0000000..66f67de
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/migrations/__init__.py
@@ -0,0 +1 @@
+"""Migrations for Objectapp Plugins"""
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/models.py b/build/lib.linux-i686-2.6/objectapp/plugins/models.py
new file mode 100644
index 0000000..8e991a1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/models.py
@@ -0,0 +1,152 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Models of Objectapp CMS Plugins"""
+from django.db import models
+from django.contrib.auth.models import User
+from django.db.models.signals import post_save
+from django.db.models.signals import post_delete
+from django.utils.translation import ugettext_lazy as _
+
+from tagging.models import Tag
+from cms.models import CMSPlugin
+from menus.menu_pool import menu_pool
+
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.plugins.settings import PLUGINS_TEMPLATES
+
+TEMPLATES = [('objectapp/cms/gbobject_list.html', _('Gbobject list (default)')),
+ ('objectapp/cms/gbobject_detail.html', _('Gbobject detailed'))] + \
+ PLUGINS_TEMPLATES
+
+
+class LatestGbobjectsPlugin(CMSPlugin):
+ """CMS Plugin for displaying latest gbobjects"""
+
+ objecttypes = models.ManyToManyField(
+ Objecttype, verbose_name=_('objecttypes'),
+ blank=True, null=True)
+ subobjecttypes = models.BooleanField(
+ default=True, verbose_name=_('include subobjecttypes'))
+ authors = models.ManyToManyField(
+ User, verbose_name=_('authors'), blank=True, null=True)
+ tags = models.ManyToManyField(
+ Tag, verbose_name=_('tags'), blank=True, null=True)
+
+ number_of_gbobjects = models.IntegerField(
+ _('number of gbobjects'), default=5)
+ template_to_render = models.CharField(
+ _('template'), blank=True,
+ max_length=250, choices=TEMPLATES,
+ help_text=_('Template used to display the plugin'))
+
+ @property
+ def render_template(self):
+ """Override render_template to use
+ the template_to_render attribute"""
+ return self.template_to_render
+
+ def copy_relations(self, old_instance):
+ """Duplicate ManyToMany relations on plugin copy"""
+ self.tags = old_instance.tags.all()
+ self.authors = old_instance.authors.all()
+ self.objecttypes = old_instance.objecttypes.all()
+
+ def __unicode__(self):
+ return _('%s gbobjects') % self.number_of_gbobjects
+
+
+class SelectedGbobjectsPlugin(CMSPlugin):
+ """CMS Plugin for displaying custom gbobjects"""
+
+ gbobjects = models.ManyToManyField(
+ Gbobject, verbose_name=_('gbobjects'))
+ template_to_render = models.CharField(
+ _('template'), blank=True,
+ max_length=250, choices=TEMPLATES,
+ help_text=_('Template used to display the plugin'))
+
+ @property
+ def render_template(self):
+ """Override render_template to use
+ the template_to_render attribute"""
+ return self.template_to_render
+
+ def copy_relations(self, old_instance):
+ """Duplicate ManyToMany relations on plugin copy"""
+ self.gbobjects = old_instance.gbobjects.all()
+
+ def __unicode__(self):
+ return _('%s gbobjects') % self.gbobjects.count()
+
+
+class RandomGbobjectsPlugin(CMSPlugin):
+ """CMS Plugin for displaying random gbobjects"""
+
+ number_of_gbobjects = models.IntegerField(
+ _('number of gbobjects'), default=5)
+ template_to_render = models.CharField(
+ _('template'), blank=True,
+ max_length=250, choices=TEMPLATES,
+ help_text=_('Template used to display the plugin'))
+
+ def __unicode__(self):
+ return _('%s gbobjects') % self.number_of_gbobjects
+
+
+def invalidate_menu_cache(sender, **kwargs):
+ """Signal receiver to invalidate the menu_pool
+ cache when an gbobject is posted"""
+ menu_pool.clear()
+
+post_save.connect(
+ invalidate_menu_cache, sender=Gbobject,
+ dispatch_uid='objectapp.gbobject.postsave.invalidate_menu_cache')
+post_delete.connect(
+ invalidate_menu_cache, sender=Gbobject,
+ dispatch_uid='objectapp.gbobject.postdelete.invalidate_menu_cache')
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/placeholder.py b/build/lib.linux-i686-2.6/objectapp/plugins/placeholder.py
new file mode 100644
index 0000000..f2f8973
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/placeholder.py
@@ -0,0 +1,61 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Placeholder model for Objectapp"""
+from cms.models.fields import PlaceholderField
+
+from objectapp.models import GbobjectAbstractClass
+
+
+class GbobjectPlaceholder(GbobjectAbstractClass):
+ """Gbobject with a Placeholder to edit content"""
+
+ content_placeholder = PlaceholderField('content')
+
+ class Meta:
+ """GbobjectPlaceholder's Meta"""
+ abstract = True
diff --git a/build/lib.linux-i686-2.6/objectapp/plugins/settings.py b/build/lib.linux-i686-2.6/objectapp/plugins/settings.py
new file mode 100644
index 0000000..e679e3e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/plugins/settings.py
@@ -0,0 +1,74 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Settings of Objectapp.plugins"""
+import warnings
+
+from django.conf import settings
+from django.utils.importlib import import_module
+
+
+HIDE_GBOBJECT_MENU = getattr(settings, 'OBJECTAPP_HIDE_GBOBJECT_MENU', True)
+
+PLUGINS_TEMPLATES = getattr(settings, 'OBJECTAPP_PLUGINS_TEMPLATES', [])
+
+
+APP_MENUS = []
+DEFAULT_APP_MENUS = ['objectapp.plugins.menu.GbobjectMenu',
+ 'objectapp.plugins.menu.ObjecttypeMenu',
+ 'objectapp.plugins.menu.TagMenu',
+ 'objectapp.plugins.menu.AuthorMenu']
+
+for menu_string in getattr(settings, 'OBJECTAPP_APP_MENUS', DEFAULT_APP_MENUS):
+ try:
+ dot = menu_string.rindex('.')
+ menu_module = menu_string[:dot]
+ menu_name = menu_string[dot + 1:]
+ APP_MENUS.append(getattr(import_module(menu_module), menu_name))
+ except (ImportError, AttributeError):
+ warnings.warn('%s menu cannot be imported' % menu_string,
+ RuntimeWarning)
diff --git a/build/lib.linux-i686-2.6/objectapp/search.py b/build/lib.linux-i686-2.6/objectapp/search.py
new file mode 100644
index 0000000..1540299
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/search.py
@@ -0,0 +1,180 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Search module with complex query parsing for Objectapp"""
+from pyparsing import Word
+from pyparsing import alphas
+from pyparsing import WordEnd
+from pyparsing import Combine
+from pyparsing import opAssoc
+from pyparsing import Optional
+from pyparsing import OneOrMore
+from pyparsing import StringEnd
+from pyparsing import printables
+from pyparsing import quotedString
+from pyparsing import removeQuotes
+from pyparsing import ParseResults
+from pyparsing import CaselessLiteral
+from pyparsing import operatorPrecedence
+
+from django.db.models import Q
+
+from objectapp.models import Gbobject
+from objectapp.settings import STOP_WORDS
+
+
+def createQ(token):
+ """Creates the Q() object"""
+ meta = getattr(token, 'meta', None)
+ query = getattr(token, 'query', '')
+ wildcards = None
+
+ if isinstance(query, basestring): # Unicode -> Quoted string
+ search = query
+ else: # List -> No quoted string (possible wildcards)
+ if len(query) == 1:
+ search = query[0]
+ elif len(query) == 3:
+ wildcards = 'BOTH'
+ search = query[1]
+ elif len(query) == 2:
+ if query[0] == '*':
+ wildcards = 'START'
+ search = query[1]
+ else:
+ wildcards = 'END'
+ search = query[0]
+
+ # Ignore connective words (of, a, an...) and STOP_WORDS
+ if (len(search) < 3 and not search.isdigit()) or \
+ search in STOP_WORDS:
+ return Q()
+
+ if not meta:
+ return Q(content__icontains=search) | \
+ Q(excerpt__icontains=search) | \
+ Q(title__icontains=search)
+
+ if meta == 'Objecttype':
+ if wildcards == 'BOTH':
+ return Q(objecttypes__title__icontains=search) | \
+ Q(objecttypes__slug__icontains=search)
+ elif wildcards == 'START':
+ return Q(objecttypes__title__iendswith=search) | \
+ Q(objecttypes__slug__iendswith=search)
+ elif wildcards == 'END':
+ return Q(objecttypes__title__istartswith=search) | \
+ Q(objecttypes__slug__istartswith=search)
+ else:
+ return Q(objecttypes__title__iexact=search) | \
+ Q(objecttypes__slug__iexact=search)
+ elif meta == 'author':
+ if wildcards == 'BOTH':
+ return Q(authors__username__icontains=search)
+ elif wildcards == 'START':
+ return Q(authors__username__iendswith=search)
+ elif wildcards == 'END':
+ return Q(authors__username__istartswith=search)
+ else:
+ return Q(authors__username__iexact=search)
+ elif meta == 'tag': # TODO: tags ignore wildcards
+ return Q(tags__icontains=search)
+
+
+def unionQ(token):
+ """Appends all the Q() objects"""
+ query = Q()
+ operation = 'and'
+ negation = False
+
+ for t in token:
+ if type(t) is ParseResults: # See tokens recursively
+ query &= unionQ(t)
+ else:
+ if t in ('or', 'and'): # Set the new op and go to next token
+ operation = t
+ elif t == '-': # Next tokens needs to be negated
+ negation = True
+ else: # Append to query the token
+ if negation:
+ t = ~t
+ if operation == 'or':
+ query |= t
+ else:
+ query &= t
+ return query
+
+
+NO_BRTS = printables.replace('(', '').replace(')', '')
+SINGLE = Word(NO_BRTS.replace('*', ''))
+WILDCARDS = Optional('*') + SINGLE + Optional('*') + WordEnd(wordChars=NO_BRTS)
+QUOTED = quotedString.setParseAction(removeQuotes)
+
+OPER_AND = CaselessLiteral('and')
+OPER_OR = CaselessLiteral('or')
+OPER_NOT = '-'
+
+TERM = Combine(Optional(Word(alphas).setResultsName('meta') + ':') +
+ (QUOTED.setResultsName('query') |
+ WILDCARDS.setResultsName('query')))
+TERM.setParseAction(createQ)
+
+EXPRESSION = operatorPrecedence(TERM, [
+ (OPER_NOT, 1, opAssoc.RIGHT),
+ (OPER_OR, 2, opAssoc.LEFT),
+ (Optional(OPER_AND, default='and'), 2, opAssoc.LEFT)])
+EXPRESSION.setParseAction(unionQ)
+
+QUERY = OneOrMore(EXPRESSION) + StringEnd()
+QUERY.setParseAction(unionQ)
+
+
+def advanced_search(pattern):
+ """Parse the grammar of a pattern
+ and build a queryset with it"""
+ query_parsed = QUERY.parseString(pattern)
+ return Gbobject.published.filter(query_parsed[0]).distinct()
diff --git a/build/lib.linux-i686-2.6/objectapp/settings.py b/build/lib.linux-i686-2.6/objectapp/settings.py
new file mode 100644
index 0000000..885a870
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/settings.py
@@ -0,0 +1,135 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Settings of Objectapp"""
+from django.conf import settings
+
+PING_DIRECTORIES = getattr(settings, 'OBJECTAPP_PING_DIRECTORIES',
+ ('http://django-blog-objectapp.com/xmlrpc/',))
+SAVE_PING_DIRECTORIES = getattr(settings, 'OBJECTAPP_SAVE_PING_DIRECTORIES',
+ bool(PING_DIRECTORIES))
+SAVE_PING_EXTERNAL_URLS = getattr(settings, 'OBJECTAPP_PING_EXTERNAL_URLS', True)
+
+COPYRIGHT = getattr(settings, 'OBJECTAPP_COPYRIGHT', 'Objectapp')
+
+PAGINATION = getattr(settings, 'OBJECTAPP_PAGINATION', 10)
+ALLOW_EMPTY = getattr(settings, 'OBJECTAPP_ALLOW_EMPTY', True)
+ALLOW_FUTURE = getattr(settings, 'OBJECTAPP_ALLOW_FUTURE', True)
+
+GBOBJECT_TEMPLATES = getattr(settings, 'OBJECTAPP_GBOBJECT_TEMPLATES', [])
+GBOBJECT_BASE_MODEL = getattr(settings, 'OBJECTAPP_GBOBJECT_BASE_MODEL', '')
+
+MARKUP_LANGUAGE = getattr(settings, 'OBJECTAPP_MARKUP_LANGUAGE', 'html')
+
+MARKDOWN_EXTENSIONS = getattr(settings, 'OBJECTAPP_MARKDOWN_EXTENSIONS', '')
+
+WYSIWYG_MARKUP_MAPPING = {
+ 'textile': 'markitup',
+ 'markdown': 'markitup',
+ 'restructuredtext': 'markitup',
+ 'html': 'tinymce' in settings.INSTALLED_APPS and 'tinymce' or 'wymeditor'}
+
+WYSIWYG = getattr(settings, 'OBJECTAPP_WYSIWYG',
+ WYSIWYG_MARKUP_MAPPING.get(MARKUP_LANGUAGE))
+
+AUTO_CLOSE_COMMENTS_AFTER = getattr(
+ settings, 'OBJECTAPP_AUTO_CLOSE_COMMENTS_AFTER', None)
+
+AUTO_MODERATE_COMMENTS = getattr(settings, 'OBJECTAPP_AUTO_MODERATE_COMMENTS',
+ False)
+
+MAIL_COMMENT_REPLY = getattr(settings, 'OBJECTAPP_MAIL_COMMENT_REPLY', False)
+
+MAIL_COMMENT_AUTHORS = getattr(settings, 'OBJECTAPP_MAIL_COMMENT_AUTHORS', True)
+
+MAIL_COMMENT_NOTIFICATION_RECIPIENTS = getattr(
+ settings, 'OBJECTAPP_MAIL_COMMENT_NOTIFICATION_RECIPIENTS',
+ [manager_tuple[1] for manager_tuple in settings.MANAGERS])
+
+UPLOAD_TO = getattr(settings, 'OBJECTAPP_UPLOAD_TO', 'uploads')
+
+PROTOCOL = getattr(settings, 'OBJECTAPP_PROTOCOL', 'http')
+
+FEEDS_FORMAT = getattr(settings, 'OBJECTAPP_FEEDS_FORMAT', 'rss')
+FEEDS_MAX_ITEMS = getattr(settings, 'OBJECTAPP_FEEDS_MAX_ITEMS', 15)
+
+PINGBACK_CONTENT_LENGTH = getattr(settings,
+ 'OBJECTAPP_PINGBACK_CONTENT_LENGTH', 300)
+
+F_MIN = getattr(settings, 'OBJECTAPP_F_MIN', 0.1)
+F_MAX = getattr(settings, 'OBJECTAPP_F_MAX', 1.0)
+
+SPAM_CHECKER_BACKENDS = getattr(settings, 'OBJECTAPP_SPAM_CHECKER_BACKENDS',
+ ())
+
+URL_SHORTENER_BACKEND = getattr(settings, 'OBJECTAPP_URL_SHORTENER_BACKEND',
+ 'objectapp.url_shortener.backends.default')
+
+STOP_WORDS = getattr(settings, 'OBJECTAPP_STOP_WORDS',
+ ('able', 'about', 'across', 'after', 'all', 'almost',
+ 'also', 'among', 'and', 'any', 'are', 'because', 'been',
+ 'but', 'can', 'cannot', 'could', 'dear', 'did', 'does',
+ 'either', 'else', 'ever', 'every', 'for', 'from', 'get',
+ 'got', 'had', 'has', 'have', 'her', 'hers', 'him', 'his',
+ 'how', 'however', 'into', 'its', 'just', 'least', 'let',
+ 'like', 'likely', 'may', 'might', 'most', 'must',
+ 'neither', 'nor', 'not', 'off', 'often', 'only', 'other',
+ 'our', 'own', 'rather', 'said', 'say', 'says', 'she',
+ 'should', 'since', 'some', 'than', 'that', 'the',
+ 'their', 'them', 'then', 'there', 'these', 'they',
+ 'this', 'tis', 'too', 'twas', 'wants', 'was', 'were',
+ 'what', 'when', 'where', 'which', 'while', 'who', 'whom',
+ 'why', 'will', 'with', 'would', 'yet', 'you', 'your'))
+
+TWITTER_CONSUMER_KEY = getattr(settings, 'TWITTER_CONSUMER_KEY', '')
+TWITTER_CONSUMER_SECRET = getattr(settings, 'TWITTER_CONSUMER_SECRET', '')
+TWITTER_ACCESS_KEY = getattr(settings, 'TWITTER_ACCESS_KEY', '')
+TWITTER_ACCESS_SECRET = getattr(settings, 'TWITTER_ACCESS_SECRET', '')
+
+USE_TWITTER = getattr(settings, 'OBJECTAPP_USE_TWITTER',
+ bool(TWITTER_ACCESS_KEY and TWITTER_ACCESS_SECRET and \
+ TWITTER_CONSUMER_KEY and TWITTER_CONSUMER_SECRET))
diff --git a/build/lib.linux-i686-2.6/objectapp/signals.py b/build/lib.linux-i686-2.6/objectapp/signals.py
new file mode 100644
index 0000000..ed3f81c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/signals.py
@@ -0,0 +1,102 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Signal handlers of Objectapp"""
+import inspect
+from functools import wraps
+
+from django.db.models.signals import post_save
+
+from objectapp import settings
+
+
+def disable_for_loaddata(signal_handler):
+ """Decorator for disabling signals sent
+ by 'post_save' on loaddata command.
+ http://code.djangoproject.com/ticket/8399"""
+
+ @wraps(signal_handler)
+ def wrapper(*args, **kwargs):
+ for fr in inspect.stack():
+ if inspect.getmodulename(fr[1]) == 'loaddata':
+ return
+ signal_handler(*args, **kwargs)
+
+ return wrapper
+
+
+@disable_for_loaddata
+def ping_directories_handler(sender, **kwargs):
+ """Ping Directories when an gbobject is saved"""
+ gbobject = kwargs['instance']
+
+ if gbobject.is_visible and settings.SAVE_PING_DIRECTORIES:
+ from objectapp.ping import DirectoryPinger
+
+ for directory in settings.PING_DIRECTORIES:
+ DirectoryPinger(directory, [gbobject])
+
+
+@disable_for_loaddata
+def ping_external_urls_handler(sender, **kwargs):
+ """Ping Externals URLS when an gbobject is saved"""
+ gbobject = kwargs['instance']
+
+ if gbobject.is_visible and settings.SAVE_PING_EXTERNAL_URLS:
+ from objectapp.ping import ExternalUrlsPinger
+
+ ExternalUrlsPinger(gbobject)
+
+
+def disconnect_objectapp_signals():
+ """Disconnect all the signals provided by Objectapp"""
+ from objectapp.models import Gbobject
+
+ post_save.disconnect(
+ sender=Gbobject, dispatch_uid='objectapp.gbobject.post_save.ping_directories')
+ post_save.disconnect(
+ sender=Gbobject, dispatch_uid='objectapp.gbobject.post_save.ping_external_urls')
diff --git a/build/lib.linux-i686-2.6/objectapp/sitemaps.py b/build/lib.linux-i686-2.6/objectapp/sitemaps.py
new file mode 100644
index 0000000..3696622
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/sitemaps.py
@@ -0,0 +1,183 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+"""Sitemaps for Objectapp"""
+from django.contrib.sitemaps import Sitemap
+from django.core.urlresolvers import reverse
+
+from tagging.models import TaggedItem
+
+from objectapp.models import Gbobject
+from objectapp.models import Author
+from objectapp.models import Objecttype
+from objectapp.managers import tags_published
+
+
+class GbobjectSitemap(Sitemap):
+ """Sitemap for gbobjects"""
+ priority = 0.5
+ changefreq = 'weekly'
+
+ def items(self):
+ """Return published gbobjects"""
+ return Gbobject.published.all()
+
+ def lastmod(self, obj):
+ """Return last modification of an gbobject"""
+ return obj.last_update
+
+
+class ObjecttypeSitemap(Sitemap):
+ """Sitemap for objecttypes"""
+ changefreq = 'monthly'
+
+ def cache(self, objecttypes):
+ """Cache categorie's gbobjects percent on total gbobjects"""
+ len_gbobjects = float(Gbobject.published.count())
+ self.cache_objecttypes = {}
+ for cat in objecttypes:
+ if len_gbobjects:
+ self.cache_objecttypes[cat.pk] = cat.gbobjects_published(
+ ).count() / len_gbobjects
+ else:
+ self.cache_objecttypes[cat.pk] = 0.0
+
+ def items(self):
+ """Return all objecttypes with coeff"""
+ objecttypes = Objecttype.objects.all()
+ self.cache(objecttypes)
+ return objecttypes
+
+ def lastmod(self, obj):
+ """Return last modification of a Objecttype"""
+ gbobjects = obj.gbobjects_published()
+ if not gbobjects:
+ return None
+ return gbobjects[0].creation_date
+
+ def priority(self, obj):
+ """Compute priority with cached coeffs"""
+ priority = 0.5 + self.cache_objecttypes[obj.pk]
+ if priority > 1.0:
+ priority = 1.0
+ return '%.1f' % priority
+
+
+class AuthorSitemap(Sitemap):
+ """Sitemap for authors"""
+ priority = 0.5
+ changefreq = 'monthly'
+
+ def items(self):
+ """Return published authors"""
+ return Author.published.all()
+
+ def lastmod(self, obj):
+ """Return last modification of an author"""
+ gbobjects = obj.gbobjects_published()
+ if not gbobjects:
+ return None
+ return gbobjects[0].creation_date
+
+ def location(self, obj):
+ """Return url of an author"""
+ return reverse('objectapp_author_detail', args=[obj.username])
+
+
+class TagSitemap(Sitemap):
+ """Sitemap for tags"""
+ changefreq = 'monthly'
+
+ def cache(self, tags):
+ """Cache tag's gbobjects percent on total gbobjects"""
+ len_gbobjects = float(Gbobject.published.count())
+ self.cache_tags = {}
+ for tag in tags:
+ gbobjects = TaggedItem.objects.get_by_model(
+ Gbobject.published.all(), tag)
+ self.cache_tags[tag.pk] = (gbobjects, gbobjects.count() / len_gbobjects)
+
+ def items(self):
+ """Return all tags with coeff"""
+ tags = tags_published()
+ self.cache(tags)
+ return tags
+
+ def lastmod(self, obj):
+ """Return last modification of a tag"""
+ gbobjects = self.cache_tags[obj.pk][0]
+ return gbobjects[0].creation_date
+
+ def priority(self, obj):
+ """Compute priority with cached coeffs"""
+ priority = 0.5 + self.cache_tags[obj.pk][1]
+ if priority > 1.0:
+ priority = 1.0
+ return '%.1f' % priority
+
+ def location(self, obj):
+ """Return url of a tag"""
+ return reverse('objectapp_tag_detail', args=[obj.name])
diff --git a/build/lib.linux-i686-2.6/objectapp/spam_checker/__init__.py b/build/lib.linux-i686-2.6/objectapp/spam_checker/__init__.py
new file mode 100644
index 0000000..7d1da4f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/spam_checker/__init__.py
@@ -0,0 +1,82 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Spam checker for Objectapp"""
+import warnings
+
+from django.utils.importlib import import_module
+from django.core.exceptions import ImproperlyConfigured
+
+from objectapp.settings import SPAM_CHECKER_BACKENDS
+
+
+def get_spam_checker(backend_path):
+ """Return the selected spam checker backend"""
+ try:
+ backend_module = import_module(backend_path)
+ backend = getattr(backend_module, 'backend')
+ except (ImportError, AttributeError):
+ warnings.warn('%s backend cannot be imported' % backend_path,
+ RuntimeWarning)
+ backend = None
+ except ImproperlyConfigured, e:
+ warnings.warn(str(e), RuntimeWarning)
+ backend = None
+
+ return backend
+
+
+def check_is_spam(content, content_object, request,
+ backends=SPAM_CHECKER_BACKENDS):
+ """Return True if the content is a spam, else False"""
+ for backend_path in backends:
+ spam_checker = get_spam_checker(backend_path)
+ is_spam = spam_checker(content, content_object, request)
+ if is_spam:
+ return True
+
+ return False
diff --git a/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/__init__.py b/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/__init__.py
new file mode 100644
index 0000000..83a6d7e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/__init__.py
@@ -0,0 +1 @@
+"""Shortlink backends for Objectapp"""
diff --git a/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/all_is_spam.py b/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/all_is_spam.py
new file mode 100644
index 0000000..4aba03c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/all_is_spam.py
@@ -0,0 +1,53 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""All is spam, spam checker backend for Objectapp"""
+
+
+def backend(comment, content_object, request):
+ """Backend for setting all comments to spam"""
+ return True
diff --git a/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/automattic.py b/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/automattic.py
new file mode 100644
index 0000000..46796e0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/automattic.py
@@ -0,0 +1,106 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Akismet spam checker backend for Objectapp"""
+from django.conf import settings
+from django.utils.encoding import smart_str
+from django.contrib.sites.models import Site
+from django.core.exceptions import ImproperlyConfigured
+
+from objectapp.settings import PROTOCOL
+
+try:
+ from akismet import Akismet
+ from akismet import APIKeyError
+except ImportError:
+ raise ImproperlyConfigured('akismet module is not available')
+
+if not getattr(settings, 'AKISMET_SECRET_API_KEY', ''):
+ raise ImproperlyConfigured('You have to set AKISMET_SECRET_API_KEY')
+
+AKISMET_API_KEY = settings.AKISMET_SECRET_API_KEY
+
+
+def backend(comment, content_object, request):
+ """Akismet spam checker backend for Objectapp"""
+ blog_url = '%s://%s/' % (PROTOCOL, Site.objects.get_current().domain)
+
+ akismet = Akismet(key=AKISMET_API_KEY, blog_url=blog_url)
+
+ if not akismet.verify_key():
+ raise APIKeyError('Your Akismet API key is invalid.')
+
+ akismet_data = {
+ 'user_ip': request.META.get('REMOTE_ADDR', ''),
+ 'user_agent': request.META.get('HTTP_USER_AGENT', ''),
+ 'referrer': request.META.get('HTTP_REFERER', 'unknown'),
+ 'permalink': content_object.get_absolute_url(),
+ 'comment_type': 'comment',
+ 'comment_author': smart_str(comment.userinfo.get('name', '')),
+ 'comment_author_email': smart_str(comment.userinfo.get('email', '')),
+ 'comment_author_url': smart_str(comment.userinfo.get('url', '')),
+ }
+ is_spam = akismet.comment_check(smart_str(comment.comment),
+ data=akismet_data, build_data=True)
+ return is_spam
diff --git a/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/mollom.py b/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/mollom.py
new file mode 100644
index 0000000..2f3fece
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/mollom.py
@@ -0,0 +1,106 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Mollom spam checker backend for Objectapp"""
+from django.conf import settings
+from django.utils.encoding import smart_str
+from django.core.exceptions import ImproperlyConfigured
+
+try:
+ from pymollom import MollomAPI
+ from pymollom import MollomFault
+except ImportError:
+ raise ImproperlyConfigured('pymollom module is not available')
+
+if not getattr(settings, 'MOLLOM_PUBLIC_KEY', ''):
+ raise ImproperlyConfigured('You have to set a MOLLOM_PUBLIC_KEY setting')
+
+if not getattr(settings, 'MOLLOM_PRIVATE_KEY', ''):
+ raise ImproperlyConfigured('You have to set a MOLLOM_PRIVATE_KEY setting')
+
+MOLLOM_PUBLIC_KEY = settings.MOLLOM_PUBLIC_KEY
+MOLLOM_PRIVATE_KEY = settings.MOLLOM_PRIVATE_KEY
+
+
+def backend(comment, content_object, request):
+ """Mollom spam checker backend for Objectapp"""
+ mollom_api = MollomAPI(
+ publicKey=MOLLOM_PUBLIC_KEY,
+ privateKey=MOLLOM_PRIVATE_KEY)
+ if not mollom_api.verifyKey():
+ raise MollomFault('Your MOLLOM credentials are invalid.')
+
+ mollom_data = {'authorIP': request.META.get('REMOTE_ADDR', ''),
+ 'authorName': smart_str(comment.userinfo.get('name', '')),
+ 'authorMail': smart_str(comment.userinfo.get('email', '')),
+ 'authorURL': smart_str(comment.userinfo.get('url', ''))}
+
+ cc = mollom_api.checkContent(
+ postTitle=smart_str(content_object.title),
+ postBody=smart_str(comment.comment), **mollom_data)
+ # cc['spam']: 1 for ham, 2 for spam, 3 for unsure;
+ # http://mollom.com/blog/spam-vs-ham
+ if cc['spam'] == 2:
+ return True
+ return False
diff --git a/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/typepad.py b/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/typepad.py
new file mode 100644
index 0000000..f5b3415
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/spam_checker/backends/typepad.py
@@ -0,0 +1,94 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""TypePad spam checker backend for Objectapp"""
+from django.conf import settings
+from django.utils.encoding import smart_str
+from django.contrib.sites.models import Site
+from django.core.exceptions import ImproperlyConfigured
+
+from objectapp.settings import PROTOCOL
+
+try:
+ from akismet import Akismet
+ from akismet import APIKeyError
+except ImportError:
+ raise ImproperlyConfigured('akismet module is not available')
+
+if not getattr(settings, 'TYPEPAD_SECRET_API_KEY', ''):
+ raise ImproperlyConfigured('You have to set TYPEPAD_SECRET_API_KEY')
+
+TYPEPAD_API_KEY = settings.TYPEPAD_SECRET_API_KEY
+
+
+class TypePad(Akismet):
+ """TypePad version of the Akismet module"""
+ baseurl = 'api.antispam.typepad.com/1.1/'
+
+
+def backend(comment, content_object, request):
+ """TypePad spam checker backend for Objectapp"""
+ blog_url = '%s://%s/' % (PROTOCOL, Site.objects.get_current().domain)
+
+ typepad = TypePad(key=TYPEPAD_API_KEY, blog_url=blog_url)
+
+ if not typepad.verify_key():
+ raise APIKeyError('Your Typepad API key is invalid.')
+
+ typepad_data = {
+ 'user_ip': request.META.get('REMOTE_ADDR', ''),
+ 'user_agent': request.META.get('HTTP_USER_AGENT', ''),
+ 'referrer': request.META.get('HTTP_REFERER', 'unknown'),
+ 'permalink': content_object.get_absolute_url(),
+ 'comment_type': 'comment',
+ 'comment_author': smart_str(comment.userinfo.get('name', '')),
+ 'comment_author_email': smart_str(comment.userinfo.get('email', '')),
+ 'comment_author_url': smart_str(comment.userinfo.get('url', '')),
+ }
+ is_spam = typepad.comment_check(smart_str(comment.comment),
+ data=typepad_data, build_data=True)
+ return is_spam
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/config.rb b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/config.rb
new file mode 100644
index 0000000..accf354
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/config.rb
@@ -0,0 +1,9 @@
+# Require any additional compass plugins here.
+project_type = :stand_alone
+# Set this to the root of your project when deployed:
+http_path = "/"
+css_dir = "."
+sass_dir = "src"
+images_dir = "../img"
+output_style = :compact
+line_comments = false
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/dashboard_objectapp.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/dashboard_objectapp.css
new file mode 100644
index 0000000..d1f4a24
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/dashboard_objectapp.css
@@ -0,0 +1,32 @@
+body.dashboard #content { width: 75%; }
+
+.module { width: 400px; margin-right: 5px; }
+.module table { width: 100%; }
+.module table th, .module table td { font-size: 12px; }
+
+.managelink { background: url("../img/manage.png") no-repeat scroll 0 0.2em transparent; padding-left: 12px; }
+
+.previewlink { background: url("../img/preview.png") no-repeat scroll 0 0.2em transparent; padding-left: 12px; }
+
+input, textarea, select { border: 1px solid #cccccc; }
+
+.vTextField, .vLargeTextField { width: 25em; }
+
+.required label, label.required { color: #333333 !important; font-weight: bold !important; }
+
+.button { float: left; margin-right: 5px; }
+
+#contents th { width: 50%; }
+#contents td { padding-left: 10px; }
+#contents td a { font-weight: bold; }
+
+#quickpost th { width: 20%; vertical-align: middle; }
+#quickpost td { width: 100%; }
+
+#comments th { width: 10%; }
+#comments td { width: 100%; white-space: normal; }
+#comments td a { display: inline; }
+
+#drafts th, #linkbacks th, #comments th { font-weight: normal; }
+#drafts th a, #linkbacks th a, #comments th a { font-weight: bold; }
+#drafts th abbr, #linkbacks th abbr, #comments th abbr { color: #666666; }
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/ie.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/ie.css
new file mode 100644
index 0000000..1840905
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/ie.css
@@ -0,0 +1,39 @@
+body { text-align: center; }
+* html body legend { margin: 0px -8px 16px 0; padding: 0; }
+html > body p code { *white-space: normal; }
+
+.container { text-align: left; }
+
+sup { vertical-align: text-top; }
+
+sub { vertical-align: text-bottom; }
+
+hr { margin: -8px auto 11px; }
+
+img { -ms-interpolation-mode: bicubic; }
+
+fieldset { padding-top: 0; }
+
+legend { margin-top: -0.2em; margin-bottom: 1em; margin-left: -0.5em; }
+
+fieldset, #IE8#HACK { padding-top: 1.4em; }
+
+legend, #IE8#HACK { margin-top: 0; margin-bottom: 0; }
+
+textarea { overflow: auto; }
+
+label { position: relative; top: -0.25em; }
+
+input.text { margin: 0.5em 0; background-color: white; border: 1px solid #bbbbbb; }
+input.text:focus { border: 1px solid #666666; }
+input.title { margin: 0.5em 0; background-color: white; border: 1px solid #bbbbbb; }
+input.title:focus { border: 1px solid #666666; }
+input.checkbox { position: relative; top: 0.25em; }
+input.radio { position: relative; top: 0.25em; }
+input.button { position: relative; top: 0.25em; }
+
+textarea { margin: 0.5em 0; }
+
+select { margin: 0.5em 0; }
+
+button { position: relative; top: 0.25em; }
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/jquery.autocomplete.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/jquery.autocomplete.css
new file mode 100644
index 0000000..44747e2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/jquery.autocomplete.css
@@ -0,0 +1,48 @@
+.ac_results {
+ padding: 0px;
+ border: 1px solid #cccccc;
+ background-color: white;
+ overflow: hidden;
+ z-index: 99999;
+}
+
+.ac_results ul {
+ width: 100%;
+ list-style-position: outside;
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.ac_results li {
+ margin: 0px;
+ padding: 2px 5px;
+ cursor: default;
+ display: block;
+ /*
+ if width will be 100% horizontal scrollbar will apear
+ when scroll mode will be used
+ */
+ /*width: 100%;*/
+ font: menu;
+ font-size: 12px;
+ /*
+ it is very important, if line-height not setted or setted
+ in relative units scroll will be broken in firefox
+ */
+ line-height: 16px;
+ overflow: hidden;
+}
+
+.ac_loading {
+ background: white url('indicator.gif') right center no-repeat;
+}
+
+.ac_odd {
+ background-color: #eee;
+}
+
+.ac_over {
+ background-color: #7CA0C7;
+ color: white;
+}
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/print.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/print.css
new file mode 100644
index 0000000..f89d498
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/print.css
@@ -0,0 +1,33 @@
+body { line-height: 1.5; font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; color: black; background: none; font-size: 10pt; }
+
+.container { background: none; }
+
+hr { background: #cccccc; color: #cccccc; width: 100%; height: 2px; margin: 2em 0; padding: 0; border: none; }
+hr.space { background: white; color: white; }
+
+h1, h2, h3, h4, h5, h6 { font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; }
+
+code { font-size: 0.9em; font-family: "andale mono", "lucida console", monospace; }
+
+a img { border: none; }
+a:link, a:visited { background: transparent; font-weight: 700; text-decoration: underline; }
+
+p img.top { margin-top: 0; }
+
+blockquote { margin: 1.5em; padding: 1em; font-style: italic; font-size: 0.9em; }
+
+.small { font-size: 0.9em; }
+
+.large { font-size: 1.1em; }
+
+.quiet { color: #999999; }
+
+.hide { display: none; }
+
+body { font-size: 2em; }
+body a, body a:link, body a:visited, body a:focus, body a:active, body a:hover { text-decoration: none; color: #006699; }
+
+#sidebar, .top-navigation, .commentForm { display: none; }
+
+#header h1 { margin-bottom: 0; }
+#header h1 a { font-size: 2em; font-weight: bold; }
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/screen.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/screen.css
new file mode 100644
index 0000000..e337e26
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/screen.css
@@ -0,0 +1,569 @@
+body { line-height: 1.5; font-family: Arial, Helvetica, sans-serif; color: #333333; font-size: 75%; height:1500px;width:1500px}
+
+h1, h2, h3, h4, h5, h6 { font-weight: normal; color: #176691; border-radius:15px; }
+h1 img, h2 img, h3 img, h4 img, h5 img, h6 img { margin: 0; }
+
+h1 { font-size: 3em; line-height: 1; margin-bottom: 0.50em; }
+
+h2 { font-size: 2em; margin-bottom: 0.05em; }
+
+h3 { font-size: 1em; line-height: 1; margin-bottom: 1.00em; }
+
+h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; }
+
+h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.50em; }
+
+h6 { font-size: 1em; font-weight: bold; }
+
+p { margin: 0 0 1.5em; }
+p .left { display: inline; float: left; margin: 1.5em 1.5em 1.5em 0; padding: 0; }
+p .right { display: inline; float: right; margin: 1.5em 0 1.5em 1.5em; padding: 0; }
+
+a { text-decoration:underline; color: #0888CC; }
+a:visited { color: #006699; }
+a:focus { color: #003366; }
+a:hover { color: #E83E65; }
+a:active { color: #006699; }
+
+blockquote { margin-bottom: 1em; margin-left: 1em; margin-right: 1em; margin-top: 0.5em; color: #666666; font-style: oblique; }
+
+
+strong, dfn { font-weight: bold; }
+
+em, dfn { font-style: italic; }
+
+sup, sub { line-height: 0; }
+
+abbr, acronym { border-bottom: 1px dotted #666666; }
+
+address { margin: 0 0 1.5em; font-style: italic; }
+
+del { color: #666666; }
+
+pre { margin: 1.5em 0; white-space: pre; }
+
+pre, code, tt { font: 1em "andale mono", "lucida console", monospace; line-height: 1.5; }
+
+li ul, li ol { margin: 0; }
+
+ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 1.5em; }
+
+ul { list-style-type: disc; }
+
+ol { list-style-type: decimal; }
+
+dl { margin: 0 0 1.5em 0; }
+dl dt { font-weight: bold; }
+
+dd { margin-left: 1.5em; }
+
+table { margin-bottom: 1.4em; width: 100%; }
+
+th { font-weight: bold; }
+
+thead th { background: #c3d9ff; }
+
+th, td, caption { padding: 4px 10px 4px 5px; }
+
+table.striped tr:nth-child(even) td, table tr.even td { background: #e5ecf9; }
+
+tfoot { font-style: italic; }
+
+caption { background: #eeeeee; }
+
+.quiet { color: #666666; }
+
+.loud { color: #111111; }
+
+.clear { clear: both; }
+
+.nowrap { white-space: nowrap; }
+
+.clearfix { overflow: hidden; *zoom: 1; }
+
+.small { font-size: 0.8em; margin-bottom: 1.875em; line-height: 1.875em; }
+
+.large { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; }
+
+.first { margin-left: 0; padding-left: 0; }
+
+.last { margin-right: 0; padding-right: 0; }
+
+.top { margin-top: 0; padding-top: 0; }
+
+.bottom { margin-bottom: 0; padding-bottom: 0; }
+
+.container { width: 950px; margin: 0 auto; overflow: hidden; *zoom: 1; }
+
+.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 { display: inline; float: left; margin-right: 10px; }
+* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 { overflow-x: hidden; }
+
+.last { margin-right: 0; }
+
+.span-1 { width: 30px; }
+
+.span-2 { width: 70px; }
+
+.span-3 { width: 110px; }
+
+.span-4 { width: 150px; }
+
+.span-5 { width: 190px; }
+
+.span-6 { width: 230px; }
+
+.span-7 { width: 270px; }
+
+.span-8 { width: 310px; }
+
+.span-9 { width: 350px; }
+
+.span-10 { width: 390px; }
+
+.span-11 { width: 430px; }
+
+.span-12 { width: 470px; }
+
+.span-13 { width: 510px; }
+
+.span-14 { width: 550px; }
+
+.span-15 { width: 590px; }
+
+.span-16 { width: 500px; }
+
+.span-17 { width: 670px; }
+
+.span-18 { width: 710px; }
+
+.span-19 { width: 750px; }
+
+.span-20 { width: 790px; }
+
+.span-21 { width: 830px; }
+
+.span-22 { width: 870px; }
+
+.span-23 { width: 910px; }
+
+.span-24 { width: 950px; margin: 0; }
+
+input.span-1, textarea.span-1, select.span-1 { width: 30px; }
+input.span-2, textarea.span-2, select.span-2 { width: 70px; }
+input.span-3, textarea.span-3, select.span-3 { width: 110px; }
+input.span-4, textarea.span-4, select.span-4 { width: 150px; }
+input.span-5, textarea.span-5, select.span-5 { width: 190px; }
+input.span-6, textarea.span-6, select.span-6 { width: 230px; }
+input.span-7, textarea.span-7, select.span-7 { width: 270px; }
+input.span-8, textarea.span-8, select.span-8 { width: 310px; }
+input.span-9, textarea.span-9, select.span-9 { width: 350px; }
+input.span-10, textarea.span-10, select.span-10 { width: 390px; }
+input.span-11, textarea.span-11, select.span-11 { width: 430px; }
+input.span-12, textarea.span-12, select.span-12 { width: 470px; }
+input.span-13, textarea.span-13, select.span-13 { width: 510px; }
+input.span-14, textarea.span-14, select.span-14 { width: 550px; }
+input.span-15, textarea.span-15, select.span-15 { width: 590px; }
+input.span-16, textarea.span-16, select.span-16 { width: 630px; }
+input.span-17, textarea.span-17, select.span-17 { width: 670px; }
+input.span-18, textarea.span-18, select.span-18 { width: 710px; }
+input.span-19, textarea.span-19, select.span-19 { width: 750px; }
+input.span-20, textarea.span-20, select.span-20 { width: 790px; }
+input.span-21, textarea.span-21, select.span-21 { width: 830px; }
+input.span-22, textarea.span-22, select.span-22 { width: 870px; }
+input.span-23, textarea.span-23, select.span-23 { width: 910px; }
+input.span-24, textarea.span-24, select.span-24 { width: 950px; }
+
+.append-1 { padding-right: 40px; }
+
+.append-2 { padding-right: 80px; }
+
+.append-3 { padding-right: 120px; }
+
+.append-4 { padding-right: 160px; }
+
+.append-5 { padding-right: 200px; }
+
+.append-6 { padding-right: 240px; }
+
+.append-7 { padding-right: 280px; }
+
+.append-8 { padding-right: 320px; }
+
+.append-9 { padding-right: 360px; }
+
+.append-10 { padding-right: 400px; }
+
+.append-11 { padding-right: 440px; }
+
+.append-12 { padding-right: 480px; }
+
+.append-13 { padding-right: 520px; }
+
+.append-14 { padding-right: 560px; }
+
+.append-15 { padding-right: 600px; }
+
+.append-16 { padding-right: 640px; }
+
+.append-17 { padding-right: 680px; }
+
+.append-18 { padding-right: 720px; }
+
+.append-19 { padding-right: 760px; }
+
+.append-20 { padding-right: 800px; }
+
+.append-21 { padding-right: 840px; }
+
+.append-22 { padding-right: 880px; }
+
+.append-23 { padding-right: 920px; }
+
+.prepend-1 { padding-left: 40px; }
+
+.prepend-2 { padding-left: 80px; }
+
+.prepend-3 { padding-left: 120px; }
+
+.prepend-4 { padding-left: 160px; }
+
+.prepend-5 { padding-left: 200px; }
+
+.prepend-6 { padding-left: 240px; }
+
+.prepend-7 { padding-left: 280px; }
+
+.prepend-8 { padding-left: 320px; }
+
+.prepend-9 { padding-left: 360px; }
+
+.prepend-10 { padding-left: 400px; }
+
+.prepend-11 { padding-left: 440px; }
+
+.prepend-12 { padding-left: 480px; }
+
+.prepend-13 { padding-left: 520px; }
+
+.prepend-14 { padding-left: 560px; }
+
+.prepend-15 { padding-left: 600px; }
+
+.prepend-16 { padding-left: 640px; }
+
+.prepend-17 { padding-left: 680px; }
+
+.prepend-18 { padding-left: 720px; }
+
+.prepend-19 { padding-left: 760px; }
+
+.prepend-20 { padding-left: 800px; }
+
+.prepend-21 { padding-left: 840px; }
+
+.prepend-22 { padding-left: 880px; }
+
+.prepend-23 { padding-left: 920px; }
+
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 { display: inline; float: left; position: relative; }
+
+.pull-1 { margin-left: -40px; }
+
+.pull-2 { margin-left: -80px; }
+
+.pull-3 { margin-left: -120px; }
+
+.pull-4 { margin-left: -160px; }
+
+.pull-5 { margin-left: -200px; }
+
+.pull-6 { margin-left: -240px; }
+
+.pull-7 { margin-left: -280px; }
+
+.pull-8 { margin-left: -320px; }
+
+.pull-9 { margin-left: -360px; }
+
+.pull-10 { margin-left: -400px; }
+
+.pull-11 { margin-left: -440px; }
+
+.pull-12 { margin-left: -480px; }
+
+.pull-13 { margin-left: -520px; }
+
+.pull-14 { margin-left: -560px; }
+
+.pull-15 { margin-left: -600px; }
+
+.pull-16 { margin-left: -640px; }
+
+.pull-17 { margin-left: -680px; }
+
+.pull-18 { margin-left: -720px; }
+
+.pull-19 { margin-left: -760px; }
+
+.pull-20 { margin-left: -800px; }
+
+.pull-21 { margin-left: -840px; }
+
+.pull-22 { margin-left: -880px; }
+
+.pull-23 { margin-left: -920px; }
+
+.pull-24 { margin-left: -960px; }
+
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 { display: inline; float: left; position: relative; }
+
+.push-1 { margin: 0 -40px 1.5em 40px; }
+
+.push-2 { margin: 0 -80px 1.5em 80px; }
+
+.push-3 { margin: 0 -120px 1.5em 120px; }
+
+.push-4 { margin: 0 -160px 1.5em 160px; }
+
+.push-5 { margin: 0 -200px 1.5em 200px; }
+
+.push-6 { margin: 0 -240px 1.5em 240px; }
+
+.push-7 { margin: 0 -280px 1.5em 280px; }
+
+.push-8 { margin: 0 -320px 1.5em 320px; }
+
+.push-9 { margin: 0 -360px 1.5em 360px; }
+
+.push-10 { margin: 0 -400px 1.5em 400px; }
+
+.push-11 { margin: 0 -440px 1.5em 440px; }
+
+.push-12 { margin: 0 -480px 1.5em 480px; }
+
+.push-13 { margin: 0 -520px 1.5em 520px; }
+
+.push-14 { margin: 0 -560px 1.5em 560px; }
+
+.push-15 { margin: 0 -600px 1.5em 600px; }
+
+.push-16 { margin: 0 -640px 1.5em 640px; }
+
+.push-17 { margin: 0 -680px 1.5em 680px; }
+
+.push-18 { margin: 0 -720px 1.5em 720px; }
+
+.push-19 { margin: 0 -760px 1.5em 760px; }
+
+.push-20 { margin: 0 -800px 1.5em 800px; }
+
+.push-21 { margin: 0 -840px 1.5em 840px; }
+
+.push-22 { margin: 0 -880px 1.5em 880px; }
+
+.push-23 { margin: 0 -920px 1.5em 920px; }
+
+.push-24 { margin: 0 -960px 1.5em 960px; }
+
+.prepend-top { margin-top: 1.5em; }
+
+.append-bottom { margin-bottom: 1.5em; }
+
+.showgrid { background: url('/../img/grid.png?1317027277'); }
+
+.feedback, .error, .alert, .notice, .success, .info { padding: 0.8em; margin-bottom: 1em; border: 2px solid #dddddd; }
+
+.error, .alert { background: #fbe3e4; color: #8a1f11; border-color: #fbc2c4; }
+.error a, .alert a { color: #8a1f11; }
+
+.notice { background: #fff6bf; color: #514721; border-color: #ffd324; }
+.notice a { color: #514721; }
+
+.success { background: #e6efc2; color: #264409; border-color: #c6d880; }
+.success a { color: #264409; }
+
+.info { background: #d5edf8; color: #205791; border-color: #92cae4; }
+.info a { color: #205791; }
+
+.hide { display: none; }
+
+.highlight { background: yellow; }
+
+.added { background: #006600; color: white; }
+
+.removed { background: #990000; color: white; }
+
+label { font-weight: bold; }
+
+fieldset { padding: 1.4em; margin: 0 0 1.5em 0; }
+
+legend { font-weight: bold; font-size: 1.2em; }
+
+input.text, input.title, input[type=email], input[type=text], input[type=password] { margin: 0.5em 0; background-color: white; padding: 5px; }
+input.title { font-size: 1.5em; }
+
+textarea { margin: 0.5em 0; padding: 5px; }
+
+select { margin: 0.5em 0; }
+
+fieldset { border: 1px solid #cccccc; }
+
+input.text, input.title, input[type=email], input[type=text], input[type=password], textarea { background-color: #fff; border: 1px solid #bbbbbb; }
+input.text:focus, input.title:focus, input[type=email]:focus, input[type=text]:focus, input[type=password]:focus, textarea:focus { border: 1px solid #666666; }
+
+select { background-color: #fff; border-width: 1px; border-style: solid; }
+
+input.text, input.title, input[type=email], input[type=text], input[type=password] { width: 300px; }
+
+textarea { width: 390px; height: 250px; }
+
+body { background: transparent url(../img/background.gif) repeat-x scroll left top; }
+
+ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 3.333em; }
+
+a { text-decoration: none; }
+a:hover { text-decoration: underline; }
+
+#header { margin-bottom: 1em; border-bottom: 1px solid #e9e9f3; }
+#header h1 { font-size: 2em; font-weight: bold; margin-bottom: 0; }
+#header .top-navigation { float: right; }
+#header .top-navigation img { border: 0; }
+#header .top-navigation .link { padding-left: 1.5em; }
+#header .top-navigation .sitemap { background: transparent url(../img/sitemap.png) no-repeat scroll left center; }
+#header .top-navigation .feeds { background: transparent url(../img/rss.png) no-repeat scroll left center; }
+
+#breadcrumbs { background-color:#0888CC; font-size: 1.2em; color:white; }
+#b1 {position:relative; center:5%; background-color:#43AEE7; color: white; border: 1px solid #000000; font-size:1em;}
+#b2 {position:relative; center:6%; background-color:#43AEE7; color: white; border: 1px solid #000000; font-size:1em;}
+
+#body { margin-bottom: 1em; border-bottom: 1px solid #e9e9f3; }
+
+#content h1, #content h2, #content h3 { margin-top: 10px; }
+
+/* copied from structure.css */
+#content {
+ position: relative;
+ float: left;
+ clear: both;
+ margin-bottom: 10px;
+ margin-left: 0;
+ margin-right: 60px;
+ margin-top: 10px;
+ padding-right: 30px;
+ width:250px;
+}
+
+#graph {
+ position: absolute;
+ float: left;
+ clear: both;
+ margin-bottom: 10px;
+ margin-left: 0;
+ margin-right: 60px;
+ margin-top: 10px;
+ padding-right: 30px;
+ width: 250px;
+}
+
+/* copied from tools.css */
+.tools {
+ position: relative;
+ float: left;
+ clear: both;
+ padding: 6px 10px;
+ font-size: 11px;
+ font-weight: bold;
+}
+#sidebar{position:absolute; margin-left:600px; margin-right:150px; margin-top:10px; width:300px;}
+#sidebar div:first-child h3 { margin-top:0px; }
+#sidebar h3 { background-color: #C4EBF4; padding: 0.5em; }
+#sidebar p { padding-left: 1em; }
+#sidebar ul, #sidebar ol { padding-left: 2.5em; list-style-image: url(../img/bullet.png); }
+#sidebar li ul, #sidebar li ol { margin: 0 0.0em 0 0; }
+#sidebar input { width: auto; }
+#button {background-color:#43AEE7; color: white;}
+#sidebar .calendar h3 { margin-bottom: 0; }
+#sidebar .calendar .month-navigation { padding-bottom: 1.5em; }
+#sidebar .calendar .month-navigation .month-previous { float: left; }
+#sidebar .calendar .month-navigation .month-next { float: right; }
+#sidebar .tags div { padding: 0 5px 0 18px; }
+#sidebar .tags div ul { list-style-type: none; list-style: none; font-size: 1.5em; line-height: 1.8em; }
+#sidebar .tags div ul, #sidebar .tags div ul li { margin: 0px; padding: 0px; display: inline; }
+#sidebar .tags div ul li { list-style-image: none; list-style-type: none; margin-left: 0px; }
+#sidebar .tags div ul .tag_1 { font-size: 0.75em; color: #001e2d; }
+#sidebar .tags div ul .tag_2 { font-size: 1em; color: #00334c; }
+#sidebar .tags div ul .tag_3 { font-size: 1.125em; color: #005b89; }
+#sidebar .tags div ul .tag_4 { font-size: 2em; color: #0070a8; }
+#sidebar .tags div ul .tag_5 { font-size: 2.25em; color: #0099e5; }
+#sidebar .tags div ul .tag_6 { font-size: 3em; color: #00adff; }
+
+th.month{padding:0cm 2.5cm;}
+table.month { margin-bottom: 0; }
+table.month th.month { text-transform: uppercase; color: #006699; background: none; }
+table.month th { text-transform: capitalize; color: #917E7E; background-color: #C4EBF4; border-radius:15px;}
+table.month td { text-align: center; font-weight: bold; }
+table.month td.objecttype { background-color: #C4EBF4; }
+
+div.paginator { margin-bottom: 1em; }
+div.paginator span { font-size: 1.2em; margin-left: 0.3em; padding: 0 0.5em 0 0.5em; float: left; border: 1px solid #e9e9f3; }
+div.paginator span.index { margin-left: 0; }
+div.paginator span.page:hover, div.paginator span.next:hover, div.paginator span.previous:hover { background-color: #006699; }
+div.paginator span.page:hover a, div.paginator span.next:hover a, div.paginator span.previous:hover a { color: white; }
+div.paginator span.current { border-color: #006699; background-color: #006699; color: white; }
+
+.hobjecttype { margin-bottom: 1em; }
+.hobjecttype .objecttype-header { margin-bottom: 1em; border-radius:15px;}
+.hobjecttype .objecttype-header .objecttype-title { margin: 0; padding-left: 0.25em; padding-right: 0.25em; background-color:#C4EBF4}
+.hobjecttype .objecttype-header .objecttype-info { margin: 0; padding-left: 2em; background: #C4EBF4 url(../img/metatype.png) no-repeat scroll 0.5em; border-radius:15px;}
+.hobjecttype .objecttype-body .objecttype-content { padding-left: 1em; padding-right: 1em; }
+.hobjecttype .objecttype-body .objecttype-image { margin-top: -1.5em; }
+.hobjecttype .objecttype-body .objecttype-image p img { border: 0; margin: 0 1.5em 1.5em 0; }
+.hobjecttype .objecttype-footer p { margin-bottom: 0; }
+.hobjecttype .objecttype-footer p strong { padding-left: 1.5em; }
+.hobjecttype .objecttype-footer .objecttype-tags strong { background: transparent url(../img/tags.png) no-repeat scroll; }
+.hobjecttype .objecttype-footer .objecttype-shorturl strong { background: transparent url(../img/shorturl.png) no-repeat scroll; }
+.hobjecttype .objecttype-footer .objecttype-comments strong { background: transparent url(../img/comments.png) no-repeat scroll; }
+.hobjecttype .objecttype-header { background-color: #C4EBF4; }
+.hobjecttype .objecttype-content p { font-size: 1.2em; }
+.hobjecttype .objecttype-content pre, .hobjecttype .objecttype-content blockquote { overflow: auto; padding: 1em; clear: none; float: none; margin: 0 0 1.5em 0; width: auto; }
+.hobjecttype .objecttype-content blockquote { margin: 0 2em 1.5em 2em; border: 1px dashed #94949e; background-color: #fafaff; }
+.hobjecttype .objecttype-content blockquote p { font-size: 1.5em; margin: 0; }
+.hobjecttype .objecttype-content pre { line-height: 110%; background-color: #e9e9ff; border-top: 1px solid #94949e; border-bottom: 1px solid #94949e; }
+.hobjecttype .objecttype-footer p strong { color: #94949e; }
+
+.objecttype-widgets ul, .objecttype-widgets ol { padding-left: 2.5em; list-style-image: url(../img/bullet.png); }
+
+.featured .objecttype-header { background-color: #c4d9c4; }
+
+.hnodetype { margin-bottom: 1em; }
+.hnodetype .nodetype-header { margin-bottom: 1em; }
+.hnodetype .nodetype-header .nodetype-title { margin: 0; padding-left: 0.25em; padding-right: 0.25em; }
+.hnodetype .nodetype-header .nodetype-info { margin: 0; padding-left: 2em; background: transparent url(../img/Objecttype.png) no-repeat scroll 0.5em; }
+.hnodetype .nodetype-body .nodetype-content { padding-left: 1em; padding-right: 1em; }
+.hnodetype .nodetype-body .nodetype-image { margin-top: -1.5em; }
+.hnodetype .nodetype-body .nodetype-image p img { border: 0; margin: 0 1.5em 1.5em 0; }
+.hnodetype .nodetype-footer p { margin-bottom: 0; }
+.hnodetype .nodetype-footer p strong { padding-left: 1.5em; }
+.hnodetype .nodetype-footer .nodetype-tags strong { background: transparent url(../img/tags.png) no-repeat scroll; }
+.hnodetype .nodetype-footer .nodetype-shorturl strong { background: transparent url(../img/shorturl.png) no-repeat scroll; }
+.hnodetype .nodetype-footer .nodetype-comments strong { background: transparent url(../img/comments.png) no-repeat scroll; }
+.hnodetype .nodetype-header { background-color: #ffffff; }
+.hnodetype .nodetype-content p { font-size: 1.2em; }
+.hnodetype .nodetype-content pre, .hnodetype .nodetype-content blockquote { overflow: auto; padding: 1em; clear: none; float: none; margin: 0 0 1.5em 0; width: auto; }
+.hnodetype .nodetype-content blockquote { margin: 0 2em 1.5em 2em; border: 1px dashed #94949e; background-color: #fafaff; }
+.hnodetype .nodetype-content blockquote p { font-size: 1.5em; margin: 0; }
+.hnodetype .nodetype-content pre { line-height: 110%; background-color: #e9e9ff; border-top: 1px solid #94949e; border-bottom: 1px solid #94949e; }
+.hnodetype .nodetype-footer p strong { color: #94949e; }
+
+.nodetype-widgets ul, .nodetype-widgets ol { padding-left: 2.5em; list-style-image: url(../img/bullet.png); }
+
+.featured .nodetype-header { background-color: #c4d9c4; }
+
+ol#comment-list, ol#pingback-list, ol#trackback-list { width: 100%; margin-bottom: 0; padding-left: 1em; }
+ol#comment-list li, ol#pingback-list li, ol#trackback-list li { margin-bottom: 1em; border: 1px solid #e9e9f3; }
+ol#comment-list li.box2, ol#pingback-list li.box2, ol#trackback-list li.box2 { border-color: #94949e; background-color: #e9e9f3; }
+ol#comment-list li.post-author, ol#pingback-list li.post-author, ol#trackback-list li.post-author { color: #94949e; }
+ol#comment-list li p, ol#pingback-list li p, ol#trackback-list li p { margin-bottom: 0.5em; }
+ol#comment-list li img, ol#pingback-list li img, ol#trackback-list li img { padding: 5px; }
+ol#comment-list li .pingback-body, ol#comment-list li .trackback-body, ol#pingback-list li .pingback-body, ol#pingback-list li .trackback-body, ol#trackback-list li .pingback-body, ol#trackback-list li .trackback-body { padding: 5px; }
+ol#comment-list li .comment-author, ol#comment-list li .pingback-author, ol#comment-list li .trackback-author, ol#pingback-list li .comment-author, ol#pingback-list li .pingback-author, ol#pingback-list li .trackback-author, ol#trackback-list li .comment-author, ol#trackback-list li .pingback-author, ol#trackback-list li .trackback-author { font-size: 1.2em; font-weight: bold; color: #666666; }
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/screen1.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/screen1.css
new file mode 100644
index 0000000..a34236d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/screen1.css
@@ -0,0 +1,505 @@
+body { line-height: 1.5; font-family: Arial, Helvetica, sans-serif; color: #333333; font-size: 75%; }
+
+h1, h2, h3, h4, h5, h6 { font-weight: normal; color: #3399cc; }
+h1 img, h2 img, h3 img, h4 img, h5 img, h6 img { margin: 0; }
+
+h1 { font-size: 3em; line-height: 1; margin-bottom: 0.50em; }
+
+h2 { font-size: 2em; margin-bottom: 0.75em; }
+
+h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1.00em; }
+
+h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; }
+
+h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.50em; }
+
+h6 { font-size: 1em; font-weight: bold; }
+
+p { margin: 0 0 1.5em; }
+p .left { display: inline; float: left; margin: 1.5em 1.5em 1.5em 0; padding: 0; }
+p .right { display: inline; float: right; margin: 1.5em 0 1.5em 1.5em; padding: 0; }
+
+a { text-decoration: underline; color: #006699; }
+a:visited { color: #006699; }
+a:focus { color: #003366; }
+a:hover { color: #003366; }
+a:active { color: #006699; }
+
+blockquote { margin: 1.5em; color: #666666; font-style: italic; }
+
+strong, dfn { font-weight: bold; }
+
+em, dfn { font-style: italic; }
+
+sup, sub { line-height: 0; }
+
+abbr, acronym { border-bottom: 1px dotted #666666; }
+
+address { margin: 0 0 1.5em; font-style: italic; }
+
+del { color: #666666; }
+
+pre { margin: 1.5em 0; white-space: pre; }
+
+pre, code, tt { font: 1em "andale mono", "lucida console", monospace; line-height: 1.5; }
+
+li ul, li ol { margin: 0; }
+
+ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 1.5em; }
+
+ul { list-style-type: disc; }
+
+ol { list-style-type: decimal; }
+
+dl { margin: 0 0 1.5em 0; }
+dl dt { font-weight: bold; }
+
+dd { margin-left: 1.5em; }
+
+table { margin-bottom: 1.4em; width: 100%; }
+
+th { font-weight: bold; }
+
+thead th { background: #c3d9ff; }
+
+th, td, caption { padding: 4px 10px 4px 5px; }
+
+table.striped tr:nth-child(even) td, table tr.even td { background: #e5ecf9; }
+
+tfoot { font-style: italic; }
+
+caption { background: #eeeeee; }
+
+.quiet { color: #666666; }
+
+.loud { color: #111111; }
+
+.clear { clear: both; }
+
+.nowrap { white-space: nowrap; }
+
+.clearfix { overflow: hidden; *zoom: 1; }
+
+.small { font-size: 0.8em; margin-bottom: 1.875em; line-height: 1.875em; }
+
+.large { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; }
+
+.first { margin-left: 0; padding-left: 0; }
+
+.last { margin-right: 0; padding-right: 0; }
+
+.top { margin-top: 0; padding-top: 0; }
+
+.bottom { margin-bottom: 0; padding-bottom: 0; }
+
+.container { width: 950px; margin: 0 auto; overflow: hidden; *zoom: 1; }
+
+.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 { display: inline; float: left; margin-right: 10px; }
+* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 { overflow-x: hidden; }
+
+.last { margin-right: 0; }
+
+.span-1 { width: 30px; }
+
+.span-2 { width: 70px; }
+
+.span-3 { width: 110px; }
+
+.span-4 { width: 150px; }
+
+.span-5 { width: 190px; }
+
+.span-6 { width: 230px; }
+
+.span-7 { width: 270px; }
+
+.span-8 { width: 310px; }
+
+.span-9 { width: 350px; }
+
+.span-10 { width: 390px; }
+
+.span-11 { width: 430px; }
+
+.span-12 { width: 470px; }
+
+.span-13 { width: 510px; }
+
+.span-14 { width: 550px; }
+
+.span-15 { width: 590px; }
+
+.span-16 { width: 630px; }
+
+.span-17 { width: 670px; }
+
+.span-18 { width: 710px; }
+
+.span-19 { width: 750px; }
+
+.span-20 { width: 790px; }
+
+.span-21 { width: 830px; }
+
+.span-22 { width: 870px; }
+
+.span-23 { width: 910px; }
+
+.span-24 { width: 950px; margin: 0; }
+
+input.span-1, textarea.span-1, select.span-1 { width: 30px; }
+input.span-2, textarea.span-2, select.span-2 { width: 70px; }
+input.span-3, textarea.span-3, select.span-3 { width: 110px; }
+input.span-4, textarea.span-4, select.span-4 { width: 150px; }
+input.span-5, textarea.span-5, select.span-5 { width: 190px; }
+input.span-6, textarea.span-6, select.span-6 { width: 230px; }
+input.span-7, textarea.span-7, select.span-7 { width: 270px; }
+input.span-8, textarea.span-8, select.span-8 { width: 310px; }
+input.span-9, textarea.span-9, select.span-9 { width: 350px; }
+input.span-10, textarea.span-10, select.span-10 { width: 390px; }
+input.span-11, textarea.span-11, select.span-11 { width: 430px; }
+input.span-12, textarea.span-12, select.span-12 { width: 470px; }
+input.span-13, textarea.span-13, select.span-13 { width: 510px; }
+input.span-14, textarea.span-14, select.span-14 { width: 550px; }
+input.span-15, textarea.span-15, select.span-15 { width: 590px; }
+input.span-16, textarea.span-16, select.span-16 { width: 630px; }
+input.span-17, textarea.span-17, select.span-17 { width: 670px; }
+input.span-18, textarea.span-18, select.span-18 { width: 710px; }
+input.span-19, textarea.span-19, select.span-19 { width: 750px; }
+input.span-20, textarea.span-20, select.span-20 { width: 790px; }
+input.span-21, textarea.span-21, select.span-21 { width: 830px; }
+input.span-22, textarea.span-22, select.span-22 { width: 870px; }
+input.span-23, textarea.span-23, select.span-23 { width: 910px; }
+input.span-24, textarea.span-24, select.span-24 { width: 950px; }
+
+.append-1 { padding-right: 40px; }
+
+.append-2 { padding-right: 80px; }
+
+.append-3 { padding-right: 120px; }
+
+.append-4 { padding-right: 160px; }
+
+.append-5 { padding-right: 200px; }
+
+.append-6 { padding-right: 240px; }
+
+.append-7 { padding-right: 280px; }
+
+.append-8 { padding-right: 320px; }
+
+.append-9 { padding-right: 360px; }
+
+.append-10 { padding-right: 400px; }
+
+.append-11 { padding-right: 440px; }
+
+.append-12 { padding-right: 480px; }
+
+.append-13 { padding-right: 520px; }
+
+.append-14 { padding-right: 560px; }
+
+.append-15 { padding-right: 600px; }
+
+.append-16 { padding-right: 640px; }
+
+.append-17 { padding-right: 680px; }
+
+.append-18 { padding-right: 720px; }
+
+.append-19 { padding-right: 760px; }
+
+.append-20 { padding-right: 800px; }
+
+.append-21 { padding-right: 840px; }
+
+.append-22 { padding-right: 880px; }
+
+.append-23 { padding-right: 920px; }
+
+.prepend-1 { padding-left: 40px; }
+
+.prepend-2 { padding-left: 80px; }
+
+.prepend-3 { padding-left: 120px; }
+
+.prepend-4 { padding-left: 160px; }
+
+.prepend-5 { padding-left: 200px; }
+
+.prepend-6 { padding-left: 240px; }
+
+.prepend-7 { padding-left: 280px; }
+
+.prepend-8 { padding-left: 320px; }
+
+.prepend-9 { padding-left: 360px; }
+
+.prepend-10 { padding-left: 400px; }
+
+.prepend-11 { padding-left: 440px; }
+
+.prepend-12 { padding-left: 480px; }
+
+.prepend-13 { padding-left: 520px; }
+
+.prepend-14 { padding-left: 560px; }
+
+.prepend-15 { padding-left: 600px; }
+
+.prepend-16 { padding-left: 640px; }
+
+.prepend-17 { padding-left: 680px; }
+
+.prepend-18 { padding-left: 720px; }
+
+.prepend-19 { padding-left: 760px; }
+
+.prepend-20 { padding-left: 800px; }
+
+.prepend-21 { padding-left: 840px; }
+
+.prepend-22 { padding-left: 880px; }
+
+.prepend-23 { padding-left: 920px; }
+
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 { display: inline; float: left; position: relative; }
+
+.pull-1 { margin-left: -40px; }
+
+.pull-2 { margin-left: -80px; }
+
+.pull-3 { margin-left: -120px; }
+
+.pull-4 { margin-left: -160px; }
+
+.pull-5 { margin-left: -200px; }
+
+.pull-6 { margin-left: -240px; }
+
+.pull-7 { margin-left: -280px; }
+
+.pull-8 { margin-left: -320px; }
+
+.pull-9 { margin-left: -360px; }
+
+.pull-10 { margin-left: -400px; }
+
+.pull-11 { margin-left: -440px; }
+
+.pull-12 { margin-left: -480px; }
+
+.pull-13 { margin-left: -520px; }
+
+.pull-14 { margin-left: -560px; }
+
+.pull-15 { margin-left: -600px; }
+
+.pull-16 { margin-left: -640px; }
+
+.pull-17 { margin-left: -680px; }
+
+.pull-18 { margin-left: -720px; }
+
+.pull-19 { margin-left: -760px; }
+
+.pull-20 { margin-left: -800px; }
+
+.pull-21 { margin-left: -840px; }
+
+.pull-22 { margin-left: -880px; }
+
+.pull-23 { margin-left: -920px; }
+
+.pull-24 { margin-left: -960px; }
+
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 { display: inline; float: left; position: relative; }
+
+.push-1 { margin: 0 -40px 1.5em 40px; }
+
+.push-2 { margin: 0 -80px 1.5em 80px; }
+
+.push-3 { margin: 0 -120px 1.5em 120px; }
+
+.push-4 { margin: 0 -160px 1.5em 160px; }
+
+.push-5 { margin: 0 -200px 1.5em 200px; }
+
+.push-6 { margin: 0 -240px 1.5em 240px; }
+
+.push-7 { margin: 0 -280px 1.5em 280px; }
+
+.push-8 { margin: 0 -320px 1.5em 320px; }
+
+.push-9 { margin: 0 -360px 1.5em 360px; }
+
+.push-10 { margin: 0 -400px 1.5em 400px; }
+
+.push-11 { margin: 0 -440px 1.5em 440px; }
+
+.push-12 { margin: 0 -480px 1.5em 480px; }
+
+.push-13 { margin: 0 -520px 1.5em 520px; }
+
+.push-14 { margin: 0 -560px 1.5em 560px; }
+
+.push-15 { margin: 0 -600px 1.5em 600px; }
+
+.push-16 { margin: 0 -640px 1.5em 640px; }
+
+.push-17 { margin: 0 -680px 1.5em 680px; }
+
+.push-18 { margin: 0 -720px 1.5em 720px; }
+
+.push-19 { margin: 0 -760px 1.5em 760px; }
+
+.push-20 { margin: 0 -800px 1.5em 800px; }
+
+.push-21 { margin: 0 -840px 1.5em 840px; }
+
+.push-22 { margin: 0 -880px 1.5em 880px; }
+
+.push-23 { margin: 0 -920px 1.5em 920px; }
+
+.push-24 { margin: 0 -960px 1.5em 960px; }
+
+.prepend-top { margin-top: 1.5em; }
+
+.append-bottom { margin-bottom: 1.5em; }
+
+.showgrid { background: url('/../img/grid.png?1317027277'); }
+
+.feedback, .error, .alert, .notice, .success, .info { padding: 0.8em; margin-bottom: 1em; border: 2px solid #dddddd; }
+
+.error, .alert { background: #fbe3e4; color: #8a1f11; border-color: #fbc2c4; }
+.error a, .alert a { color: #8a1f11; }
+
+.notice { background: #fff6bf; color: #514721; border-color: #ffd324; }
+.notice a { color: #514721; }
+
+.success { background: #e6efc2; color: #264409; border-color: #c6d880; }
+.success a { color: #264409; }
+
+.info { background: #d5edf8; color: #205791; border-color: #92cae4; }
+.info a { color: #205791; }
+
+.hide { display: none; }
+
+.highlight { background: yellow; }
+
+.added { background: #006600; color: white; }
+
+.removed { background: #990000; color: white; }
+
+label { font-weight: bold; }
+
+fieldset { padding: 1.4em; margin: 0 0 1.5em 0; }
+
+legend { font-weight: bold; font-size: 1.2em; }
+
+input.text, input.title, input[type=email], input[type=text], input[type=password] { margin: 0.5em 0; background-color: white; padding: 5px; }
+input.title { font-size: 1.5em; }
+
+textarea { margin: 0.5em 0; padding: 5px; }
+
+select { margin: 0.5em 0; }
+
+fieldset { border: 1px solid #cccccc; }
+
+input.text, input.title, input[type=email], input[type=text], input[type=password], textarea { background-color: #fff; border: 1px solid #bbbbbb; }
+input.text:focus, input.title:focus, input[type=email]:focus, input[type=text]:focus, input[type=password]:focus, textarea:focus { border: 1px solid #666666; }
+
+select { background-color: #fff; border-width: 1px; border-style: solid; }
+
+input.text, input.title, input[type=email], input[type=text], input[type=password] { width: 300px; }
+
+textarea { width: 390px; height: 250px; }
+
+body { background: transparent url(../img/background.gif) repeat-x scroll left top; }
+
+ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 3.333em; }
+
+a { text-decoration: none; }
+a:hover { text-decoration: underline; }
+
+#header { margin-bottom: 1em; border-bottom: 1px solid #e9e9f3; }
+#header h1 { font-size: 4em; font-weight: bold; margin-bottom: 0; }
+#header .top-navigation { float: right; }
+#header .top-navigation img { border: 0; }
+#header .top-navigation .link { padding-left: 1.5em; }
+#header .top-navigation .sitemap { background: transparent url(../img/sitemap.png) no-repeat scroll left center; }
+#header .top-navigation .feeds { background: transparent url(../img/rss.png) no-repeat scroll left center; }
+
+#breadcrumbs { font-size: 1.2em; }
+
+#body { margin-bottom: 1em; border-bottom: 1px solid #e9e9f3; }
+
+#content h1, #content h2, #content h3 { margin-top: 0; }
+
+#sidebar div:first-child h3 { margin-top: 0; }
+#sidebar h3 { background-color: #e9e9f3; padding: 0.5em; }
+#sidebar p { padding-left: 1em; }
+#sidebar ul, #sidebar ol { padding-left: 2.5em; list-style-image: url(../img/bullet.png); }
+#sidebar li ul, #sidebar li ol { margin: 0 1.5em 0 0; }
+#sidebar input { width: auto; }
+#sidebar .calendar h3 { margin-bottom: 0; }
+#sidebar .calendar .month-navigation { padding-bottom: 1.5em; }
+#sidebar .calendar .month-navigation .month-previous { float: left; }
+#sidebar .calendar .month-navigation .month-next { float: right; }
+#sidebar .tags div { padding: 0 5px 0 18px; }
+#sidebar .tags div ul { list-style-type: none; list-style: none; font-size: 1.5em; line-height: 1.8em; }
+#sidebar .tags div ul, #sidebar .tags div ul li { margin: 0px; padding: 0px; display: inline; }
+#sidebar .tags div ul li { list-style-image: none; list-style-type: none; margin-left: 0px; }
+#sidebar .tags div ul .tag_1 { font-size: 0.75em; color: #001e2d; }
+#sidebar .tags div ul .tag_2 { font-size: 1em; color: #00334c; }
+#sidebar .tags div ul .tag_3 { font-size: 1.125em; color: #005b89; }
+#sidebar .tags div ul .tag_4 { font-size: 2em; color: #0070a8; }
+#sidebar .tags div ul .tag_5 { font-size: 2.25em; color: #0099e5; }
+#sidebar .tags div ul .tag_6 { font-size: 3em; color: #00adff; }
+
+table.month { margin-bottom: 0; }
+table.month th.month { text-transform: uppercase; color: #006699; background: none; }
+table.month th { text-transform: capitalize; color: #94949e; background-color: #e9e9f3; }
+table.month td { text-align: center; font-weight: bold; }
+table.month td.gbobject { background-color: #e9e9f3; }
+
+div.paginator { margin-bottom: 1em; }
+div.paginator span { font-size: 1.2em; margin-left: 0.3em; padding: 0 0.5em 0 0.5em; float: left; border: 1px solid #e9e9f3; }
+div.paginator span.index { margin-left: 0; }
+div.paginator span.page:hover, div.paginator span.next:hover, div.paginator span.previous:hover { background-color: #006699; }
+div.paginator span.page:hover a, div.paginator span.next:hover a, div.paginator span.previous:hover a { color: white; }
+div.paginator span.current { border-color: #006699; background-color: #006699; color: white; }
+
+.hgbobject { margin-bottom: 1em; }
+.hgbobject .gbobject-header { margin-bottom: 1em; }
+.hgbobject .gbobject-header .gbobject-title { margin: 0; padding-left: 0.25em; padding-right: 0.25em; }
+.hgbobject .gbobject-header .gbobject-info { margin: 0; padding-left: 2em; background: transparent url(../img/Objecttype.png) no-repeat scroll 0.5em; }
+.hgbobject .gbobject-body .gbobject-content { padding-left: 1em; padding-right: 1em; }
+.hgbobject .gbobject-body .gbobject-image { margin-top: -1.5em; }
+.hgbobject .gbobject-body .gbobject-image p img { border: 0; margin: 0 1.5em 1.5em 0; }
+.hgbobject .gbobject-footer p { margin-bottom: 0; }
+.hgbobject .gbobject-footer p strong { padding-left: 1.5em; }
+.hgbobject .gbobject-footer .gbobject-tags strong { background: transparent url(../img/tags.png) no-repeat scroll; }
+.hgbobject .gbobject-footer .gbobject-shorturl strong { background: transparent url(../img/shorturl.png) no-repeat scroll; }
+.hgbobject .gbobject-footer .gbobject-comments strong { background: transparent url(../img/comments.png) no-repeat scroll; }
+.hgbobject .gbobject-header { background-color: #e9e9f3; }
+.hgbobject .gbobject-content p { font-size: 1.2em; }
+.hgbobject .gbobject-content pre, .hgbobject .gbobject-content blockquote { overflow: auto; padding: 1em; clear: none; float: none; margin: 0 0 1.5em 0; width: auto; }
+.hgbobject .gbobject-content blockquote { margin: 0 2em 1.5em 2em; border: 1px dashed #94949e; background-color: #fafaff; }
+.hgbobject .gbobject-content blockquote p { font-size: 1.5em; margin: 0; }
+.hgbobject .gbobject-content pre { line-height: 110%; background-color: #e9e9ff; border-top: 1px solid #94949e; border-bottom: 1px solid #94949e; }
+.hgbobject .gbobject-footer p strong { color: #94949e; }
+
+.gbobject-widgets ul, .gbobject-widgets ol { padding-left: 2.5em; list-style-image: url(../img/bullet.png); }
+
+.featured .gbobject-header { background-color: #c4d9c4; }
+
+ol#comment-list, ol#pingback-list, ol#trackback-list { width: 100%; margin-bottom: 0; padding-left: 1em; }
+ol#comment-list li, ol#pingback-list li, ol#trackback-list li { margin-bottom: 1em; border: 1px solid #e9e9f3; }
+ol#comment-list li.box2, ol#pingback-list li.box2, ol#trackback-list li.box2 { border-color: #94949e; background-color: #e9e9f3; }
+ol#comment-list li.post-author, ol#pingback-list li.post-author, ol#trackback-list li.post-author { color: #94949e; }
+ol#comment-list li p, ol#pingback-list li p, ol#trackback-list li p { margin-bottom: 0.5em; }
+ol#comment-list li img, ol#pingback-list li img, ol#trackback-list li img { padding: 5px; }
+ol#comment-list li .pingback-body, ol#comment-list li .trackback-body, ol#pingback-list li .pingback-body, ol#pingback-list li .trackback-body, ol#trackback-list li .pingback-body, ol#trackback-list li .trackback-body { padding: 5px; }
+ol#comment-list li .comment-author, ol#comment-list li .pingback-author, ol#comment-list li .trackback-author, ol#pingback-list li .comment-author, ol#pingback-list li .pingback-author, ol#pingback-list li .trackback-author, ol#trackback-list li .comment-author, ol#trackback-list li .pingback-author, ol#trackback-list li .trackback-author { font-size: 1.2em; font-weight: bold; color: #666666; }
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/slider.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/slider.css
new file mode 100644
index 0000000..d3bae53
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/slider.css
@@ -0,0 +1,12 @@
+#slider { width: 400px; padding-right: 230px; position: relative; height: 250px; overflow: hidden; margin-bottom: 5px; }
+#slider ul.ui-tabs-nav { list-style: none; padding: 0; margin: 0; top: 0; left: 400px; width: 230px; position: absolute; overflow: hidden; }
+#slider ul.ui-tabs-nav li a { display: block; height: 49px; border-bottom: 1px solid #e9e9f3; }
+#slider ul.ui-tabs-nav li a img { float: left; border: 0; padding: 3px; width: 78.4px; height: 43px; }
+#slider ul.ui-tabs-nav li a:hover { text-decoration: none; background: #e9e9f3; }
+#slider ul.ui-tabs-nav li.ui-tabs-selected a { background: #44aadd; color: white; }
+#slider div.ui-tabs-panel { position: relative; width: 400px; height: 250px; }
+#slider div.ui-tabs-panel .panel_info { left: 0; bottom: 0; position: absolute; height: 70px; padding: 5px; color: white; background: url(../img/trans.png); width: 390px; }
+#slider div.ui-tabs-panel a { color: #44aadd; }
+#slider div.ui-tabs-panel h2 { margin: 0; overflow: hidden; }
+#slider div.ui-tabs-panel img { width: 400px; height: 250px; }
+#slider .ui-tabs-hide { display: none; }
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_base.sass b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_base.sass
new file mode 100644
index 0000000..9b9f570
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_base.sass
@@ -0,0 +1,32 @@
+// Here is where you can define your constants for your application
+// and to configure the blueprint framework.
+
+$blueprint_grid_columns: 24
+$blueprint_container_size: 950px
+$blueprint_grid_margin: 10px
+
+// Use this to calculate the width based on the total width.
+// Or you can set !blueprint_grid_width to a fixed value
+// and unset !blueprint_container_size -- it will be calculated for you.
+
+$blueprint_font_size: 12px
+$blueprint_font_family: unquote("Arial, Helvetica, sans-serif")
+$blueprint_grid_width: ($blueprint_container_size + $blueprint_grid_margin) / $blueprint_grid_columns - $blueprint_grid_margin
+
+// Colors
+$font_color: #333333
+$link_color: #006699
+$box_color: #e9e9f3
+
+// Derived colors
+$box_font_color: $box_color - #555555
+$link_hover_color: $link_color - #333333
+$link_active_color: $link_color
+$link_visited_color: $link_color
+$header_color: $link_color + #333333
+
+// Mixins
+@import gbobject
+@import calendar
+@import paginator
+@import tag-cloud
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_calendar.sass b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_calendar.sass
new file mode 100644
index 0000000..d3c18d5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_calendar.sass
@@ -0,0 +1,15 @@
+=calendar($head_color, $box_color, $box_font_color)
+ margin-bottom: 0
+ th.month
+ text-transform: uppercase
+ color: $head_color
+ background: none
+ th
+ text-transform: capitalize
+ color: $box_font_color
+ background-color: $box_color
+ td
+ text-align: center
+ font-weight: bold
+ &.gbobject
+ background-color: $box_color
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_gbobject.sass b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_gbobject.sass
new file mode 100644
index 0000000..5805303
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_gbobject.sass
@@ -0,0 +1,35 @@
+=gbobject
+ margin-bottom: 1em
+ .gbobject-header
+ margin-bottom: 1em
+ .gbobject-title
+ margin: 0
+ padding-left: 0.25em
+ padding-right: 0.25em
+ .gbobject-info
+ margin: 0
+ padding-left: 2em
+ background: transparent url(../img/Objecttype.png) no-repeat scroll 0.5em
+ .gbobject-body
+ .gbobject-content
+ padding-left: 1em
+ padding-right: 1em
+ .gbobject-image
+ margin-top: -1.5em
+ p img
+ border: 0
+ margin: 0 1.5em 1.5em 0
+ .gbobject-footer
+ p
+ margin-bottom: 0
+ strong
+ padding-left: 1.5em
+ .gbobject-tags
+ strong
+ background: transparent url(../img/tags.png) no-repeat scroll
+ .gbobject-shorturl
+ strong
+ background: transparent url(../img/shorturl.png) no-repeat scroll
+ .gbobject-comments
+ strong
+ background: transparent url(../img/comments.png) no-repeat scroll
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_paginator.sass b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_paginator.sass
new file mode 100644
index 0000000..b1258fc
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_paginator.sass
@@ -0,0 +1,19 @@
+=paginator($link_color, $box_color)
+ margin-bottom: 1em
+ span
+ font-size: 1.2em
+ margin-left: 0.3em
+ padding: 0 0.5em 0 0.5em
+ float: left
+ border: 1px solid $box_color
+ &.index
+ margin-left: 0
+ &.page, &.next, &.previous
+ &:hover
+ background-color: $link_color
+ a
+ color: white
+ &.current
+ border-color: $link_color
+ background-color: $link_color
+ color: white
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_tag-cloud.sass b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_tag-cloud.sass
new file mode 100644
index 0000000..6d859b6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/_tag-cloud.sass
@@ -0,0 +1,21 @@
+=tag-cloud($link_color, $base_size: 1em)
+ font-size: $base_size
+ line-height: 1.2 * $base_size
+ .tag_1
+ font-size: $base_size / 2
+ color: $link_color * 0.3
+ .tag_2
+ font-size: 2 * $base_size / 3
+ color: $link_color * 0.5
+ .tag_3
+ font-size: 3 * $base_size / 4
+ color: $link_color * 0.9
+ .tag_4
+ font-size: 4 * $base_size / 3
+ color: $link_color * 1.1
+ .tag_5
+ font-size: 3 * $base_size / 2
+ color: $link_color * 1.5
+ .tag_6
+ font-size: 2 * $base_size
+ color: $link_color * 1.7 \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/dashboard_objectapp.sass b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/dashboard_objectapp.sass
new file mode 100644
index 0000000..1aa979d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/dashboard_objectapp.sass
@@ -0,0 +1,66 @@
+body
+ &.dashboard
+ #content
+ width: 75%
+
+.module
+ width: 400px
+ margin-right: 5px
+ table
+ width: 100%
+ th, td
+ font-size: 12px
+
+.managelink
+ background: url("../img/manage.png") no-repeat scroll 0 0.2em transparent
+ padding-left: 12px
+
+.previewlink
+ background: url("../img/preview.png") no-repeat scroll 0 0.2em transparent
+ padding-left: 12px
+
+input, textarea, select
+ border: 1px solid #cccccc
+
+.vTextField, .vLargeTextField
+ width: 25em
+
+.required label, label.required
+ color: #333333 !important
+ font-weight: bold !important
+
+.button
+ float: left
+ margin-right: 5px
+
+#contents
+ th
+ width: 50%
+ td
+ padding-left: 10px
+ a
+ font-weight: bold
+
+#quickpost
+ th
+ width: 20%
+ vertical-align: middle
+ td
+ width: 100%
+
+#comments
+ th
+ width: 10%
+ td
+ width: 100%
+ white-space: normal
+ a
+ display: inline
+
+#drafts, #linkbacks, #comments
+ th
+ font-weight: normal
+ a
+ font-weight: bold
+ abbr
+ color: #666666
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/ie.sass b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/ie.sass
new file mode 100644
index 0000000..5bad66b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/ie.sass
@@ -0,0 +1,3 @@
+@import blueprint
+
++blueprint-ie
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/print.sass b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/print.sass
new file mode 100644
index 0000000..6453761
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/print.sass
@@ -0,0 +1,22 @@
+@import blueprint
+@import compass/utilities/links/link-colors
+
+$link_color: #006699
+
++blueprint-print
+
+body
+ font-size: 2em
+ a, a:link, a:visited, a:focus, a:active, a:hover
+ text-decoration: none
+ color: $link_color
+
+#sidebar, .top-navigation, .commentForm
+ display: none
+
+#header
+ h1
+ margin-bottom: 0
+ a
+ font-size: 2em
+ font-weight: bold \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/screen.sass b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/screen.sass
new file mode 100644
index 0000000..f4d7765
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/screen.sass
@@ -0,0 +1,160 @@
+@import base
+@import blueprint
+@import compass/utilities/lists/bullets
+@import compass/utilities/lists/inline-list
+@import compass/utilities/links/hover-link
+
++blueprint
+
+// Global
+body
+ background: transparent url(../img/background.gif) repeat-x scroll left top
+
+ul, ol
+ margin: 0 1.5em 1.5em 0
+ padding-left: 3.333em
+a
+ +hover-link
+
+// Header
+#header
+ margin-bottom: 1em
+ border-bottom: 1px solid $box_color
+ h1
+ font-size: 4em
+ font-weight: bold
+ margin-bottom: 0
+ .top-navigation
+ float: right
+ img
+ border: 0
+ .link
+ padding-left: 1.5em
+ .sitemap
+ background: transparent url(../img/sitemap.png) no-repeat scroll left center
+ .feeds
+ background: transparent url(../img/rss.png) no-repeat scroll left center
+
+// Breadcrumbs
+#breadcrumbs
+ font-size: 1.2em
+
+// Body
+#body
+ margin-bottom: 1em
+ border-bottom: 1px solid $box_color
+
+// Content
+#content
+ h1, h2, h3
+ margin-top: 0
+
+// Sidebar
+#sidebar
+ div:first-child
+ h3
+ margin-top: 0
+ h3
+ background-color: $box_color
+ padding: 0.5em
+ p
+ padding-left: 1em
+ ul, ol
+ padding-left: 2.5em
+ list-style-image: url(../img/bullet.png)
+ li ul, li ol
+ margin: 0 1.5em 0 0
+ input
+ width: auto
+ .calendar
+ h3
+ margin-bottom: 0
+ .month-navigation
+ padding-bottom: 1.5em
+ .month-previous
+ float: left
+ .month-next
+ float: right
+ .tags
+ div
+ padding: 0 5px 0 18px
+ ul
+ +inline-list
+ +no-bullets
+ +tag-cloud($link_color, 1.5em)
+
+// Calendar
+table.month
+ +calendar($link_color, $box_color, $box_font_color)
+
+// Pagination
+div.paginator
+ +paginator($link_color, $box_color)
+
+// Gbobject
+.hgbobject
+ +gbobject
+ .gbobject-header
+ background-color: $box_color
+ .gbobject-content
+ p
+ font-size: 1.2em
+ pre, blockquote
+ overflow: auto
+ padding: 1em
+ clear: none
+ float: none
+ margin: 0 0 1.5em 0
+ width: auto
+
+ blockquote
+ margin: 0 2em 1.5em 2em
+ border: 1px dashed $box_font_color
+ background-color: $box_color + #111
+ p
+ font-size: 1.5em
+ margin: 0
+ pre
+ line-height: 110%
+ background-color: $box_color + #002
+ border-top: 1px solid $box_font_color
+ border-bottom: 1px solid $box_font_color
+
+ .gbobject-footer
+ p
+ strong
+ color: $box_font_color
+
+.gbobject-widgets
+ ul, ol
+ padding-left: 2.5em
+ list-style-image: url(../img/bullet.png)
+
+.featured
+ .gbobject-header
+ background-color: #C4D9C4
+
+// Discussions
+ol#comment-list, ol#pingback-list, ol#trackback-list
+ width: 100%
+ margin-bottom: 0
+ padding-left: 1em
+ li
+ margin-bottom: 1em
+ border: 1px solid $box_color
+ &.box2
+ border-color: $box_font_color
+ background-color: $box_color
+ &.post-author
+ color: $box_font_color
+ p
+ margin-bottom: 0.5em
+ img
+ padding: 5px
+ .pingback-body, .trackback-body
+ padding: 5px
+ .comment-author, .pingback-author, .trackback-author,
+ font-size: 1.2em
+ font-weight: bold
+ color: #666
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/slider.sass b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/slider.sass
new file mode 100644
index 0000000..7172745
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/src/slider.sass
@@ -0,0 +1,74 @@
+@import base
+
+$max_width: 630px
+$number_of_items: 5
+
+$slider_width: 400px
+$slider_height: 250px
+$slider_color: $link_color + #444444
+
+$nav_padding: 3px
+$info_padding: 5px
+
+$tab_nav_width: $max_width - $slider_width
+$tab_nav_height: $slider_height / $number_of_items - 1
+$tab_nav_img_height: $tab_nav_height - $nav_padding * 2
+$tab_nav_img_width: $tab_nav_height * $slider_width / $slider_height
+
+#slider
+ width: $slider_width
+ padding-right: $tab_nav_width
+ position: relative
+ height: $slider_height
+ overflow: hidden
+ margin-bottom: 5px
+ ul.ui-tabs-nav
+ list-style: none
+ padding: 0
+ margin: 0
+ top: 0
+ left: $slider_width
+ width: $tab_nav_width
+ position: absolute
+ overflow: hidden
+ li
+ a
+ display: block
+ height: $tab_nav_height
+ border-bottom: 1px solid $box_color
+ img
+ float: left
+ border: 0
+ padding: $nav_padding
+ width: $tab_nav_img_width
+ height: $tab_nav_img_height
+ a:hover
+ text-decoration: none
+ background: $box_color
+ &.ui-tabs-selected
+ a
+ background: $slider_color
+ color: white
+ div.ui-tabs-panel
+ position: relative
+ width: $slider_width
+ height: $slider_height
+ .panel_info
+ left: 0
+ bottom: 0
+ position: absolute
+ height: 70px
+ padding: $info_padding
+ color: white
+ background: url(../img/trans.png)
+ width: $slider_width - $info_padding * 2
+ a
+ color: $slider_color
+ h2
+ margin: 0
+ overflow: hidden
+ img
+ width: $slider_width
+ height: $slider_height
+ .ui-tabs-hide
+ display: none
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/structures.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/structures.css
new file mode 100644
index 0000000..fd44c5a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/structures.css
@@ -0,0 +1,662 @@
+
+
+
+/* Body
+------------------------------------------------------------------------------------------------------ */
+
+body {
+ padding: 58px 20px 0;
+ font-family: Arial, sans-serif;
+ font-size: 12px;
+ line-height: 16px;
+}
+body.popup {
+ padding-top: 0;
+}
+
+
+
+/* Container
+------------------------------------------------------------------------------------------------------ */
+
+#container {
+ z-index: 0;
+ position: relative;
+ float: left;
+ clear: both;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+
+
+/* Header
+------------------------------------------------------------------------------------------------------ */
+
+#header {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1100;
+ padding: 0 20px;
+ width: 100%;
+ height: 30px;
+ font-size: 11px;
+ line-height: 14px;
+ font-weight: bold;
+}
+body.filebrowser.popup #header {
+ display: none;
+}
+
+
+
+/* Branding, Bookmarks & User-Tools
+------------------------------------------------------------------------------------------------------ */
+
+.branding, .admin-title,
+#bookmarks li, #user-tools li {
+ margin: 0;
+ padding: 8px 10px;
+}
+.branding {
+ display: none;
+ position: relative;
+ float: right;
+ width: 10px;
+ background: url('../img/grappelli-icon.png') 50% 50% no-repeat;
+}
+.admin-title {
+ position: relative;
+ float: left;
+ margin: 0 0 0 -20px;
+ padding-left: 20px;
+ padding-right: 20px;
+}
+#header ul li {
+ position: relative;
+ float: left;
+}
+
+
+/* Navigation Menu (UL Navigation-Menu of Admin-Tools) ................................................... */
+
+ul.navigation-menu {
+ position: relative;
+ float: left;
+}
+ul.navigation-menu li {
+ float: none !important;
+}
+ul.navigation-menu>li {
+ position: relative;
+ float: none !important;
+ display: block;
+ margin: 0;
+}
+ul.navigation-menu>li>a {
+ display: block;
+ padding: 8px 10px;
+ font-size: 11px !important;
+}
+ul.navigation-menu li.bookmark,
+ul.navigation-menu li.actions {
+ float: left !important;
+}
+ul.navigation-menu li ul {
+ position: absolute;
+ z-index: 1 !important;
+ float: none !important;
+ margin-top: -1px;
+ padding: 0;
+ min-width: 220px;
+ white-space: nowrap;
+
+/* box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;*/
+}
+ul.navigation-menu>li>a+ul {
+ overflow-x: hidden !important;
+/* padding-right: 20px;*/
+/* width: 500px;*/
+ box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;
+ box-shadow: 0 0 20px #333; -moz-box-shadow: 0 0 20px #333; -webkit-box-shadow: 0 0 20px #333;
+}
+ul.navigation-menu>li>ul>li.parent {
+ overflow-x: hidden !important;
+}
+
+ul.navigation-menu li ul ul {
+ position: relative;
+ float: none;
+ margin-top: 0;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ overflow: inherit;
+}
+
+ul.navigation-menu li li.item-collapse.item-open {
+ background: #3a3a3a;
+}
+ul.navigation-menu li li li.item-collapse.item-open {
+/* border: 1px solid #383838;*/
+ -moz-border-radius: 4px;
+ background: #424242;
+}
+ul.navigation-menu li li li.item-collapse.item-open + li {
+/* border: 0 !important;*/
+}
+ul.navigation-menu li li li li.item-collapse.item-open {
+/* border: 1px solid #404040;*/
+ background: #4a4a4a;
+}
+ul.navigation-menu li li li li.item-collapse.oitem-pen + li {
+/* border: 0 !important;*/
+}
+ul.navigation-menu li li li li li.item-collapse.item-open {
+/* border: 1px solid #484848;*/
+ background: #525252;
+}
+
+
+ul.navigation-menu li li {
+/* padding: 0 10px;*/
+}
+ul.navigation-menu li li li {
+/* margin: 0 -20px 0 -10px;*/
+/* padding: 0 10px 0 20px;*/
+ box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;
+}
+ul.navigation-menu li li li li {
+/* margin: 0 -10px 0 -20px;*/
+/* padding: 0 10px 0 30px;*/
+/* box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;*/
+}
+ul.navigation-menu li li li li li {
+/* margin: 0 -10px 0 -30px;*/
+/* padding: 0 10px 0 40px;*/
+ overflow: hidden;
+/* box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;*/
+}
+ul.navigation-menu li li li li li li {
+/* margin: 0 0 0 -40px;*/
+/* padding: 0 10px 0 50px;*/
+ overflow: hidden;
+/* box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;*/
+}
+
+
+ul.navigation-menu li li.last {
+ border-bottom: 0 !important;
+}
+
+ul.navigation-menu li ul ul>li:first-child a {
+/* margin-left: -10px;*/
+/* padding-left: 10px;*/
+}
+ul.navigation-menu li li a {
+ display: block;
+ padding: 8px 10px;
+ font-size: 11px;
+}
+ul.navigation-menu li li li a {
+ padding: 4px 10px 4px 20px;
+ font-size: 11px;
+ white-space: normal;
+}
+ul.navigation-menu li li li li a {
+ padding-left: 30px;
+}
+ul.navigation-menu li li li li li a {
+ padding-left: 40px;
+}
+ul.navigation-menu li li li li li li a {
+ padding-left: 50px;
+}
+ul.navigation-menu li.parent>a {
+ font-size: 11px;
+}
+ul.navigation-menu li li.parent>a {
+ font-size: 11px;
+}
+
+ul.navigation-menu li.item-collapse.item-closed>* {
+ display: none !important;
+}
+ul.navigation-menu li.item-collapse.item-open>* {
+ display: block !important;
+}
+
+ul.navigation-menu li.item-collapse a.item-collapse-handler-container {
+ display: block !important;
+/* padding: 10px 0 !important;*/
+}
+
+form#bookmark-form {
+ position: relative;
+ float: left;
+ padding: 3px 10px 1px 0;
+ height: 26px;
+}
+form#bookmark-form button {
+ position: relative; display: block;
+ margin: 3px 0 0;
+ width: 20px;
+ height: 20px;
+}
+
+ul.navigation-menu li.item-collapse a.item-collapse-handler {
+ position: relative;
+ float: right;
+ display: inline-block !important;
+ right: 0;
+ margin: -30px 0 -30px 0;
+ padding: 0;
+ width: 28px;
+ height: 30px;
+ cursor: pointer;
+}
+ul.navigation-menu li li li.item-collapse a.item-collapse-handler {
+ margin: -22px 0;
+ width: 28px;
+ height: 22px;
+}
+a.item-collapse-handler-container {
+ padding-right: 38px !important;
+}
+ul.navigation-menu li li.item-collapse.item-closed>a+a.item-collapse-handler:link,
+ul.navigation-menu li li.item-collapse.item-closed>a+a.item-collapse-handler:visited {
+ background: transparent url("../img/icons/icon-admin_tools-dropdown.png") no-repeat scroll 50% 50%;
+}
+ul.navigation-menu li li.item-collapse.item-closed>a+a.item-collapse-handler:hover,
+ul.navigation-menu li li.item-collapse.item-closed>a+a.item-collapse-handler:active {
+ background: transparent url("../img/icons/icon-admin_tools-dropdown-hover.png") no-repeat scroll 50% 50%;
+}
+ul.navigation-menu li li.item-collapse.item-open>a+a.item-collapse-handler:link,
+ul.navigation-menu li li.item-collapse.item-open>a+a.item-collapse-handler:visited {
+ background: transparent url("../img/icons/icon-admin_tools-dropdown-active.png") no-repeat scroll 50% 50%;
+}
+ul.navigation-menu li li.item-collapse.item-open>a+a.item-collapse-handler:hover,
+ul.navigation-menu li li.item-collapse.item-open>a+a.item-collapse-handler:active {
+ background: transparent url("../img/icons/icon-admin_tools-dropdown-active-hover.png") no-repeat scroll 50% 50%;
+}
+
+
+/* User Tools ................................................... */
+
+#user-tools {
+ position: absolute;
+ right: 40px;
+}
+#user-tools>li:last-child {
+ padding-right: 20px;
+}
+
+#user-tools li.user-options-container {
+ position: relative;
+ width: 200px;
+}
+
+li.user-options-container.open a.user-options-handler {
+ display: block;
+}
+ul.user-options {
+ display: none;
+}
+li.user-options-container.open ul.user-options {
+ display: block;
+ position: absolute;
+ float: none;
+ clear: both;
+ z-index: 1000;
+ margin: 7px -10px 0;
+ width: 221px;
+}
+ul.user-options li {
+ float: none !important;
+ clear: both;
+}
+ul.user-options li a {
+ display: block;
+}
+
+
+
+/* Breadcrumbs
+------------------------------------------------------------------------------------------------------ */
+
+div#breadcrumbs {
+ position: fixed;
+ top: 30px;
+ left: 0;
+ z-index: 1000;
+ padding: 5px 10px 5px 20px;
+ width: 100%;
+ font-size: 11px;
+/* font-weight: bold;*/
+ text-align: left;
+}
+div#breadcrumbs > a {
+ padding: 10px 2px;
+}
+body.popup div#breadcrumbs {
+ top: 0;
+}
+
+
+
+/* Messages
+------------------------------------------------------------------------------------------------------ */
+
+ul.messagelist {
+ position: relative;
+ top: 0;
+ z-index: 990;
+ margin: 0 -20px;
+}
+ul.messagelist li {
+ display: block;
+ padding: 5px 10px 5px 20px;
+ font-size: 11px;
+ font-weight: bold;
+}
+body.popup .breadcrumbs + ul.messagelist {
+ top: 24px;
+}
+body.filebrowser.popup ul.messagelist {
+ top: 28px;
+}
+body.login ul.messagelist {
+ top: -28px;
+}
+
+
+/* Masthead
+------------------------------------------------------------------------------------------------------ */
+
+#masthead {
+ position: relative;
+ float: left;
+ clear: both;
+ z-index: 900;
+ padding: 60px 0 10px;
+ width: 100%;
+}
+
+
+
+/* Login Form
+------------------------------------------------------------------------------------------------------ */
+
+div.login {
+ top: -30px;
+}
+#login-form {
+ margin: 0 auto;
+}
+
+
+
+/* Content
+------------------------------------------------------------------------------------------------------ */
+
+#content {
+ position: relative;
+ float: left;
+ clear: both;
+ margin:0 0 80px;
+
+ padding-right: 10px;
+ width: 50%;
+}
+#content.content-flexible {
+ width: 100%;
+}
+body.filebrowser.popup #content {
+ top: 28px;
+}
+
+
+
+/* Container
+------------------------------------------------------------------------------------------------------ */
+
+.container,
+.container-grid {
+ position: relative;
+ float: left;
+ clear: both;
+ width: 940px;
+}
+.container-flexible {
+ position: relative;
+ float: none;
+ clear: both;
+ width: auto;
+ height: 100%;
+}
+
+
+
+/* Blueprint Grid Columns & Spans
+------------------------------------------------------------------------------------------------------ */
+
+.column {
+ position: relative;
+ float: left;
+}
+.column.centered {
+ position: relative;
+ float: none !important;
+ margin: 0 auto !important;
+}
+.span-flexible {
+ position: relative;
+ width: 100%;
+}
+.container-flexible.layout-flexible-grid .span-flexible {
+ float: left;
+ margin-right: 20px;
+ width: 100%;
+}
+.container-flexible.layout-flexible-grid .span-flexible + .column {
+ float: left !important;
+}
+.container-flexible.layout-grid-flexible .column {
+ float: left;
+}
+.container-flexible.layout-grid-flexible .span-flexible {
+ float: left;
+ width: 100%;
+}
+fieldset.module .row .column:first-child {
+ margin-left: 0 !important;
+}
+fieldset.module .row .column:last-child {
+ margin-right: -20px !important;
+}
+fieldset.module .row .column.span-flexible:last-child {
+ margin-right: 0 !important;
+}
+.row .span-flexible,
+.row .span-flexible:last-child {
+ float: none;
+ width: auto;
+ margin-right: 0 !important;
+}
+
+
+/* Basic Float & Margin ......................................... */
+
+.span-1, .span-2, .span-3, .span-4, .span-5, .span-6,
+.span-7, .span-8, .span-9, .span-10, .span-11, .span-12,
+.span-13, .span-14, .span-15, .span-16, .span-17, .span-18,
+.span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {
+/* float: left;*/
+ margin-right: 20px;
+}
+.column.last { margin-right: 0; }
+
+
+/* Column Widths ......................................... */
+
+.span-1 { width: 20px; }
+.span-2 { width: 60px; }
+.span-3 { width: 100px; }
+.span-4 { width: 140px; }
+.span-5 { width: 180px; }
+.span-6 { width: 220px; }
+.span-7 { width: 260px; }
+.span-8 { width: 300px; }
+.span-9 { width: 340px; }
+.span-10 { width: 380px; }
+.span-11 { width: 420px; }
+.span-12 { width: 460px; }
+.span-13 { width: 500px; }
+.span-14 { width: 540px; }
+.span-15 { width: 580px; }
+.span-16 { width: 620px; }
+.span-17 { width: 660px; }
+.span-18 { width: 700px; }
+.span-19 { width: 740px; }
+.span-20 { width: 780px; }
+.span-21 { width: 820px; }
+.span-22 { width: 860px; }
+.span-23 { width: 900px; }
+.span-24 { width: 940px; margin: 0; }
+
+
+/* Append empty columns ......................................... */
+
+.append-1 { padding-right: 40px; }
+.append-2 { padding-right: 80px; }
+.append-3 { padding-right: 120px; }
+.append-4 { padding-right: 160px; }
+.append-5 { padding-right: 200px; }
+.append-6 { padding-right: 240px; }
+.append-7 { padding-right: 280px; }
+.append-8 { padding-right: 320px; }
+.append-9 { padding-right: 360px; }
+.append-10 { padding-right: 400px; }
+.append-11 { padding-right: 440px; }
+.append-12 { padding-right: 480px; }
+.append-13 { padding-right: 520px; }
+.append-14 { padding-right: 560px; }
+.append-15 { padding-right: 600px; }
+.append-16 { padding-right: 640px; }
+.append-17 { padding-right: 680px; }
+.append-18 { padding-right: 720px; }
+.append-19 { padding-right: 760px; }
+.append-20 { padding-right: 800px; }
+.append-21 { padding-right: 840px; }
+.append-22 { padding-right: 880px; }
+.append-23 { padding-right: 920px; }
+
+
+/* Prepend empty columns ......................................... */
+
+.prepend-1 { padding-left: 40px; }
+.prepend-2 { padding-left: 80px; }
+.prepend-3 { padding-left: 120px; }
+.prepend-4 { padding-left: 160px; }
+.prepend-5 { padding-left: 200px; }
+.prepend-6 { padding-left: 240px; }
+.prepend-7 { padding-left: 280px; }
+.prepend-8 { padding-left: 320px; }
+.prepend-9 { padding-left: 360px; }
+.prepend-10 { padding-left: 400px; }
+.prepend-11 { padding-left: 440px; }
+.prepend-12 { padding-left: 480px; }
+.prepend-13 { padding-left: 520px; }
+.prepend-14 { padding-left: 560px; }
+.prepend-15 { padding-left: 600px; }
+.prepend-16 { padding-left: 640px; }
+.prepend-17 { padding-left: 680px; }
+.prepend-18 { padding-left: 720px; }
+.prepend-19 { padding-left: 760px; }
+.prepend-20 { padding-left: 800px; }
+.prepend-21 { padding-left: 840px; }
+.prepend-22 { padding-left: 880px; }
+.prepend-23 { padding-left: 920px; }
+
+
+/* Span-X + Span-Flexible ......................................... */
+
+.span-1 + .span-flexible { margin-left: 40px; }
+.span-2 + .span-flexible { margin-left: 80px; }
+.span-3 + .span-flexible { margin-left: 120px; }
+.span-4 + .span-flexible { margin-left: 160px; Xmin-width: 758px; }
+.span-5 + .span-flexible { margin-left: 200px; }
+.span-6 + .span-flexible { margin-left: 240px; }
+.span-7 + .span-flexible { margin-left: 280px; }
+.span-8 + .span-flexible { margin-left: 320px; }
+.span-9 + .span-flexible { margin-left: 360px; }
+.span-10 + .span-flexible { margin-left: 400px; }
+.span-11 + .span-flexible { margin-left: 440px; }
+.span-12 + .span-flexible { margin-left: 480px; }
+.span-13 + .span-flexible { margin-left: 520px; }
+.span-14 + .span-flexible { margin-left: 560px; }
+.span-15 + .span-flexible { margin-left: 600px; }
+.span-16 + .span-flexible { margin-left: 640px; }
+.span-17 + .span-flexible { margin-left: 680px; }
+.span-18 + .span-flexible { margin-left: 720px; }
+.span-19 + .span-flexible { margin-left: 760px; }
+.span-20 + .span-flexible { margin-left: 800px; }
+.span-21 + .span-flexible { margin-left: 840px; }
+.span-22 + .span-flexible { margin-left: 880px; }
+.span-23 + .span-flexible { margin-left: 920px; }
+.span-24 + .span-flexible { margin-left: 960px; }
+
+
+/* Columns in Cells ......................................... */
+
+.cell.span-1 { width: 0px; }
+.cell.span-2 { width: 40px; }
+.cell.span-3 { width: 80px; }
+.cell.span-4 { width: 120px; }
+.cell.span-5 { width: 160px; }
+.cell.span-6 { width: 200px; }
+.cell.span-7 { width: 240px; }
+.cell.span-8 { width: 280px; }
+.cell.span-9 { width: 330px; }
+.cell.span-10 { width: 360px; }
+.cell.span-11 { width: 400px; }
+.cell.span-12 { width: 440px; }
+.cell.span-13 { width: 480px; }
+.cell.span-14 { width: 520px; }
+.cell.span-15 { width: 560px; }
+.cell.span-16 { width: 600px; }
+.cell.span-17 { width: 640px; }
+.cell.span-18 { width: 680px; }
+.cell.span-19 { width: 720px; }
+.cell.span-20 { width: 760px; }
+.cell.span-21 { width: 800px; }
+.cell.span-22 { width: 840px; }
+.cell.span-23 { width: 880px; }
+.cell.span-24 { width: 920px; margin: 0; }
+
+
+/* Clearing floats without extra markup
+ Based on How To Clear Floats Without Structural Markup by PiE
+ [http://www.positioniseverything.net/easyclearing.html] */
+
+.clearfix:after, .container:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+}
+.clearfix, .container { display: inline-block; }
+* html .clearfix,
+* html .container { height: 1%; }
+.clearfix, .container { display: block; }
+
+/* Regular clearing
+ apply to column that should drop below previous ones. */
+
+.clear { clear: both; }
+
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/wymeditor_styles.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/wymeditor_styles.css
new file mode 100644
index 0000000..fb2f569
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/css/wymeditor_styles.css
@@ -0,0 +1,45 @@
+/* EDITOR RELATED STYLES - CUSTOMIZE FOR YOUR NEEDS */
+/*
+ The classes panel, the visual feedback and the preview
+ will be affected by these values.
+
+ - Commented styles inside style definitions are used for visual
+ feedback when using the editor.
+ - Comments before opening the style are used as caption.
+ - Comments after the class name and before the style declaration ({)
+ define the jQuery expression that decides whether this
+ style should be applied or not.
+
+ Note: the WYMeditor and /WYMeditor comments below are required
+ for the CSS parser to work properly.
+*/
+
+/* WYMeditor */
+
+/* PARA: Highlight */
+p.highlight {
+ background: yellow;
+ /* background: yellow; border: 2px solid orange; */
+}
+
+/* PARA: Hidden note */
+p.hide {
+ display: none;
+ /* color: #999; border: 2px solid #ccc; */
+}
+
+/* IMG: floating left */
+img.left /* img[@class!="right"] */ {
+ display: inline;
+ float: left;
+ /* float: left; */
+}
+
+/* IMG: floating right */
+img.right /* img[@class!="left"] */ {
+ display: inline;
+ float: right;
+ /* float: right; */
+}
+
+/* /WYMeditor */
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/background.gif b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/background.gif
new file mode 100644
index 0000000..0f892b1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/background.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/bullet.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/bullet.png
new file mode 100644
index 0000000..3e9c121
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/bullet.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/comments.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/comments.png
new file mode 100644
index 0000000..64d81a5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/comments.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/community.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/community.png
new file mode 100644
index 0000000..bb8ca4a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/community.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/favicon.ico b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/favicon.ico
new file mode 100644
index 0000000..6baafb3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/favicon.ico
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/favicon.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/favicon.png
new file mode 100644
index 0000000..d3269bf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/favicon.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/grid.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/grid.png
new file mode 100644
index 0000000..129d4a2
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/grid.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/help.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/help.png
new file mode 100644
index 0000000..8e49281
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/help.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/logo.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/logo.png
new file mode 100644
index 0000000..668cbfd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/logo.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/manage.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/manage.png
new file mode 100644
index 0000000..807b82d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/manage.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/objecttype.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/objecttype.png
new file mode 100644
index 0000000..6647a4b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/objecttype.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/plugin.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/plugin.png
new file mode 100644
index 0000000..0b26234
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/plugin.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/preview.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/preview.png
new file mode 100644
index 0000000..292c578
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/preview.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/rss.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/rss.png
new file mode 100644
index 0000000..9006ffe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/rss.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/shorturl.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/shorturl.png
new file mode 100644
index 0000000..25eacb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/shorturl.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/sitemap.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/sitemap.png
new file mode 100644
index 0000000..092c959
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/sitemap.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/tags.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/tags.png
new file mode 100644
index 0000000..1478033
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/tags.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/trans.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/trans.png
new file mode 100644
index 0000000..cd1db6c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/trans.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/comments.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/comments.png
new file mode 100644
index 0000000..981b1af
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/comments.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/objectapp.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/objectapp.png
new file mode 100644
index 0000000..d3269bf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/objectapp.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/watermark.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/watermark.png
new file mode 100644
index 0000000..09223aa
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/img/wlw/watermark.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.autocomplete.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.autocomplete.js
new file mode 100644
index 0000000..4b021c1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.autocomplete.js
@@ -0,0 +1,13 @@
+/*
+ * jQuery Autocomplete plugin 1.1
+ *
+ * Copyright (c) 2009 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
+ */;(function($){$.fn.extend({autocomplete:function(urlOrData,options){var isUrl=typeof urlOrData=="string";options=$.extend({},$.Autocompleter.defaults,{url:isUrl?urlOrData:null,data:isUrl?null:urlOrData,delay:isUrl?$.Autocompleter.defaults.delay:10,max:options&&!options.scroll?10:150},options);options.highlight=options.highlight||function(value){return value;};options.formatMatch=options.formatMatch||options.formatItem;return this.each(function(){new $.Autocompleter(this,options);});},result:function(handler){return this.bind("result",handler);},search:function(handler){return this.trigger("search",[handler]);},flushCache:function(){return this.trigger("flushCache");},setOptions:function(options){return this.trigger("setOptions",[options]);},unautocomplete:function(){return this.trigger("unautocomplete");}});$.Autocompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var cache=$.Autocompleter.Cache(options);var hasFocus=0;var lastKeyPressCode;var config={mouseDownOnSelect:false};var select=$.Autocompleter.Select(options,input,selectCurrent,config);var blockSubmit;$.browser.opera&&$(input.form).bind("submit.autocomplete",function(){if(blockSubmit){blockSubmit=false;return false;}});$input.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(event){hasFocus=1;lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:event.preventDefault();if(select.visible()){select.prev();}else{onChange(0,true);}break;case KEY.DOWN:event.preventDefault();if(select.visible()){select.next();}else{onChange(0,true);}break;case KEY.PAGEUP:event.preventDefault();if(select.visible()){select.pageUp();}else{onChange(0,true);}break;case KEY.PAGEDOWN:event.preventDefault();if(select.visible()){select.pageDown();}else{onChange(0,true);}break;case options.multiple&&$.trim(options.multipleSeparator)==","&&KEY.COMMA:case KEY.TAB:case KEY.RETURN:if(selectCurrent()){event.preventDefault();blockSubmit=true;return false;}break;case KEY.ESC:select.hide();break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break;}}).focus(function(){hasFocus++;}).blur(function(){hasFocus=0;if(!config.mouseDownOnSelect){hideResults();}}).click(function(){if(hasFocus++>1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i<data.length;i++){if(data[i].result.toLowerCase()==q.toLowerCase()){result=data[i];break;}}}if(typeof fn=="function")fn(result);else $input.trigger("result",result&&[result.data,result.value]);}$.each(trimWords($input.val()),function(i,value){request(value,findValueCallback,findValueCallback);});}).bind("flushCache",function(){cache.flush();}).bind("setOptions",function(){$.extend(options,arguments[1]);if("data"in arguments[1])cache.populate();}).bind("unautocomplete",function(){select.unbind();$input.unbind();$(input.form).unbind(".autocomplete");});function selectCurrent(){var selected=select.selected();if(!selected)return false;var v=selected.result;previousValue=v;if(options.multiple){var words=trimWords($input.val());if(words.length>1){var seperator=options.multipleSeparator.length;var cursorAt=$(input).selection().start;var wordAt,progress=0;$.each(words,function(i,word){progress+=word.length;if(cursorAt<=progress){wordAt=i;return false;}progress+=seperator;});words[wordAt]=v;v=words.join(options.multipleSeparator);}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&&currentValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value)return[""];if(!options.multiple)return[$.trim(value)];return $.map(value.split(options.multipleSeparator),function(word){return $.trim(value).length?$.trim(word):null;});}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);if(words.length==1)return words[0];var cursorAt=$(input).selection().start;if(cursorAt==value.length){words=trimWords(value)}else{words=trimWords(value.replace(value.substring(cursorAt),""));}return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$(input).selection(previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else{$input.val("");$input.trigger("result",null);}}});}};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i<rows.length;i++){var row=$.trim(rows[i]);if(row){row=row.split("|");parsed[parsed.length]={data:row,value:row[0],result:options.formatResult&&options.formatResult(row,row[0])||row[0]};}}return parsed;};function stopLoading(){$input.removeClass(options.loadingClass);};};$.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(row){return row[0];},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(value,term){return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(options.matchContains=="word"){i=s.toLowerCase().search("\\b"+sub.toLowerCase());}if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i<ol;i++){var rawValue=options.data[i];rawValue=(typeof rawValue=="string")?[rawValue]:rawValue;var value=options.formatMatch(rawValue,i+1,options.data.length);if(value===false)continue;var firstChar=value.charAt(0).toLowerCase();if(!stMatchSets[firstChar])stMatchSets[firstChar]=[];var row={value:value,data:rawValue,result:options.formatResult&&options.formatResult(rawValue)||value};stMatchSets[firstChar].push(row);if(nullData++<options.max){stMatchSets[""].push(row);}};$.each(stMatchSets,function(i,value){options.cacheLength++;add(i,value);});}setTimeout(populate,25);function flush(){data={};length=0;}return{flush:flush,add:add,populate:populate,load:function(q){if(!options.cacheLength||!length)return null;if(!options.url&&options.matchContains){var csub=[];for(var k in data){if(k.length>0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else
+if(data[q]){return data[q];}else
+if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("<div/>").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("<ul/>").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset<list.scrollTop()){list.scrollTop(offset);}}};function movePosition(step){active+=step;if(active<0){active=listItems.size()-1;}else if(active>=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max<available?options.max:available;}function fillList(){list.empty();var max=limitNumberOfItems(data.length);for(var i=0;i<max;i++){if(!data[i])continue;var formatted=options.formatItem(data[i].data,i+1,max,data[i].value,term);if(formatted===false)continue;var li=$("<li/>").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.fn.selection=function(start,end){if(start!==undefined){return this.each(function(){if(this.createTextRange){var selRange=this.createTextRange();if(end===undefined||start==end){selRange.move("character",start);selRange.select();}else{selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}}else if(this.setSelectionRange){this.setSelectionRange(start,end);}else if(this.selectionStart){this.selectionStart=start;this.selectionEnd=end;}});}var field=this[0];if(field.createTextRange){var range=document.selection.createRange(),orig=field.value,teststring="<->",textLength=range.text.length;range.text=teststring;var caretAt=field.value.indexOf(teststring);field.value=orig;this.selection(caretAt,caretAt+textLength);return{start:caretAt,end:caretAt+textLength}}else if(field.selectionStart!==undefined){return{start:field.selectionStart,end:field.selectionEnd}}};})(jQuery); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.bgiframe.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.bgiframe.js
new file mode 100644
index 0000000..7faef4b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.bgiframe.js
@@ -0,0 +1,10 @@
+/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ *
+ * $LastChangedDate: 2007-07-22 01:45:56 +0200 (Son, 22 Jul 2007) $
+ * $Rev: 2447 $
+ *
+ * Version 2.1.1
+ */
+(function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+'style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+'"/>';return this.each(function(){if($('> iframe.bgiframe',this).length==0)this.insertBefore(document.createElement(html),this.firstChild);});}return this;};})(jQuery); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.js
new file mode 100644
index 0000000..8f3ca2e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.js
@@ -0,0 +1,167 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
+b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
+this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
+"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
+!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
+getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
+script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
+!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
+false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
+A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
+b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
+c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
+c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
+encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
+[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
+e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
+if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
+3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
+d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
+d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
+"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
+1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
+d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
+Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
+var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
+this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
+this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
+c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
+b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
+h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
+for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
+parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
+height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
+f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
+"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
+e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
+c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
+c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
+b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.masonry.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.masonry.js
new file mode 100644
index 0000000..f6e8a82
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.masonry.js
@@ -0,0 +1,12 @@
+/*************************************************
+** jQuery Masonry version 1.3.2
+** Copyright David DeSandro, licensed MIT
+** http://desandro.com/resources/jquery-masonry
+**************************************************/
+(function(e){var n=e.event,o;n.special.smartresize={setup:function(){e(this).bind("resize",n.special.smartresize.handler)},teardown:function(){e(this).unbind("resize",n.special.smartresize.handler)},handler:function(j,l){var g=this,d=arguments;j.type="smartresize";o&&clearTimeout(o);o=setTimeout(function(){jQuery.event.handle.apply(g,d)},l==="execAsap"?0:100)}};e.fn.smartresize=function(j){return j?this.bind("smartresize",j):this.trigger("smartresize",["execAsap"])};e.fn.masonry=function(j,l){var g=
+{getBricks:function(d,b,a){var c=a.itemSelector===undefined;b.$bricks=a.appendedContent===undefined?c?d.children():d.find(a.itemSelector):c?a.appendedContent:a.appendedContent.filter(a.itemSelector)},placeBrick:function(d,b,a,c,h){b=Math.min.apply(Math,a);for(var i=b+d.outerHeight(true),f=a.length,k=f,m=c.colCount+1-f;f--;)if(a[f]==b)k=f;d.applyStyle({left:c.colW*k+c.posLeft,top:b},e.extend(true,{},h.animationOptions));for(f=0;f<m;f++)c.colY[k+f]=i},setup:function(d,b,a){g.getBricks(d,a,b);if(a.masoned)a.previousData=
+d.data("masonry");a.colW=b.columnWidth===undefined?a.masoned?a.previousData.colW:a.$bricks.outerWidth(true):b.columnWidth;a.colCount=Math.floor(d.width()/a.colW);a.colCount=Math.max(a.colCount,1)},arrange:function(d,b,a){var c;if(!a.masoned||b.appendedContent!==undefined)a.$bricks.css("position","absolute");if(a.masoned){a.posTop=a.previousData.posTop;a.posLeft=a.previousData.posLeft}else{d.css("position","relative");var h=e(document.createElement("div"));d.prepend(h);a.posTop=Math.round(h.position().top);
+a.posLeft=Math.round(h.position().left);h.remove()}if(a.masoned&&b.appendedContent!==undefined){a.colY=a.previousData.colY;for(c=a.previousData.colCount;c<a.colCount;c++)a.colY[c]=a.posTop}else{a.colY=[];for(c=a.colCount;c--;)a.colY.push(a.posTop)}e.fn.applyStyle=a.masoned&&b.animate?e.fn.animate:e.fn.css;b.singleMode?a.$bricks.each(function(){var i=e(this);g.placeBrick(i,a.colCount,a.colY,a,b)}):a.$bricks.each(function(){var i=e(this),f=Math.ceil(i.outerWidth(true)/a.colW);f=Math.min(f,a.colCount);
+if(f===1)g.placeBrick(i,a.colCount,a.colY,a,b);else{var k=a.colCount+1-f,m=[];for(c=0;c<k;c++){var p=a.colY.slice(c,c+f);m[c]=Math.max.apply(Math,p)}g.placeBrick(i,k,m,a,b)}});a.wallH=Math.max.apply(Math,a.colY);d.applyStyle({height:a.wallH-a.posTop},e.extend(true,[],b.animationOptions));a.masoned||setTimeout(function(){d.addClass("masoned")},1);l.call(a.$bricks);d.data("masonry",a)},resize:function(d,b,a){a.masoned=!!d.data("masonry");var c=d.data("masonry").colCount;g.setup(d,b,a);a.colCount!=c&&
+g.arrange(d,b,a)}};return this.each(function(){var d=e(this),b={};b.masoned=!!d.data("masonry");var a=b.masoned?d.data("masonry").options:{},c=e.extend({},e.fn.masonry.defaults,a,j),h=a.resizeable;b.options=c.saveOptions?c:a;l=l||function(){};g.getBricks(d,b,c);if(!b.$bricks.length)return this;g.setup(d,c,b);g.arrange(d,c,b);!h&&c.resizeable&&e(window).bind("smartresize.masonry",function(){g.resize(d,c,b)});h&&!c.resizeable&&e(window).unbind("smartresize.masonry")})};e.fn.masonry.defaults={singleMode:false,
+columnWidth:undefined,itemSelector:undefined,appendedContent:undefined,saveOptions:true,resizeable:true,animate:false,animationOptions:{}}})(jQuery); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.ui.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.ui.js
new file mode 100644
index 0000000..044d307
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/jquery.ui.js
@@ -0,0 +1,68 @@
+/*!
+ * jQuery UI 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.9",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
+NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
+"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
+if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
+"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
+d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
+c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
+b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
+;/*!
+ * jQuery UI Widget 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
+a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
+e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
+this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
+widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
+;/*
+ * jQuery UI Tabs 1.8.9
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=
+d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
+(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+
+g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};
+this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=
+-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=
+d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b,
+e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);
+j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();
+if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null,
+this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
+load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
+"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.9"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
+a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
+; \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/jquery.markitup.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/jquery.markitup.js
new file mode 100644
index 0000000..8c69b78
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/jquery.markitup.js
@@ -0,0 +1,574 @@
+// ----------------------------------------------------------------------------
+// markItUp! Universal MarkUp Engine, JQuery plugin
+// v 1.1.x
+// Dual licensed under the MIT and GPL licenses.
+// ----------------------------------------------------------------------------
+// Copyright (C) 2007-2010 Jay Salvat
+// http://markitup.jaysalvat.com/
+// ----------------------------------------------------------------------------
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+// ----------------------------------------------------------------------------
+(function($) {
+ $.fn.markItUp = function(settings, extraSettings) {
+ var options, ctrlKey, shiftKey, altKey;
+ ctrlKey = shiftKey = altKey = false;
+
+ options = { id: '',
+ nameSpace: '',
+ root: '',
+ previewInWindow: '', // 'width=800, height=600, resizable=yes, scrollbars=yes'
+ previewAutoRefresh: true,
+ previewPosition: 'after',
+ previewTemplatePath: '~/templates/preview.html',
+ previewParserPath: '',
+ previewParserVar: 'data',
+ resizeHandle: true,
+ beforeInsert: '',
+ afterInsert: '',
+ onEnter: {},
+ onShiftEnter: {},
+ onCtrlEnter: {},
+ onTab: {},
+ markupSet: [ { /* set */ } ]
+ };
+ $.extend(options, settings, extraSettings);
+
+ // compute markItUp! path
+ if (!options.root) {
+ $('script').each(function(a, tag) {
+ miuScript = $(tag).get(0).src.match(/(.*)jquery\.markitup(\.pack)?\.js$/);
+ if (miuScript !== null) {
+ options.root = miuScript[1];
+ }
+ });
+ }
+
+ return this.each(function() {
+ var $$, textarea, levels, scrollPosition, caretPosition, caretOffset,
+ clicked, hash, header, footer, previewWindow, template, iFrame, abort;
+ $$ = $(this);
+ textarea = this;
+ levels = [];
+ abort = false;
+ scrollPosition = caretPosition = 0;
+ caretOffset = -1;
+
+ options.previewParserPath = localize(options.previewParserPath);
+ options.previewTemplatePath = localize(options.previewTemplatePath);
+
+ // apply the computed path to ~/
+ function localize(data, inText) {
+ if (inText) {
+ return data.replace(/("|')~\//g, "$1"+options.root);
+ }
+ return data.replace(/^~\//, options.root);
+ }
+
+ // init and build editor
+ function init() {
+ id = ''; nameSpace = '';
+ if (options.id) {
+ id = 'id="'+options.id+'"';
+ } else if ($$.attr("id")) {
+ id = 'id="markItUp'+($$.attr("id").substr(0, 1).toUpperCase())+($$.attr("id").substr(1))+'"';
+
+ }
+ if (options.nameSpace) {
+ nameSpace = 'class="'+options.nameSpace+'"';
+ }
+ $$.wrap('<div '+nameSpace+'></div>');
+ $$.wrap('<div '+id+' class="markItUp"></div>');
+ $$.wrap('<div class="markItUpContainer"></div>');
+ $$.addClass("markItUpEditor");
+
+ // add the header before the textarea
+ header = $('<div class="markItUpHeader"></div>').insertBefore($$);
+ $(dropMenus(options.markupSet)).appendTo(header);
+
+ // add the footer after the textarea
+ footer = $('<div class="markItUpFooter"></div>').insertAfter($$);
+
+ // add the resize handle after textarea
+ if (options.resizeHandle === true && $.browser.safari !== true) {
+ resizeHandle = $('<div class="markItUpResizeHandle"></div>')
+ .insertAfter($$)
+ .bind("mousedown", function(e) {
+ var h = $$.height(), y = e.clientY, mouseMove, mouseUp;
+ mouseMove = function(e) {
+ $$.css("height", Math.max(20, e.clientY+h-y)+"px");
+ return false;
+ };
+ mouseUp = function(e) {
+ $("html").unbind("mousemove", mouseMove).unbind("mouseup", mouseUp);
+ return false;
+ };
+ $("html").bind("mousemove", mouseMove).bind("mouseup", mouseUp);
+ });
+ footer.append(resizeHandle);
+ }
+
+ // listen key events
+ $$.keydown(keyPressed).keyup(keyPressed);
+
+ // bind an event to catch external calls
+ $$.bind("insertion", function(e, settings) {
+ if (settings.target !== false) {
+ get();
+ }
+ if (textarea === $.markItUp.focused) {
+ markup(settings);
+ }
+ });
+
+ // remember the last focus
+ $$.focus(function() {
+ $.markItUp.focused = this;
+ });
+ }
+
+ // recursively build header with dropMenus from markupset
+ function dropMenus(markupSet) {
+ var ul = $('<ul></ul>'), i = 0;
+ $('li:hover > ul', ul).css('display', 'block');
+ $.each(markupSet, function() {
+ var button = this, t = '', title, li, j;
+ title = (button.key) ? (button.name||'')+' [Ctrl+'+button.key+']' : (button.name||'');
+ key = (button.key) ? 'accesskey="'+button.key+'"' : '';
+ if (button.separator) {
+ li = $('<li class="markItUpSeparator">'+(button.separator||'')+'</li>').appendTo(ul);
+ } else {
+ i++;
+ for (j = levels.length -1; j >= 0; j--) {
+ t += levels[j]+"-";
+ }
+ li = $('<li class="markItUpButton markItUpButton'+t+(i)+' '+(button.className||'')+'"><a href="" '+key+' title="'+title+'">'+(button.name||'')+'</a></li>')
+ .bind("contextmenu", function() { // prevent contextmenu on mac and allow ctrl+click
+ return false;
+ }).click(function() {
+ return false;
+ }).bind("focusin", function(){
+ $$.focus();
+ }).mousedown(function() {
+ if (button.call) {
+ eval(button.call)();
+ }
+ setTimeout(function() { markup(button) },1);
+ return false;
+ }).hover(function() {
+ $('> ul', this).show();
+ $(document).one('click', function() { // close dropmenu if click outside
+ $('ul ul', header).hide();
+ }
+ );
+ }, function() {
+ $('> ul', this).hide();
+ }
+ ).appendTo(ul);
+ if (button.dropMenu) {
+ levels.push(i);
+ $(li).addClass('markItUpDropMenu').append(dropMenus(button.dropMenu));
+ }
+ }
+ });
+ levels.pop();
+ return ul;
+ }
+
+ // markItUp! markups
+ function magicMarkups(string) {
+ if (string) {
+ string = string.toString();
+ string = string.replace(/\(\!\(([\s\S]*?)\)\!\)/g,
+ function(x, a) {
+ var b = a.split('|!|');
+ if (altKey === true) {
+ return (b[1] !== undefined) ? b[1] : b[0];
+ } else {
+ return (b[1] === undefined) ? "" : b[0];
+ }
+ }
+ );
+ // [![prompt]!], [![prompt:!:value]!]
+ string = string.replace(/\[\!\[([\s\S]*?)\]\!\]/g,
+ function(x, a) {
+ var b = a.split(':!:');
+ if (abort === true) {
+ return false;
+ }
+ value = prompt(b[0], (b[1]) ? b[1] : '');
+ if (value === null) {
+ abort = true;
+ }
+ return value;
+ }
+ );
+ return string;
+ }
+ return "";
+ }
+
+ // prepare action
+ function prepare(action) {
+ if ($.isFunction(action)) {
+ action = action(hash);
+ }
+ return magicMarkups(action);
+ }
+
+ // build block to insert
+ function build(string) {
+ var openWith = prepare(clicked.openWith);
+ var placeHolder = prepare(clicked.placeHolder);
+ var replaceWith = prepare(clicked.replaceWith);
+ var closeWith = prepare(clicked.closeWith);
+ if (replaceWith !== "") {
+ block = openWith + replaceWith + closeWith;
+ } else if (selection === '' && placeHolder !== '') {
+ block = openWith + placeHolder + closeWith;
+ } else {
+ string = string || selection;
+ if (string.match(/ $/)) {
+ block = openWith + string.replace(/ $/, '') + closeWith + ' ';
+ } else {
+ block = openWith + string + closeWith;
+ }
+ }
+ return { block:block,
+ openWith:openWith,
+ replaceWith:replaceWith,
+ placeHolder:placeHolder,
+ closeWith:closeWith
+ };
+ }
+
+ // define markup to insert
+ function markup(button) {
+ var len, j, n, i;
+ hash = clicked = button;
+ get();
+
+ $.extend(hash, { line:"",
+ root:options.root,
+ textarea:textarea,
+ selection:(selection||''),
+ caretPosition:caretPosition,
+ ctrlKey:ctrlKey,
+ shiftKey:shiftKey,
+ altKey:altKey
+ }
+ );
+ // callbacks before insertion
+ prepare(options.beforeInsert);
+ prepare(clicked.beforeInsert);
+ if (ctrlKey === true && shiftKey === true) {
+ prepare(clicked.beforeMultiInsert);
+ }
+ $.extend(hash, { line:1 });
+
+ if (ctrlKey === true && shiftKey === true) {
+ lines = selection.split(/\r?\n/);
+ for (j = 0, n = lines.length, i = 0; i < n; i++) {
+ if ($.trim(lines[i]) !== '') {
+ $.extend(hash, { line:++j, selection:lines[i] } );
+ lines[i] = build(lines[i]).block;
+ } else {
+ lines[i] = "";
+ }
+ }
+ string = { block:lines.join('\n')};
+ start = caretPosition;
+ len = string.block.length + (($.browser.opera) ? n-1 : 0);
+ } else if (ctrlKey === true) {
+ string = build(selection);
+ start = caretPosition + string.openWith.length;
+ len = string.block.length - string.openWith.length - string.closeWith.length;
+ len = len - (string.block.match(/ $/) ? 1 : 0);
+ len -= fixIeBug(string.block);
+ } else if (shiftKey === true) {
+ string = build(selection);
+ start = caretPosition;
+ len = string.block.length;
+ len -= fixIeBug(string.block);
+ } else {
+ string = build(selection);
+ start = caretPosition + string.block.length ;
+ len = 0;
+ start -= fixIeBug(string.block);
+ }
+ if ((selection === '' && string.replaceWith === '')) {
+ caretOffset += fixOperaBug(string.block);
+
+ start = caretPosition + string.openWith.length;
+ len = string.block.length - string.openWith.length - string.closeWith.length;
+
+ caretOffset = $$.val().substring(caretPosition, $$.val().length).length;
+ caretOffset -= fixOperaBug($$.val().substring(0, caretPosition));
+ }
+ $.extend(hash, { caretPosition:caretPosition, scrollPosition:scrollPosition } );
+
+ if (string.block !== selection && abort === false) {
+ insert(string.block);
+ set(start, len);
+ } else {
+ caretOffset = -1;
+ }
+ get();
+
+ $.extend(hash, { line:'', selection:selection });
+
+ // callbacks after insertion
+ if (ctrlKey === true && shiftKey === true) {
+ prepare(clicked.afterMultiInsert);
+ }
+ prepare(clicked.afterInsert);
+ prepare(options.afterInsert);
+
+ // refresh preview if opened
+ if (previewWindow && options.previewAutoRefresh) {
+ refreshPreview();
+ }
+
+ // reinit keyevent
+ shiftKey = altKey = ctrlKey = abort = false;
+ }
+
+ // Substract linefeed in Opera
+ function fixOperaBug(string) {
+ if ($.browser.opera) {
+ return string.length - string.replace(/\n*/g, '').length;
+ }
+ return 0;
+ }
+ // Substract linefeed in IE
+ function fixIeBug(string) {
+ if ($.browser.msie) {
+ return string.length - string.replace(/\r/g, '').length;
+ }
+ return 0;
+ }
+
+ // add markup
+ function insert(block) {
+ if (document.selection) {
+ var newSelection = document.selection.createRange();
+ newSelection.text = block;
+ } else {
+ textarea.value = textarea.value.substring(0, caretPosition) + block + textarea.value.substring(caretPosition + selection.length, textarea.value.length);
+ }
+ }
+
+ // set a selection
+ function set(start, len) {
+ if (textarea.createTextRange){
+ // quick fix to make it work on Opera 9.5
+ if ($.browser.opera && $.browser.version >= 9.5 && len == 0) {
+ return false;
+ }
+ range = textarea.createTextRange();
+ range.collapse(true);
+ range.moveStart('character', start);
+ range.moveEnd('character', len);
+ range.select();
+ } else if (textarea.setSelectionRange ){
+ textarea.setSelectionRange(start, start + len);
+ }
+ textarea.scrollTop = scrollPosition;
+ textarea.focus();
+ }
+
+ // get the selection
+ function get() {
+ textarea.focus();
+
+ scrollPosition = textarea.scrollTop;
+ if (document.selection) {
+ selection = document.selection;
+ if ($.browser.msie) { // ie
+ var range = selection.createRange();
+ var stored_range = range.duplicate();
+ stored_range.moveToElementText(textarea);
+ stored_range.setEndPoint('EndToEnd', range);
+ var s = stored_range.text.length - range.text.length;
+
+ caretPosition = s - (textarea.value.substr(0, s).length - textarea.value.substr(0, s).replace(/\r/g, '').length);
+ selection = range.text;
+ } else { // opera
+ caretPosition = textarea.selectionStart;
+ }
+ } else { // gecko & webkit
+ caretPosition = textarea.selectionStart;
+ selection = textarea.value.substring(caretPosition, textarea.selectionEnd);
+ }
+ return selection;
+ }
+
+ // open preview window
+ function preview() {
+ if (!previewWindow || previewWindow.closed) {
+ if (options.previewInWindow) {
+ previewWindow = window.open('', 'preview', options.previewInWindow);
+ $(window).unload(function() {
+ previewWindow.close();
+ });
+ } else {
+ iFrame = $('<iframe class="markItUpPreviewFrame"></iframe>');
+ if (options.previewPosition == 'after') {
+ iFrame.insertAfter(footer);
+ } else {
+ iFrame.insertBefore(header);
+ }
+ previewWindow = iFrame[iFrame.length - 1].contentWindow || frame[iFrame.length - 1];
+ }
+ } else if (altKey === true) {
+ if (iFrame) {
+ iFrame.remove();
+ } else {
+ previewWindow.close();
+ }
+ previewWindow = iFrame = false;
+ }
+ if (!options.previewAutoRefresh) {
+ refreshPreview();
+ }
+ if (options.previewInWindow) {
+ previewWindow.focus();
+ }
+ }
+
+ // refresh Preview window
+ function refreshPreview() {
+ renderPreview();
+ }
+
+ function renderPreview() {
+ var phtml;
+ if (options.previewParserPath !== '') {
+ $.ajax({
+ type: 'POST',
+ dataType: 'text',
+ global: false,
+ url: options.previewParserPath,
+ data: options.previewParserVar+'='+encodeURIComponent($$.val()),
+ success: function(data) {
+ writeInPreview( localize(data, 1) );
+ }
+ });
+ } else {
+ if (!template) {
+ $.ajax({
+ url: options.previewTemplatePath,
+ dataType: 'text',
+ global: false,
+ success: function(data) {
+ writeInPreview( localize(data, 1).replace(/<!-- content -->/g, $$.val()) );
+ }
+ });
+ }
+ }
+ return false;
+ }
+
+ function writeInPreview(data) {
+ if (previewWindow.document) {
+ try {
+ sp = previewWindow.document.documentElement.scrollTop
+ } catch(e) {
+ sp = 0;
+ }
+ previewWindow.document.open();
+ previewWindow.document.write(data);
+ previewWindow.document.close();
+ previewWindow.document.documentElement.scrollTop = sp;
+ }
+ }
+
+ // set keys pressed
+ function keyPressed(e) {
+ shiftKey = e.shiftKey;
+ altKey = e.altKey;
+ ctrlKey = (!(e.altKey && e.ctrlKey)) ? e.ctrlKey : false;
+
+ if (e.type === 'keydown') {
+ if (ctrlKey === true) {
+ li = $("a[accesskey="+String.fromCharCode(e.keyCode)+"]", header).parent('li');
+ if (li.length !== 0) {
+ ctrlKey = false;
+ setTimeout(function() {
+ li.triggerHandler('mousedown');
+ },1);
+ return false;
+ }
+ }
+ if (e.keyCode === 13 || e.keyCode === 10) { // Enter key
+ if (ctrlKey === true) { // Enter + Ctrl
+ ctrlKey = false;
+ markup(options.onCtrlEnter);
+ return options.onCtrlEnter.keepDefault;
+ } else if (shiftKey === true) { // Enter + Shift
+ shiftKey = false;
+ markup(options.onShiftEnter);
+ return options.onShiftEnter.keepDefault;
+ } else { // only Enter
+ markup(options.onEnter);
+ return options.onEnter.keepDefault;
+ }
+ }
+ if (e.keyCode === 9) { // Tab key
+ if (shiftKey == true || ctrlKey == true || altKey == true) {
+ return false;
+ }
+ if (caretOffset !== -1) {
+ get();
+ caretOffset = $$.val().length - caretOffset;
+ set(caretOffset, 0);
+ caretOffset = -1;
+ return false;
+ } else {
+ markup(options.onTab);
+ return options.onTab.keepDefault;
+ }
+ }
+ }
+ }
+
+ init();
+ });
+ };
+
+ $.fn.markItUpRemove = function() {
+ return this.each(function() {
+ var $$ = $(this).unbind().removeClass('markItUpEditor');
+ $$.parent('div').parent('div.markItUp').parent('div').replaceWith($$);
+ }
+ );
+ };
+
+ $.markItUp = function(settings) {
+ var options = { target:false };
+ $.extend(options, settings);
+ if (options.target) {
+ return $(options.target).each(function() {
+ $(this).focus();
+ $(this).trigger('insertion', [options]);
+ });
+ } else {
+ $('textarea').trigger('insertion', [options]);
+ }
+ };
+})(jQuery);
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/bold.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/bold.png
new file mode 100644
index 0000000..889ae80
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/bold.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/clean.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/clean.png
new file mode 100644
index 0000000..7e7cefb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/clean.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h1.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h1.png
new file mode 100644
index 0000000..9c122e9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h1.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h2.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h2.png
new file mode 100644
index 0000000..fbd8765
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h2.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h3.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h3.png
new file mode 100644
index 0000000..c7836cf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h3.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h4.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h4.png
new file mode 100644
index 0000000..4e929ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h4.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h5.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h5.png
new file mode 100644
index 0000000..30cabeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h5.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h6.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h6.png
new file mode 100644
index 0000000..058170a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/h6.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/image.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/image.png
new file mode 100644
index 0000000..fc3c393
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/image.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/italic.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/italic.png
new file mode 100644
index 0000000..8482ac8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/italic.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/link.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/link.png
new file mode 100644
index 0000000..25eacb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/link.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-bullet.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-bullet.png
new file mode 100644
index 0000000..4a8672b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-bullet.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-item.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-item.png
new file mode 100644
index 0000000..8cb4d69
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-item.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-numeric.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-numeric.png
new file mode 100644
index 0000000..33b0b8d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/list-numeric.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/paragraph.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/paragraph.png
new file mode 100644
index 0000000..95704fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/paragraph.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/picture.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/picture.png
new file mode 100644
index 0000000..4a158fe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/picture.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/preview.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/preview.png
new file mode 100644
index 0000000..a9925a0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/preview.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/stroke.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/stroke.png
new file mode 100644
index 0000000..612058a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/images/stroke.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/set.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/set.js
new file mode 100644
index 0000000..1474286
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/set.js
@@ -0,0 +1,38 @@
+// ----------------------------------------------------------------------------
+// markItUp!
+// ----------------------------------------------------------------------------
+// Copyright (C) 2008 Jay Salvat
+// http://markitup.jaysalvat.com/
+// ----------------------------------------------------------------------------
+// Html tags
+// http://en.wikipedia.org/wiki/html
+// ----------------------------------------------------------------------------
+// Basic set. Feel free to add more tags
+// ----------------------------------------------------------------------------
+mySettings = {
+ onShiftEnter: {keepDefault:false, replaceWith:'<br />\n'},
+ onCtrlEnter: {keepDefault:false, openWith:'\n<p>', closeWith:'</p>\n'},
+ onTab: {keepDefault:false, openWith:' '},
+ markupSet: [
+ {name:'Heading 1', key:'1', openWith:'<h1(!( class="[![Class]!]")!)>', closeWith:'</h1>', placeHolder:'Your title here...' },
+ {name:'Heading 2', key:'2', openWith:'<h2(!( class="[![Class]!]")!)>', closeWith:'</h2>', placeHolder:'Your title here...' },
+ {name:'Heading 3', key:'3', openWith:'<h3(!( class="[![Class]!]")!)>', closeWith:'</h3>', placeHolder:'Your title here...' },
+ {name:'Heading 4', key:'4', openWith:'<h4(!( class="[![Class]!]")!)>', closeWith:'</h4>', placeHolder:'Your title here...' },
+ {name:'Heading 5', key:'5', openWith:'<h5(!( class="[![Class]!]")!)>', closeWith:'</h5>', placeHolder:'Your title here...' },
+ {name:'Heading 6', key:'6', openWith:'<h6(!( class="[![Class]!]")!)>', closeWith:'</h6>', placeHolder:'Your title here...' },
+ {name:'Paragraph', openWith:'<p(!( class="[![Class]!]")!)>', closeWith:'</p>' },
+ {separator:'---------------' },
+ {name:'Bold', key:'B', openWith:'(!(<strong>|!|<b>)!)', closeWith:'(!(</strong>|!|</b>)!)' },
+ {name:'Italic', key:'I', openWith:'(!(<em>|!|<i>)!)', closeWith:'(!(</em>|!|</i>)!)' },
+ {name:'Stroke through', key:'S', openWith:'<del>', closeWith:'</del>' },
+ {separator:'---------------' },
+ {name:'Ul', openWith:'<ul>\n', closeWith:'</ul>\n' },
+ {name:'Ol', openWith:'<ol>\n', closeWith:'</ol>\n' },
+ {name:'Li', openWith:'<li>', closeWith:'</li>' },
+ {separator:'---------------' },
+ {name:'Picture', key:'P', replaceWith:'<img src="[![Source:!:http://]!]" alt="[![Alternative text]!]" />' },
+ {name:'Link', key:'L', openWith:'<a href="[![Link:!:http://]!]"(!( title="[![Title]!]")!)>', closeWith:'</a>', placeHolder:'Your text to link...' },
+ {separator:'---------------' },
+ {name:'Clean', className:'clean', replaceWith:function(markitup) { return markitup.selection.replace(/<(.*?)>/g, "") } }
+ ]
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/style.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/style.css
new file mode 100644
index 0000000..817e503
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/html/style.css
@@ -0,0 +1,59 @@
+/* -------------------------------------------------------------------
+// markItUp!
+// By Jay Salvat - http://markitup.jaysalvat.com/
+// ------------------------------------------------------------------*/
+.markItUp .markItUpButton1 a {
+ background-image:url(images/h1.png);
+}
+.markItUp .markItUpButton2 a {
+ background-image:url(images/h2.png);
+}
+.markItUp .markItUpButton3 a {
+ background-image:url(images/h3.png);
+}
+.markItUp .markItUpButton4 a {
+ background-image:url(images/h4.png);
+}
+.markItUp .markItUpButton5 a {
+ background-image:url(images/h5.png);
+}
+.markItUp .markItUpButton6 a {
+ background-image:url(images/h6.png);
+}
+.markItUp .markItUpButton7 a {
+ background-image:url(images/paragraph.png);
+}
+
+.markItUp .markItUpButton8 a {
+ background-image:url(images/bold.png);
+}
+.markItUp .markItUpButton9 a {
+ background-image:url(images/italic.png);
+}
+.markItUp .markItUpButton10 a {
+ background-image:url(images/stroke.png);
+}
+
+.markItUp .markItUpButton11 a {
+ background-image:url(images/list-bullet.png);
+}
+.markItUp .markItUpButton12 a {
+ background-image:url(images/list-numeric.png);
+}
+.markItUp .markItUpButton13 a {
+ background-image:url(images/list-item.png);
+}
+
+.markItUp .markItUpButton14 a {
+ background-image:url(images/picture.png);
+}
+.markItUp .markItUpButton15 a {
+ background-image:url(images/link.png);
+}
+
+.markItUp .clean a {
+ background-image:url(images/clean.png);
+}
+.markItUp .preview a {
+ background-image:url(images/preview.png);
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/bold.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/bold.png
new file mode 100644
index 0000000..889ae80
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/bold.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/code.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/code.png
new file mode 100644
index 0000000..63fe6ce
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/code.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h1.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h1.png
new file mode 100644
index 0000000..9c122e9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h1.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h2.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h2.png
new file mode 100644
index 0000000..fbd8765
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h2.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h3.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h3.png
new file mode 100644
index 0000000..c7836cf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h3.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h4.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h4.png
new file mode 100644
index 0000000..4e929ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h4.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h5.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h5.png
new file mode 100644
index 0000000..30cabeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h5.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h6.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h6.png
new file mode 100644
index 0000000..058170a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/h6.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/italic.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/italic.png
new file mode 100644
index 0000000..8482ac8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/italic.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/link.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/link.png
new file mode 100644
index 0000000..25eacb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/link.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/list-bullet.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/list-bullet.png
new file mode 100644
index 0000000..4a8672b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/list-bullet.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/list-numeric.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/list-numeric.png
new file mode 100644
index 0000000..33b0b8d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/list-numeric.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/picture.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/picture.png
new file mode 100644
index 0000000..4a158fe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/picture.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/preview.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/preview.png
new file mode 100644
index 0000000..a9925a0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/preview.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/quotes.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/quotes.png
new file mode 100644
index 0000000..e54ebeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/images/quotes.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/set.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/set.js
new file mode 100644
index 0000000..7d87ef7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/set.js
@@ -0,0 +1,49 @@
+// -------------------------------------------------------------------
+// markItUp!
+// -------------------------------------------------------------------
+// Copyright (C) 2008 Jay Salvat
+// http://markitup.jaysalvat.com/
+// -------------------------------------------------------------------
+// MarkDown tags example
+// http://en.wikipedia.org/wiki/Markdown
+// http://daringfireball.net/projects/markdown/
+// -------------------------------------------------------------------
+// Feel free to add more tags
+// -------------------------------------------------------------------
+mySettings = {
+ onShiftEnter: {keepDefault:false, openWith:'\n\n'},
+ markupSet: [
+ {name:'Heading 1', key:'1', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '=') } },
+ {name:'Heading 2', key:'2', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '-') } },
+ {name:'Heading 3', key:'3', openWith:'### ', placeHolder:'Your title here...' },
+ {name:'Heading 4', key:'4', openWith:'#### ', placeHolder:'Your title here...' },
+ {name:'Heading 5', key:'5', openWith:'##### ', placeHolder:'Your title here...' },
+ {name:'Heading 6', key:'6', openWith:'###### ', placeHolder:'Your title here...' },
+ {separator:'---------------' },
+ {name:'Bold', key:'B', openWith:'**', closeWith:'**'},
+ {name:'Italic', key:'I', openWith:'_', closeWith:'_'},
+ {separator:'---------------' },
+ {name:'Bulleted List', openWith:'- ' },
+ {name:'Numeric List', openWith:function(markItUp) {
+ return markItUp.line+'. ';
+ }},
+ {separator:'---------------' },
+ {name:'Picture', key:'P', replaceWith:'![[![Alternative text]!]]([![Url:!:http://]!] "[![Title]!]")'},
+ {name:'Link', key:'L', openWith:'[', closeWith:']([![Url:!:http://]!] "[![Title]!]")', placeHolder:'Your text to link here...' },
+ {separator:'---------------'},
+ {name:'Quotes', openWith:'> '},
+ {name:'Code Block / Code', openWith:'(!(\t|!|`)!)', closeWith:'(!(`)!)'}
+ ]
+}
+
+// mIu nameSpace to avoid conflict.
+miu = {
+ markdownTitle: function(markItUp, char) {
+ heading = '';
+ n = $.trim(markItUp.selection||markItUp.placeHolder).length;
+ for(i = 0; i < n; i++) {
+ heading += char;
+ }
+ return '\n'+heading;
+ }
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/style.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/style.css
new file mode 100644
index 0000000..03c3aea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/markdown/style.css
@@ -0,0 +1,54 @@
+/* -------------------------------------------------------------------
+// markItUp!
+// By Jay Salvat - http://markitup.jaysalvat.com/
+// ------------------------------------------------------------------*/
+.markItUp .markItUpButton1 a {
+ background-image:url(images/h1.png);
+}
+.markItUp .markItUpButton2 a {
+ background-image:url(images/h2.png);
+}
+.markItUp .markItUpButton3 a {
+ background-image:url(images/h3.png);
+}
+.markItUp .markItUpButton4 a {
+ background-image:url(images/h4.png);
+}
+.markItUp .markItUpButton5 a {
+ background-image:url(images/h5.png);
+}
+.markItUp .markItUpButton6 a {
+ background-image:url(images/h6.png);
+}
+
+.markItUp .markItUpButton7 a {
+ background-image:url(images/bold.png);
+}
+.markItUp .markItUpButton8 a {
+ background-image:url(images/italic.png);
+}
+
+.markItUp .markItUpButton9 a {
+ background-image:url(images/list-bullet.png);
+}
+.markItUp .markItUpButton10 a {
+ background-image:url(images/list-numeric.png);
+}
+
+.markItUp .markItUpButton11 a {
+ background-image:url(images/picture.png);
+}
+.markItUp .markItUpButton12 a {
+ background-image:url(images/link.png);
+}
+
+.markItUp .markItUpButton13 a {
+ background-image:url(images/quotes.png);
+}
+.markItUp .markItUpButton14 a {
+ background-image:url(images/code.png);
+}
+
+.markItUp .preview a {
+ background-image:url(images/preview.png);
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/bold.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/bold.png
new file mode 100644
index 0000000..889ae80
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/bold.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/code.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/code.png
new file mode 100644
index 0000000..63fe6ce
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/code.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h1.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h1.png
new file mode 100644
index 0000000..9c122e9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h1.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h2.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h2.png
new file mode 100644
index 0000000..fbd8765
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h2.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h3.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h3.png
new file mode 100644
index 0000000..c7836cf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h3.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h4.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h4.png
new file mode 100644
index 0000000..4e929ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h4.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h5.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h5.png
new file mode 100644
index 0000000..30cabeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/h5.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/italic.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/italic.png
new file mode 100644
index 0000000..8482ac8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/italic.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/link.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/link.png
new file mode 100644
index 0000000..25eacb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/link.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/list-bullet.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/list-bullet.png
new file mode 100644
index 0000000..4a8672b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/list-bullet.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/list-numeric.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/list-numeric.png
new file mode 100644
index 0000000..33b0b8d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/list-numeric.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/picture.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/picture.png
new file mode 100644
index 0000000..4a158fe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/picture.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/preview.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/preview.png
new file mode 100644
index 0000000..a9925a0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/preview.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/quotes.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/quotes.png
new file mode 100644
index 0000000..e54ebeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/images/quotes.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/set.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/set.js
new file mode 100644
index 0000000..b468ae8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/set.js
@@ -0,0 +1,48 @@
+// -------------------------------------------------------------------
+// markItUp!
+// -------------------------------------------------------------------
+// Copyright (C) 2011 Florent Gallaire <fgallaire@gmail.com>
+// License GNU GPLv3 or any later version.
+// Copyright (C) 2008 Jay Salvat
+// http://markitup.jaysalvat.com/
+// -------------------------------------------------------------------
+// ReStrucuredText tags example
+// http://docutils.sourceforge.net/docs/user/rst/quickref.html
+// http://docutils.sourceforge.net/docs/user/rst/quickstart.html
+// -------------------------------------------------------------------
+// Feel free to add more tags
+// -------------------------------------------------------------------
+mySettings = {
+ onShiftEnter: {keepDefault:false, replaceWith:'\n\n'},
+ markupSet: [
+ {name:'Heading 1', key:'1', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '*') } },
+ {name:'Heading 2', key:'2', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '=') } },
+ {name:'Heading 3', key:'3', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '-') } },
+ {name:'Heading 4', key:'4', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '^') } },
+ {name:'Heading 5', key:'5', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '"') } },
+ {separator:'---------------' },
+ {name:'Bold', key:'B', openWith:'**', closeWith:'**'},
+ {name:'Italic', key:'I', openWith:'*', closeWith:'*'},
+ {separator:'---------------' },
+ {name:'Bulleted list', openWith:'- '},
+ {name:'Numeric list', openWith:'# '},
+ {separator:'---------------' },
+ {name:'Picture', key:'P', openWith:'\n\n.. image:: ', closeWith:'\n\n', placeHolder:'Your picture here...'},
+ {name:'Link', key:'L', openWith:'`', closeWith:' [![Link:!:http://]!]`_', placeHolder:'Your text to link here...'},
+ {separator:'---------------'},
+ {name:'Quote', openWith:'\t'},
+ {name:'Code', openWith:'``', closeWith:'``'}
+ ]
+}
+
+// mIu nameSpace to avoid conflict.
+miu = {
+ markdownTitle: function(markItUp, char) {
+ heading = '';
+ n = $.trim(markItUp.selection||markItUp.placeHolder).length;
+ for(i = 0; i < n; i++) {
+ heading += char;
+ }
+ return '\n'+heading;
+ }
+}
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/style.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/style.css
new file mode 100644
index 0000000..3da1a52
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/restructuredtext/style.css
@@ -0,0 +1,53 @@
+/* -------------------------------------------------------------------
+// Copyright (C) 2011 Florent Gallaire <fgallaire@gmail.com>
+// License GNU GPLv3 or any later version.
+// markItUp!
+// By Jay Salvat - http://markitup.jaysalvat.com/
+// ------------------------------------------------------------------*/
+.markItUp .markItUpButton1 a {
+ background-image:url(images/h1.png);
+}
+.markItUp .markItUpButton2 a {
+ background-image:url(images/h2.png);
+}
+.markItUp .markItUpButton3 a {
+ background-image:url(images/h3.png);
+}
+.markItUp .markItUpButton4 a {
+ background-image:url(images/h4.png);
+}
+.markItUp .markItUpButton5 a {
+ background-image:url(images/h5.png);
+}
+
+.markItUp .markItUpButton6 a {
+ background-image:url(images/bold.png);
+}
+.markItUp .markItUpButton7 a {
+ background-image:url(images/italic.png);
+}
+
+.markItUp .markItUpButton8 a {
+ background-image:url(images/list-bullet.png);
+}
+.markItUp .markItUpButton9 a {
+ background-image:url(images/list-numeric.png);
+}
+
+.markItUp .markItUpButton10 a {
+ background-image:url(images/picture.png);
+}
+.markItUp .markItUpButton11 a {
+ background-image:url(images/link.png);
+}
+
+.markItUp .markItUpButton12 a {
+ background-image:url(images/quotes.png);
+}
+.markItUp .markItUpButton13 a {
+ background-image:url(images/code.png);
+}
+
+.markItUp .preview a {
+ background-image:url(images/preview.png);
+}
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/bold.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/bold.png
new file mode 100644
index 0000000..889ae80
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/bold.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/code.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/code.png
new file mode 100644
index 0000000..63fe6ce
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/code.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h1.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h1.png
new file mode 100644
index 0000000..9c122e9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h1.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h2.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h2.png
new file mode 100644
index 0000000..fbd8765
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h2.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h3.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h3.png
new file mode 100644
index 0000000..c7836cf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h3.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h4.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h4.png
new file mode 100644
index 0000000..4e929ea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h4.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h5.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h5.png
new file mode 100644
index 0000000..30cabeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h5.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h6.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h6.png
new file mode 100644
index 0000000..058170a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/h6.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/italic.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/italic.png
new file mode 100644
index 0000000..8482ac8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/italic.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/link.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/link.png
new file mode 100644
index 0000000..25eacb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/link.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/list-bullet.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/list-bullet.png
new file mode 100644
index 0000000..4a8672b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/list-bullet.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/list-numeric.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/list-numeric.png
new file mode 100644
index 0000000..33b0b8d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/list-numeric.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/paragraph.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/paragraph.png
new file mode 100644
index 0000000..95704fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/paragraph.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/picture.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/picture.png
new file mode 100644
index 0000000..4a158fe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/picture.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/preview.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/preview.png
new file mode 100644
index 0000000..a9925a0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/preview.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/quotes.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/quotes.png
new file mode 100644
index 0000000..e54ebeb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/quotes.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/stroke.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/stroke.png
new file mode 100644
index 0000000..612058a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/images/stroke.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/set.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/set.js
new file mode 100644
index 0000000..dc7b6f6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/set.js
@@ -0,0 +1,37 @@
+// -------------------------------------------------------------------
+// markItUp!
+// -------------------------------------------------------------------
+// Copyright (C) 2008 Jay Salvat
+// http://markitup.jaysalvat.com/
+// -------------------------------------------------------------------
+// Textile tags example
+// http://en.wikipedia.org/wiki/Textile_(markup_language)
+// http://www.textism.com/
+// -------------------------------------------------------------------
+// Feel free to add more tags
+// -------------------------------------------------------------------
+mySettings = {
+ onShiftEnter: {keepDefault:false, replaceWith:'\n\n'},
+ markupSet: [
+ {name:'Heading 1', key:'1', openWith:'h1(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Heading 2', key:'2', openWith:'h2(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Heading 3', key:'3', openWith:'h3(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Heading 4', key:'4', openWith:'h4(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Heading 5', key:'5', openWith:'h5(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Heading 6', key:'6', openWith:'h6(!(([![Class]!]))!). ', placeHolder:'Your title here...' },
+ {name:'Paragraph', key:'P', openWith:'p(!(([![Class]!]))!). '},
+ {separator:'---------------' },
+ {name:'Bold', key:'B', closeWith:'*', openWith:'*'},
+ {name:'Italic', key:'I', closeWith:'_', openWith:'_'},
+ {name:'Stroke through', key:'S', closeWith:'-', openWith:'-'},
+ {separator:'---------------' },
+ {name:'Bulleted list', openWith:'(!(* |!|*)!)'},
+ {name:'Numeric list', openWith:'(!(# |!|#)!)'},
+ {separator:'---------------' },
+ {name:'Picture', replaceWith:'![![Source:!:http://]!]([![Alternative text]!])!'},
+ {name:'Link', key:'L', openWith:'"', closeWith:'([![Title]!])":[![Link:!:http://]!]', placeHolder:'Your text to link here...' },
+ {separator:'---------------' },
+ {name:'Quotes', openWith:'bq(!(([![Class]!]))!). '},
+ {name:'Code', openWith:'@', closeWith:'@'}
+ ]
+}
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/style.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/style.css
new file mode 100644
index 0000000..6176df5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/sets/textile/style.css
@@ -0,0 +1,60 @@
+/* -------------------------------------------------------------------
+// markItUp!
+// By Jay Salvat - http://markitup.jaysalvat.com/
+// ------------------------------------------------------------------*/
+.markItUp .markItUpButton1 a {
+ background-image:url(images/h1.png);
+}
+.markItUp .markItUpButton2 a {
+ background-image:url(images/h2.png);
+}
+.markItUp .markItUpButton3 a {
+ background-image:url(images/h3.png);
+}
+.markItUp .markItUpButton4 a {
+ background-image:url(images/h4.png);
+}
+.markItUp .markItUpButton5 a {
+ background-image:url(images/h5.png);
+}
+.markItUp .markItUpButton6 a {
+ background-image:url(images/h6.png);
+}
+.markItUp .markItUpButton7 a {
+ background-image:url(images/paragraph.png);
+}
+
+.markItUp .markItUpButton8 a {
+ background-image:url(images/bold.png);
+}
+.markItUp .markItUpButton9 a {
+ background-image:url(images/italic.png);
+}
+.markItUp .markItUpButton10 a {
+ background-image:url(images/stroke.png);
+}
+
+.markItUp .markItUpButton11 a {
+ background-image:url(images/list-bullet.png);
+}
+.markItUp .markItUpButton12 a {
+ background-image:url(images/list-numeric.png);
+}
+
+.markItUp .markItUpButton13 a {
+ background-image:url(images/picture.png);
+}
+.markItUp .markItUpButton14 a {
+ background-image:url(images/link.png);
+}
+
+.markItUp .markItUpButton15 a {
+ background-image:url(images/quotes.png);
+}
+.markItUp .markItUpButton16 a {
+ background-image:url(images/code.png);
+}
+
+.markItUp .preview a {
+ background-image:url(images/preview.png);
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/handle.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/handle.png
new file mode 100644
index 0000000..3993b20
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/handle.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/menu.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/menu.png
new file mode 100644
index 0000000..44a07af
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/menu.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/submenu.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/submenu.png
new file mode 100644
index 0000000..03d1977
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/images/submenu.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/style.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/style.css
new file mode 100644
index 0000000..8755e86
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/skins/django/style.css
@@ -0,0 +1,128 @@
+/* -------------------------------------------------------------------
+// markItUp! Universal MarkUp Engine, JQuery plugin
+// By Jay Salvat - http://markitup.jaysalvat.com/
+// ------------------------------------------------------------------*/
+.markItUp * {
+ margin:0px; padding:0px;
+ outline:none;
+}
+.markItUp a:link,
+.markItUp a:visited {
+ color:#000;
+ text-decoration:none;
+}
+.markItUp {
+ width:800px;
+ margin:5px 0 5px 0;
+ padding-left: 106px;
+}
+.markItUpContainer {
+ font:11px Verdana, Arial, Helvetica, sans-serif;
+}
+.markItUpHeader {
+/* margin-left: 0px;
+ padding-left: 0px;*/
+ padding-top: 3px;
+}
+#id_content.markItUpEditor {
+ font:12px 'Courier New', Courier, monospace;
+ padding:5px;
+ width:790px;
+ height:220px;
+ clear:both;
+ line-height:18px;
+ overflow:auto;
+}
+.markItUpPreviewFrame {
+ overflow:auto;
+ background-color:#FFF;
+ width:99.9%;
+ height:300px;
+ margin:5px 0;
+}
+.markItUpFooter {
+ width:100%;
+}
+.markItUpResizeHandle {
+ overflow:hidden;
+ width:22px; height:5px;
+ margin-left:auto;
+ margin-right:auto;
+ background-image:url(images/handle.png);
+ cursor:n-resize;
+}
+/***************************************************************************************/
+/* first row of buttons */
+div .markItUpHeader ul {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+.markItUpHeader ul li {
+ list-style:none;
+ float:left;
+ position:relative;
+}
+.markItUpHeader ul li:hover > ul{
+ display:block;
+}
+.markItUpHeader ul .markItUpDropMenu {
+ background:transparent url(images/menu.png) no-repeat 115% 50%;
+ margin-right:5px;
+}
+.markItUpHeader ul .markItUpDropMenu li {
+ margin-right:0px;
+}
+/* next rows of buttons */
+.markItUpHeader ul ul {
+ display:none;
+ position:absolute;
+ top:18px; left:0px;
+ background:#FFF;
+ border:1px solid #000;
+}
+.markItUpHeader ul ul li {
+ float:none;
+ border-bottom:1px solid #000;
+}
+.markItUpHeader ul ul .markItUpDropMenu {
+ background:#FFF url(images/submenu.png) no-repeat 100% 50%;
+}
+.markItUpHeader ul .markItUpSeparator {
+ margin:0 10px;
+ width:1px;
+ height:16px;
+ overflow:hidden;
+ background-color:#CCC;
+}
+.markItUpHeader ul ul .markItUpSeparator {
+ width:auto; height:1px;
+ margin:0px;
+}
+/* next rows of buttons */
+.markItUpHeader ul ul ul {
+ position:absolute;
+ top:-1px; left:150px;
+}
+.markItUpHeader ul ul ul li {
+ float:none;
+}
+.markItUpHeader ul a {
+ display:block;
+ width:16px; height:16px;
+ text-indent:-10000px;
+ background-repeat:no-repeat;
+ padding:3px;
+ margin:0px;
+}
+.markItUpHeader ul ul a {
+ display:block;
+ padding-left:0px;
+ text-indent:0;
+ width:120px;
+ padding:5px 5px 5px 25px;
+ background-position:2px 50%;
+}
+.markItUpHeader ul ul a:hover {
+ color:#FFF;
+ background-color:#000;
+}
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/templates/preview.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/templates/preview.css
new file mode 100644
index 0000000..ad91a87
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/templates/preview.css
@@ -0,0 +1,5 @@
+/* preview style examples */
+body {
+ background-color:#EFEFEF;
+ font:70% Verdana, Arial, Helvetica, sans-serif;
+} \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/templates/preview.html b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/templates/preview.html
new file mode 100644
index 0000000..b8b3702
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/markitup/templates/preview.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>markItUp! preview template</title>
+<link rel="stylesheet" type="text/css" href="~/templates/preview.css" />
+</head>
+<body>
+<!-- content -->
+</body>
+</html>
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/mptt_m2m_selectbox.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/mptt_m2m_selectbox.js
new file mode 100644
index 0000000..e7924b6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/mptt_m2m_selectbox.js
@@ -0,0 +1,133 @@
+/*
+ * This is based on the SelectBox.js that comes with Django admin media
+ *
+ */
+
+var SelectBox = {
+ cache: new Object(),
+ init: function(id) {
+ var box = document.getElementById(id);
+ var node;
+ SelectBox.cache[id] = new Array();
+ var cache = SelectBox.cache[id];
+ for (var i = 0; (node = box.options[i]); i++) {
+ cache.push({value: node.value, text: node.text, displayed: 1, tree_id: node.getAttribute('data-tree-id'), left_val: node.getAttribute('data-left-value')});
+ }
+ },
+ redisplay: function(id) {
+ // Repopulate HTML select box from cache
+ var box = document.getElementById(id);
+
+ // for some reason both these steps are neccessary to get browsers to work properly...
+ for (i = 0; i < box.options.length; i++) {
+ box.options[0] = null;
+ }
+ box.options.length = 0;
+
+ SelectBox.sort(id);
+ for (var i = 0, j = SelectBox.cache[id].length; i < j; i++) {
+ var node = SelectBox.cache[id][i];
+ if (node.displayed) {
+ newOpt = new Option(node.text, node.value, false, false);
+ newOpt.setAttribute('data-tree-id', node.tree_id);
+ newOpt.setAttribute('data-left-value', node.left_val);
+ box.options[box.options.length] = newOpt;
+ }
+ }
+ },
+ filter: function(id, text) {
+ // Redisplay the HTML select box, displaying only the choices containing ALL
+ // the words in text. (It's an AND search.)
+ var tokens = text.toLowerCase().split(/\s+/);
+ var node, token;
+ for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+ node.displayed = 1;
+ for (var j = 0; (token = tokens[j]); j++) {
+ if (node.text.toLowerCase().indexOf(token) == -1) {
+ node.displayed = 0;
+ }
+ }
+ }
+ SelectBox.redisplay(id);
+ },
+ delete_from_cache: function(id, value) {
+ var node, delete_index = null;
+ for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+ if (node.value == value) {
+ delete_index = i;
+ break;
+ }
+ }
+ var j = SelectBox.cache[id].length - 1;
+ for (var i = delete_index; i < j; i++) {
+ SelectBox.cache[id][i] = SelectBox.cache[id][i+1];
+ }
+ SelectBox.cache[id].length--;
+ },
+ add_to_cache: function(id, option) {
+ // in this case option is an anonymous object, not an html element
+ SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1, tree_id: option.tree_id, left_val: option.left_val});
+ },
+ cache_contains: function(id, value) {
+ // Check if an item is contained in the cache
+ var node;
+ for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+ if (node.value == value) {
+ return true;
+ }
+ }
+ return false;
+ },
+ move: function(from, to) {
+ var from_box = document.getElementById(from);
+ var to_box = document.getElementById(to);
+ var option;
+ for (var i = 0; (option = from_box.options[i]); i++) {
+ if (option.selected && SelectBox.cache_contains(from, option.value)) {
+ SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1, tree_id: option.getAttribute('data-tree-id'), left_val: option.getAttribute('data-left-value')});
+ SelectBox.delete_from_cache(from, option.value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ move_all: function(from, to) {
+ var from_box = document.getElementById(from);
+ var to_box = document.getElementById(to);
+ var option;
+ for (var i = 0; (option = from_box.options[i]); i++) {
+ if (SelectBox.cache_contains(from, option.value)) {
+ SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1, tree_id: option.getAttribute('data-tree-id'), left_val: option.getAttribute('data-left-value')});
+ SelectBox.delete_from_cache(from, option.value);
+ }
+ }
+ SelectBox.redisplay(from);
+ SelectBox.redisplay(to);
+ },
+ sort: function(id) {
+ SelectBox.cache[id].sort( function(a, b) {
+ a_tree_id = parseInt(a.tree_id);
+ b_tree_id = parseInt(b.tree_id);
+ a_left_val = parseInt(a.left_val);
+ b_left_val = parseInt(b.left_val);
+ try {
+ if (a_tree_id > b_tree_id) return 1;
+ if (a_tree_id < b_tree_id) return -1;
+ if (a_tree_id == b_tree_id) {
+ if (a_left_val > b_left_val) return 1;
+ if (a_left_val < b_left_val) return -1;
+ }
+ }
+ catch (e) {
+ // silently fail on IE 'unknown' exception
+ }
+ return 0;
+ } );
+ },
+ select_all: function(id) {
+ var box = document.getElementById(id);
+ for (var i = 0; i < box.options.length; i++) {
+ box.options[i].selected = 'selected';
+ }
+ }
+}
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-blockquote.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-blockquote.png
new file mode 100644
index 0000000..65ea205
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-blockquote.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h1.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h1.png
new file mode 100644
index 0000000..dea1da3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h1.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h2.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h2.png
new file mode 100644
index 0000000..f4b4274
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h2.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h3.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h3.png
new file mode 100644
index 0000000..bd99f76
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h3.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h4.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h4.png
new file mode 100644
index 0000000..e06ab3d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h4.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h5.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h5.png
new file mode 100644
index 0000000..360fc60
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h5.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h6.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h6.png
new file mode 100644
index 0000000..73e644a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-h6.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-p.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-p.png
new file mode 100644
index 0000000..7f2bf34
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-p.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-pre.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-pre.png
new file mode 100644
index 0000000..e026e47
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/lbl-pre.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/wymiframe.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/wymiframe.css
new file mode 100644
index 0000000..769520c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/wymiframe.css
@@ -0,0 +1,90 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * wymeditor.css
+ * Main editor css file.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+*/
+
+/* VISUAL FEEDBACK */
+
+/* basic */
+ body { background: #e1e8f1;}
+
+/* make HTML blocs visible */
+ p,
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6,
+ ul,
+ ol,
+ table,
+ blockquote,
+ pre { background: #FFFFFF no-repeat 2px 2px;
+ padding:8px 5px 5px;
+ margin:10px; }
+ td { background: #F0F4F8; }
+ th { background: #ffffcc; }
+ ul,
+ ol { border-left:20px solid #B9C4D0; padding:0px 5px; }
+ caption { background: #E4E4B0; padding: 5px; font-weight: bold; }
+ table { font-size: 12px; width: 500px; }
+ td { width: 25%; }
+ blockquote { margin-left: 30px; }
+ pre { background-color:transparent; border: 1px solid white; }
+
+/* Gecko min height fix */
+ p { min-height: 1em; } /*min-height is needed under Firefox, because empty parargraphs */
+ *+html p { min-height: auto; } /* but we have to remove it under IE7 because it triggers the 'haslayout' mode */
+ td { height: 1.6em; }
+
+/* labels */
+ p { background-image: url(lbl-p.png); }
+ h1 { background-image: url(lbl-h1.png); }
+ h2 { background-image: url(lbl-h2.png); }
+ h3 { background-image: url(lbl-h3.png); }
+ h4 { background-image: url(lbl-h4.png); }
+ h5 { background-image: url(lbl-h5.png); }
+ h6 { background-image: url(lbl-h6.png); }
+ blockquote{ background-image: url(lbl-blockquote.png); }
+ pre { background-image: url(lbl-pre.png); }
+
+/* specific HTML elements */
+ caption { text-align: left; }
+ img { margin-right: 5px;
+ border-style: solid;
+ border-color: gray;
+ border-width: 0; }
+ a img { border-width: 1px; border-color: blue; }
+ acronym { border: 1px solid gray; }
+ span { background-color: #eef; }
+
+/* visual feedback for non-valid nesting of elements*/
+ h1 h1, h1 h2, h1 h3, h1 h4, h1 h5, h1 h6, h1 p, h1 pre, h1 address,
+ h2 h1, h2 h2, h2 h3, h2 h4, h2 h5, h2 h6, h2 p, h2 pre, h2 address,
+ h3 h1, h3 h2, h3 h3, h3 h4, h3 h5, h3 h6, h3 p, h3 pre, h3 address,
+ h4 h1, h4 h2, h4 h3, h4 h4, h4 h5, h4 h6, h4 p, h4 pre, h4 address,
+ h5 h1, h5 h2, h5 h3, h5 h4, h5 h5, h5 h6, h5 p, h5 pre, h5 address,
+ h6 h1, h6 h2, h6 h3, h6 h4, h6 h4, h6 h6, h6 p, h6 pre, h6 address,
+ p h1, p h2, p h3, p h4, p h5, p h6, p pre, p address,
+ pre h1, pre h2, pre h3, pre h4, pre h5, pre h6, pre p, pre pre, pre address,
+ address h1, address h2, address h3, address h4, address h5, address h6,
+ address p, address pre, address address
+ { background-color: #ff9999 !important;
+ border: 1px solid red !important;
+ font-size: 12px !important;
+ font-weight: normal; }
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/wymiframe.html b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/wymiframe.html
new file mode 100644
index 0000000..91a690c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/iframe/default/wymiframe.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!--
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * wymiframe.html
+ * Iframe used by designMode.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+-->
+<html>
+<head>
+<title>WYMeditor iframe</title>
+<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
+<link rel="stylesheet" type="text/css" media="screen" href="wymiframe.css" />
+</head>
+<body class="wym_iframe"></body>
+</html>
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.js
new file mode 100644
index 0000000..0667d85
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.js
@@ -0,0 +1,4688 @@
+/**
+ * @version 0.5-rc1
+ *
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File: jquery.wymeditor.js
+ *
+ * Main JS file with core classes and functions.
+ * See the documentation for more info.
+ *
+ * About: authors
+ *
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ * Volker Mische (vmx a-t gmx dotde)
+ * Scott Lewis (lewiscot a-t gmail dotcom)
+ * Bermi Ferrer (wymeditor a-t bermi dotorg)
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+ * Jonatan Lundin (jonatan.lundin a-t gmail dotcom)
+ */
+
+/*
+ Namespace: WYMeditor
+ Global WYMeditor namespace.
+*/
+if(!WYMeditor) var WYMeditor = {};
+
+//Wrap the Firebug console in WYMeditor.console
+(function() {
+ if ( !window.console || !console.firebug ) {
+ var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+ "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+
+ WYMeditor.console = {};
+ for (var i = 0; i < names.length; ++i)
+ WYMeditor.console[names[i]] = function() {}
+
+ } else WYMeditor.console = window.console;
+})();
+
+jQuery.extend(WYMeditor, {
+
+/*
+ Constants: Global WYMeditor constants.
+
+ VERSION - Defines WYMeditor version.
+ INSTANCES - An array of loaded WYMeditor.editor instances.
+ STRINGS - An array of loaded WYMeditor language pairs/values.
+ SKINS - An array of loaded WYMeditor skins.
+ NAME - The "name" attribute.
+ INDEX - A string replaced by the instance index.
+ WYM_INDEX - A string used to get/set the instance index.
+ BASE_PATH - A string replaced by WYMeditor's base path.
+ SKIN_PATH - A string replaced by WYMeditor's skin path.
+ WYM_PATH - A string replaced by WYMeditor's main JS file path.
+ SKINS_DEFAULT_PATH - The skins default base path.
+ SKINS_DEFAULT_CSS - The skins default CSS file.
+ LANG_DEFAULT_PATH - The language files default path.
+ IFRAME_BASE_PATH - A string replaced by the designmode iframe's base path.
+ IFRAME_DEFAULT - The iframe's default base path.
+ JQUERY_PATH - A string replaced by the computed jQuery path.
+ DIRECTION - A string replaced by the text direction (rtl or ltr).
+ LOGO - A string replaced by WYMeditor logo.
+ TOOLS - A string replaced by the toolbar's HTML.
+ TOOLS_ITEMS - A string replaced by the toolbar items.
+ TOOL_NAME - A string replaced by a toolbar item's name.
+ TOOL_TITLE - A string replaced by a toolbar item's title.
+ TOOL_CLASS - A string replaced by a toolbar item's class.
+ CLASSES - A string replaced by the classes panel's HTML.
+ CLASSES_ITEMS - A string replaced by the classes items.
+ CLASS_NAME - A string replaced by a class item's name.
+ CLASS_TITLE - A string replaced by a class item's title.
+ CONTAINERS - A string replaced by the containers panel's HTML.
+ CONTAINERS_ITEMS - A string replaced by the containers items.
+ CONTAINER_NAME - A string replaced by a container item's name.
+ CONTAINER_TITLE - A string replaced by a container item's title.
+ CONTAINER_CLASS - A string replaced by a container item's class.
+ HTML - A string replaced by the HTML view panel's HTML.
+ IFRAME - A string replaced by the designmode iframe.
+ STATUS - A string replaced by the status panel's HTML.
+ DIALOG_TITLE - A string replaced by a dialog's title.
+ DIALOG_BODY - A string replaced by a dialog's HTML body.
+ BODY - The BODY element.
+ STRING - The "string" type.
+ BODY,DIV,P,
+ H1,H2,H3,H4,H5,H6,
+ PRE,BLOCKQUOTE,
+ A,BR,IMG,
+ TABLE,TD,TH,
+ UL,OL,LI - HTML elements string representation.
+ CLASS,HREF,SRC,
+ TITLE,ALT - HTML attributes string representation.
+ DIALOG_LINK - A link dialog type.
+ DIALOG_IMAGE - An image dialog type.
+ DIALOG_TABLE - A table dialog type.
+ DIALOG_PASTE - A 'Paste from Word' dialog type.
+ BOLD - Command: (un)set selection to <strong>.
+ ITALIC - Command: (un)set selection to <em>.
+ CREATE_LINK - Command: open the link dialog or (un)set link.
+ INSERT_IMAGE - Command: open the image dialog or insert an image.
+ INSERT_TABLE - Command: open the table dialog.
+ PASTE - Command: open the paste dialog.
+ INDENT - Command: nest a list item.
+ OUTDENT - Command: unnest a list item.
+ TOGGLE_HTML - Command: display/hide the HTML view.
+ FORMAT_BLOCK - Command: set a block element to another type.
+ PREVIEW - Command: open the preview dialog.
+ UNLINK - Command: unset a link.
+ INSERT_UNORDEREDLIST- Command: insert an unordered list.
+ INSERT_ORDEREDLIST - Command: insert an ordered list.
+ MAIN_CONTAINERS - An array of the main HTML containers used in WYMeditor.
+ BLOCKS - An array of the HTML block elements.
+ KEY - Standard key codes.
+ NODE - Node types.
+
+*/
+
+ VERSION : "0.5-rc1",
+ INSTANCES : [],
+ STRINGS : [],
+ SKINS : [],
+ NAME : "name",
+ INDEX : "{Wym_Index}",
+ WYM_INDEX : "wym_index",
+ BASE_PATH : "{Wym_Base_Path}",
+ CSS_PATH : "{Wym_Css_Path}",
+ WYM_PATH : "{Wym_Wym_Path}",
+ SKINS_DEFAULT_PATH : "skins/",
+ SKINS_DEFAULT_CSS : "skin.css",
+ SKINS_DEFAULT_JS : "skin.js",
+ LANG_DEFAULT_PATH : "lang/",
+ IFRAME_BASE_PATH : "{Wym_Iframe_Base_Path}",
+ IFRAME_DEFAULT : "iframe/default/",
+ JQUERY_PATH : "{Wym_Jquery_Path}",
+ DIRECTION : "{Wym_Direction}",
+ LOGO : "{Wym_Logo}",
+ TOOLS : "{Wym_Tools}",
+ TOOLS_ITEMS : "{Wym_Tools_Items}",
+ TOOL_NAME : "{Wym_Tool_Name}",
+ TOOL_TITLE : "{Wym_Tool_Title}",
+ TOOL_CLASS : "{Wym_Tool_Class}",
+ CLASSES : "{Wym_Classes}",
+ CLASSES_ITEMS : "{Wym_Classes_Items}",
+ CLASS_NAME : "{Wym_Class_Name}",
+ CLASS_TITLE : "{Wym_Class_Title}",
+ CONTAINERS : "{Wym_Containers}",
+ CONTAINERS_ITEMS : "{Wym_Containers_Items}",
+ CONTAINER_NAME : "{Wym_Container_Name}",
+ CONTAINER_TITLE : "{Wym_Containers_Title}",
+ CONTAINER_CLASS : "{Wym_Container_Class}",
+ HTML : "{Wym_Html}",
+ IFRAME : "{Wym_Iframe}",
+ STATUS : "{Wym_Status}",
+ DIALOG_TITLE : "{Wym_Dialog_Title}",
+ DIALOG_BODY : "{Wym_Dialog_Body}",
+ STRING : "string",
+ BODY : "body",
+ DIV : "div",
+ P : "p",
+ H1 : "h1",
+ H2 : "h2",
+ H3 : "h3",
+ H4 : "h4",
+ H5 : "h5",
+ H6 : "h6",
+ PRE : "pre",
+ BLOCKQUOTE : "blockquote",
+ A : "a",
+ BR : "br",
+ IMG : "img",
+ TABLE : "table",
+ TD : "td",
+ TH : "th",
+ UL : "ul",
+ OL : "ol",
+ LI : "li",
+ CLASS : "class",
+ HREF : "href",
+ SRC : "src",
+ TITLE : "title",
+ ALT : "alt",
+ DIALOG_LINK : "Link",
+ DIALOG_IMAGE : "Image",
+ DIALOG_TABLE : "Table",
+ DIALOG_PASTE : "Paste_From_Word",
+ BOLD : "Bold",
+ ITALIC : "Italic",
+ CREATE_LINK : "CreateLink",
+ INSERT_IMAGE : "InsertImage",
+ INSERT_TABLE : "InsertTable",
+ INSERT_HTML : "InsertHTML",
+ PASTE : "Paste",
+ INDENT : "Indent",
+ OUTDENT : "Outdent",
+ TOGGLE_HTML : "ToggleHtml",
+ FORMAT_BLOCK : "FormatBlock",
+ PREVIEW : "Preview",
+ UNLINK : "Unlink",
+ INSERT_UNORDEREDLIST: "InsertUnorderedList",
+ INSERT_ORDEREDLIST : "InsertOrderedList",
+
+ MAIN_CONTAINERS : new Array("p","h1","h2","h3","h4","h5","h6","pre","blockquote"),
+
+ BLOCKS : new Array("address", "blockquote", "div", "dl",
+ "fieldset", "form", "h1", "h2", "h3", "h4", "h5", "h6", "hr",
+ "noscript", "ol", "p", "pre", "table", "ul", "dd", "dt",
+ "li", "tbody", "td", "tfoot", "th", "thead", "tr"),
+
+ KEY : {
+ BACKSPACE: 8,
+ ENTER: 13,
+ END: 35,
+ HOME: 36,
+ LEFT: 37,
+ UP: 38,
+ RIGHT: 39,
+ DOWN: 40,
+ CURSOR: new Array(37, 38, 39, 40),
+ DELETE: 46
+ },
+
+ NODE : {
+ ELEMENT: 1,
+ ATTRIBUTE: 2,
+ TEXT: 3
+ },
+
+ /*
+ Class: WYMeditor.editor
+ WYMeditor editor main class, instanciated for each editor occurrence.
+ */
+
+ editor : function(elem, options) {
+
+ /*
+ Constructor: WYMeditor.editor
+
+ Initializes main values (index, elements, paths, ...)
+ and call WYMeditor.editor.init which initializes the editor.
+
+ Parameters:
+
+ elem - The HTML element to be replaced by the editor.
+ options - The hash of options.
+
+ Returns:
+
+ Nothing.
+
+ See Also:
+
+ <WYMeditor.editor.init>
+ */
+
+ //store the instance in the INSTANCES array and store the index
+ this._index = WYMeditor.INSTANCES.push(this) - 1;
+ //store the element replaced by the editor
+ this._element = elem;
+ //store the options
+ this._options = options;
+ //store the element's inner value
+ this._html = jQuery(elem).val();
+
+ //store the HTML option, if any
+ if(this._options.html) this._html = this._options.html;
+ //get or compute the base path (where the main JS file is located)
+ this._options.basePath = this._options.basePath
+ || this.computeBasePath();
+ //get or set the skin path (where the skin files are located)
+ this._options.skinPath = this._options.skinPath
+ || this._options.basePath + WYMeditor.SKINS_DEFAULT_PATH
+ + this._options.skin + '/';
+ //get or compute the main JS file location
+ this._options.wymPath = this._options.wymPath
+ || this.computeWymPath();
+ //get or set the language files path
+ this._options.langPath = this._options.langPath
+ || this._options.basePath + WYMeditor.LANG_DEFAULT_PATH;
+ //get or set the designmode iframe's base path
+ this._options.iframeBasePath = this._options.iframeBasePath
+ || this._options.basePath + WYMeditor.IFRAME_DEFAULT;
+ //get or compute the jQuery JS file location
+ this._options.jQueryPath = this._options.jQueryPath
+ || this.computeJqueryPath();
+
+ //initialize the editor instance
+ this.init();
+
+ }
+
+});
+
+
+/********** JQUERY **********/
+
+/**
+ * Replace an HTML element by WYMeditor
+ *
+ * @example jQuery(".wymeditor").wymeditor(
+ * {
+ *
+ * }
+ * );
+ * @desc Example description here
+ *
+ * @name WYMeditor
+ * @description WYMeditor is a web-based WYSIWYM XHTML editor
+ * @param Hash hash A hash of parameters
+ * @option Integer iExample Description here
+ * @option String sExample Description here
+ *
+ * @type jQuery
+ * @cat Plugins/WYMeditor
+ * @author Jean-Francois Hovinne
+ */
+jQuery.fn.wymeditor = function(options) {
+
+ options = jQuery.extend({
+
+ html: "",
+
+ basePath: false,
+
+ skinPath: false,
+
+ wymPath: false,
+
+ iframeBasePath: false,
+
+ jQueryPath: false,
+
+ styles: false,
+
+ stylesheet: false,
+
+ skin: "default",
+ initSkin: true,
+ loadSkin: true,
+
+ lang: "en",
+
+ direction: "ltr",
+
+ boxHtml: "<div class='wym_box'>"
+ + "<div class='wym_area_top'>"
+ + WYMeditor.TOOLS
+ + "</div>"
+ + "<div class='wym_area_left'></div>"
+ + "<div class='wym_area_right'>"
+ + WYMeditor.CONTAINERS
+ + WYMeditor.CLASSES
+ + "</div>"
+ + "<div class='wym_area_main'>"
+ + WYMeditor.HTML
+ + WYMeditor.IFRAME
+ + WYMeditor.STATUS
+ + "</div>"
+ + "<div class='wym_area_bottom'>"
+ + WYMeditor.LOGO
+ + "</div>"
+ + "</div>",
+
+ logoHtml: "<a class='wym_wymeditor_link' "
+ + "href='http://www.wymeditor.org/'>WYMeditor</a>",
+
+ iframeHtml:"<div class='wym_iframe wym_section'>"
+ + "<iframe "
+ + "src='"
+ + WYMeditor.IFRAME_BASE_PATH
+ + "wymiframe.html' "
+ + "onload='this.contentWindow.parent.WYMeditor.INSTANCES["
+ + WYMeditor.INDEX + "].initIframe(this)'"
+ + "></iframe>"
+ + "</div>",
+
+ editorStyles: [],
+
+ toolsHtml: "<div class='wym_tools wym_section'>"
+ + "<h2>{Tools}</h2>"
+ + "<ul>"
+ + WYMeditor.TOOLS_ITEMS
+ + "</ul>"
+ + "</div>",
+
+ toolsItemHtml: "<li class='"
+ + WYMeditor.TOOL_CLASS
+ + "'><a href='#' name='"
+ + WYMeditor.TOOL_NAME
+ + "' title='"
+ + WYMeditor.TOOL_TITLE
+ + "'>"
+ + WYMeditor.TOOL_TITLE
+ + "</a></li>",
+
+ toolsItems: [
+ {'name': 'Bold', 'title': 'Strong', 'css': 'wym_tools_strong'},
+ {'name': 'Italic', 'title': 'Emphasis', 'css': 'wym_tools_emphasis'},
+ {'name': 'Superscript', 'title': 'Superscript',
+ 'css': 'wym_tools_superscript'},
+ {'name': 'Subscript', 'title': 'Subscript',
+ 'css': 'wym_tools_subscript'},
+ {'name': 'InsertOrderedList', 'title': 'Ordered_List',
+ 'css': 'wym_tools_ordered_list'},
+ {'name': 'InsertUnorderedList', 'title': 'Unordered_List',
+ 'css': 'wym_tools_unordered_list'},
+ {'name': 'Indent', 'title': 'Indent', 'css': 'wym_tools_indent'},
+ {'name': 'Outdent', 'title': 'Outdent', 'css': 'wym_tools_outdent'},
+ {'name': 'Undo', 'title': 'Undo', 'css': 'wym_tools_undo'},
+ {'name': 'Redo', 'title': 'Redo', 'css': 'wym_tools_redo'},
+ {'name': 'CreateLink', 'title': 'Link', 'css': 'wym_tools_link'},
+ {'name': 'Unlink', 'title': 'Unlink', 'css': 'wym_tools_unlink'},
+ {'name': 'InsertImage', 'title': 'Image', 'css': 'wym_tools_image'},
+ {'name': 'InsertTable', 'title': 'Table', 'css': 'wym_tools_table'},
+ {'name': 'Paste', 'title': 'Paste_From_Word',
+ 'css': 'wym_tools_paste'},
+ {'name': 'ToggleHtml', 'title': 'HTML', 'css': 'wym_tools_html'},
+ {'name': 'Preview', 'title': 'Preview', 'css': 'wym_tools_preview'}
+ ],
+
+ containersHtml: "<div class='wym_containers wym_section'>"
+ + "<h2>{Containers}</h2>"
+ + "<ul>"
+ + WYMeditor.CONTAINERS_ITEMS
+ + "</ul>"
+ + "</div>",
+
+ containersItemHtml:"<li class='"
+ + WYMeditor.CONTAINER_CLASS
+ + "'>"
+ + "<a href='#' name='"
+ + WYMeditor.CONTAINER_NAME
+ + "'>"
+ + WYMeditor.CONTAINER_TITLE
+ + "</a></li>",
+
+ containersItems: [
+ {'name': 'P', 'title': 'Paragraph', 'css': 'wym_containers_p'},
+ {'name': 'H1', 'title': 'Heading_1', 'css': 'wym_containers_h1'},
+ {'name': 'H2', 'title': 'Heading_2', 'css': 'wym_containers_h2'},
+ {'name': 'H3', 'title': 'Heading_3', 'css': 'wym_containers_h3'},
+ {'name': 'H4', 'title': 'Heading_4', 'css': 'wym_containers_h4'},
+ {'name': 'H5', 'title': 'Heading_5', 'css': 'wym_containers_h5'},
+ {'name': 'H6', 'title': 'Heading_6', 'css': 'wym_containers_h6'},
+ {'name': 'PRE', 'title': 'Preformatted', 'css': 'wym_containers_pre'},
+ {'name': 'BLOCKQUOTE', 'title': 'Blockquote',
+ 'css': 'wym_containers_blockquote'},
+ {'name': 'TH', 'title': 'Table_Header', 'css': 'wym_containers_th'}
+ ],
+
+ classesHtml: "<div class='wym_classes wym_section'>"
+ + "<h2>{Classes}</h2><ul>"
+ + WYMeditor.CLASSES_ITEMS
+ + "</ul></div>",
+
+ classesItemHtml: "<li class='wym_classes_"
+ + WYMeditor.CLASS_NAME
+ + "'><a href='#' name='"
+ + WYMeditor.CLASS_NAME
+ + "'>"
+ + WYMeditor.CLASS_TITLE
+ + "</a></li>",
+
+ classesItems: [],
+
+ statusHtml: "<div class='wym_status wym_section'>"
+ + "<h2>{Status}</h2>"
+ + "</div>",
+
+ htmlHtml: "<div class='wym_html wym_section'>"
+ + "<h2>{Source_Code}</h2>"
+ + "<textarea class='wym_html_val'></textarea>"
+ + "</div>",
+
+ boxSelector: ".wym_box",
+ toolsSelector: ".wym_tools",
+ toolsListSelector: " ul",
+ containersSelector:".wym_containers",
+ classesSelector: ".wym_classes",
+ htmlSelector: ".wym_html",
+ iframeSelector: ".wym_iframe iframe",
+ iframeBodySelector:".wym_iframe",
+ statusSelector: ".wym_status",
+ toolSelector: ".wym_tools a",
+ containerSelector: ".wym_containers a",
+ classSelector: ".wym_classes a",
+ htmlValSelector: ".wym_html_val",
+
+ hrefSelector: ".wym_href",
+ srcSelector: ".wym_src",
+ titleSelector: ".wym_title",
+ altSelector: ".wym_alt",
+ textSelector: ".wym_text",
+
+ rowsSelector: ".wym_rows",
+ colsSelector: ".wym_cols",
+ captionSelector: ".wym_caption",
+ summarySelector: ".wym_summary",
+
+ submitSelector: ".wym_submit",
+ cancelSelector: ".wym_cancel",
+ previewSelector: "",
+
+ dialogTypeSelector: ".wym_dialog_type",
+ dialogLinkSelector: ".wym_dialog_link",
+ dialogImageSelector: ".wym_dialog_image",
+ dialogTableSelector: ".wym_dialog_table",
+ dialogPasteSelector: ".wym_dialog_paste",
+ dialogPreviewSelector: ".wym_dialog_preview",
+
+ updateSelector: ".wymupdate",
+ updateEvent: "click",
+
+ dialogFeatures: "menubar=no,titlebar=no,toolbar=no,resizable=no"
+ + ",width=560,height=300,top=0,left=0",
+ dialogFeaturesPreview: "menubar=no,titlebar=no,toolbar=no,resizable=no"
+ + ",scrollbars=yes,width=560,height=300,top=0,left=0",
+
+ dialogHtml: "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'"
+ + " 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>"
+ + "<html dir='"
+ + WYMeditor.DIRECTION
+ + "'><head>"
+ + "<link rel='stylesheet' type='text/css' media='screen'"
+ + " href='"
+ + WYMeditor.CSS_PATH
+ + "' />"
+ + "<title>"
+ + WYMeditor.DIALOG_TITLE
+ + "</title>"
+ + "<script type='text/javascript'"
+ + " src='"
+ + WYMeditor.JQUERY_PATH
+ + "'></script>"
+ + "<script type='text/javascript'"
+ + " src='"
+ + WYMeditor.WYM_PATH
+ + "'></script>"
+ + "</head>"
+ + WYMeditor.DIALOG_BODY
+ + "</html>",
+
+ dialogLinkHtml: "<body class='wym_dialog wym_dialog_link'"
+ + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'"
+ + ">"
+ + "<form>"
+ + "<fieldset>"
+ + "<input type='hidden' class='wym_dialog_type' value='"
+ + WYMeditor.DIALOG_LINK
+ + "' />"
+ + "<legend>{Link}</legend>"
+ + "<div class='row'>"
+ + "<label>{URL}</label>"
+ + "<input type='text' class='wym_href' value='' size='40' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Title}</label>"
+ + "<input type='text' class='wym_title' value='' size='40' />"
+ + "</div>"
+ + "<div class='row row-indent'>"
+ + "<input class='wym_submit' type='button'"
+ + " value='{Submit}' />"
+ + "<input class='wym_cancel' type='button'"
+ + "value='{Cancel}' />"
+ + "</div>"
+ + "</fieldset>"
+ + "</form>"
+ + "</body>",
+
+ dialogImageHtml: "<body class='wym_dialog wym_dialog_image'"
+ + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'"
+ + ">"
+ + "<form>"
+ + "<fieldset>"
+ + "<input type='hidden' class='wym_dialog_type' value='"
+ + WYMeditor.DIALOG_IMAGE
+ + "' />"
+ + "<legend>{Image}</legend>"
+ + "<div class='row'>"
+ + "<label>{URL}</label>"
+ + "<input type='text' class='wym_src' value='' size='40' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Alternative_Text}</label>"
+ + "<input type='text' class='wym_alt' value='' size='40' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Title}</label>"
+ + "<input type='text' class='wym_title' value='' size='40' />"
+ + "</div>"
+ + "<div class='row row-indent'>"
+ + "<input class='wym_submit' type='button'"
+ + " value='{Submit}' />"
+ + "<input class='wym_cancel' type='button'"
+ + "value='{Cancel}' />"
+ + "</div>"
+ + "</fieldset>"
+ + "</form>"
+ + "</body>",
+
+ dialogTableHtml: "<body class='wym_dialog wym_dialog_table'"
+ + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'"
+ + ">"
+ + "<form>"
+ + "<fieldset>"
+ + "<input type='hidden' class='wym_dialog_type' value='"
+ + WYMeditor.DIALOG_TABLE
+ + "' />"
+ + "<legend>{Table}</legend>"
+ + "<div class='row'>"
+ + "<label>{Caption}</label>"
+ + "<input type='text' class='wym_caption' value='' size='40' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Summary}</label>"
+ + "<input type='text' class='wym_summary' value='' size='40' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Number_Of_Rows}</label>"
+ + "<input type='text' class='wym_rows' value='3' size='3' />"
+ + "</div>"
+ + "<div class='row'>"
+ + "<label>{Number_Of_Cols}</label>"
+ + "<input type='text' class='wym_cols' value='2' size='3' />"
+ + "</div>"
+ + "<div class='row row-indent'>"
+ + "<input class='wym_submit' type='button'"
+ + " value='{Submit}' />"
+ + "<input class='wym_cancel' type='button'"
+ + "value='{Cancel}' />"
+ + "</div>"
+ + "</fieldset>"
+ + "</form>"
+ + "</body>",
+
+ dialogPasteHtml: "<body class='wym_dialog wym_dialog_paste'"
+ + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'"
+ + ">"
+ + "<form>"
+ + "<input type='hidden' class='wym_dialog_type' value='"
+ + WYMeditor.DIALOG_PASTE
+ + "' />"
+ + "<fieldset>"
+ + "<legend>{Paste_From_Word}</legend>"
+ + "<div class='row'>"
+ + "<textarea class='wym_text' rows='10' cols='50'></textarea>"
+ + "</div>"
+ + "<div class='row'>"
+ + "<input class='wym_submit' type='button'"
+ + " value='{Submit}' />"
+ + "<input class='wym_cancel' type='button'"
+ + "value='{Cancel}' />"
+ + "</div>"
+ + "</fieldset>"
+ + "</form>"
+ + "</body>",
+
+ dialogPreviewHtml: "<body class='wym_dialog wym_dialog_preview'"
+ + " onload='WYMeditor.INIT_DIALOG(" + WYMeditor.INDEX + ")'"
+ + "></body>",
+
+ dialogStyles: [],
+
+ stringDelimiterLeft: "{",
+ stringDelimiterRight:"}",
+
+ preInit: null,
+ preBind: null,
+ postInit: null,
+
+ preInitDialog: null,
+ postInitDialog: null
+
+ }, options);
+
+ return this.each(function() {
+
+ new WYMeditor.editor(jQuery(this),options);
+ });
+};
+
+/* @name extend
+ * @description Returns the WYMeditor instance based on its index
+ */
+jQuery.extend({
+ wymeditors: function(i) {
+ return (WYMeditor.INSTANCES[i]);
+ }
+});
+
+
+/********** WYMeditor **********/
+
+/* @name Wymeditor
+ * @description WYMeditor class
+ */
+
+/* @name init
+ * @description Initializes a WYMeditor instance
+ */
+WYMeditor.editor.prototype.init = function() {
+
+ //load subclass - browser specific
+ //unsupported browsers: do nothing
+ if (jQuery.browser.msie) {
+ var WymClass = new WYMeditor.WymClassExplorer(this);
+ }
+ else if (jQuery.browser.mozilla) {
+ var WymClass = new WYMeditor.WymClassMozilla(this);
+ }
+ else if (jQuery.browser.opera) {
+ var WymClass = new WYMeditor.WymClassOpera(this);
+ }
+ else if (jQuery.browser.safari) {
+ var WymClass = new WYMeditor.WymClassSafari(this);
+ }
+
+ if(WymClass) {
+
+ if(jQuery.isFunction(this._options.preInit)) this._options.preInit(this);
+
+ var SaxListener = new WYMeditor.XhtmlSaxListener();
+ jQuery.extend(SaxListener, WymClass);
+ this.parser = new WYMeditor.XhtmlParser(SaxListener);
+
+ if(this._options.styles || this._options.stylesheet){
+ this.configureEditorUsingRawCss();
+ }
+
+ this.helper = new WYMeditor.XmlHelper();
+
+ //extend the Wymeditor object
+ //don't use jQuery.extend since 1.1.4
+ //jQuery.extend(this, WymClass);
+ for (var prop in WymClass) { this[prop] = WymClass[prop]; }
+
+ //load wymbox
+ this._box = jQuery(this._element).hide().after(this._options.boxHtml).next().addClass('wym_box_' + this._index);
+
+ //store the instance index in wymbox and element replaced by editor instance
+ //but keep it compatible with jQuery < 1.2.3, see #122
+ if( jQuery.isFunction( jQuery.fn.data ) ) {
+ jQuery.data(this._box.get(0), WYMeditor.WYM_INDEX, this._index);
+ jQuery.data(this._element.get(0), WYMeditor.WYM_INDEX, this._index);
+ }
+
+ var h = WYMeditor.Helper;
+
+ //construct the iframe
+ var iframeHtml = this._options.iframeHtml;
+ iframeHtml = h.replaceAll(iframeHtml, WYMeditor.INDEX, this._index);
+ iframeHtml = h.replaceAll(iframeHtml, WYMeditor.IFRAME_BASE_PATH, this._options.iframeBasePath);
+
+ //construct wymbox
+ var boxHtml = jQuery(this._box).html();
+
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.LOGO, this._options.logoHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.TOOLS, this._options.toolsHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.CONTAINERS,this._options.containersHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.CLASSES, this._options.classesHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.HTML, this._options.htmlHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.IFRAME, iframeHtml);
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.STATUS, this._options.statusHtml);
+
+ //construct tools list
+ var aTools = eval(this._options.toolsItems);
+ var sTools = "";
+
+ for(var i = 0; i < aTools.length; i++) {
+ var oTool = aTools[i];
+ if(oTool.name && oTool.title)
+ var sTool = this._options.toolsItemHtml;
+ var sTool = h.replaceAll(sTool, WYMeditor.TOOL_NAME, oTool.name);
+ sTool = h.replaceAll(sTool, WYMeditor.TOOL_TITLE, this._options.stringDelimiterLeft
+ + oTool.title
+ + this._options.stringDelimiterRight);
+ sTool = h.replaceAll(sTool, WYMeditor.TOOL_CLASS, oTool.css);
+ sTools += sTool;
+ }
+
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.TOOLS_ITEMS, sTools);
+
+ //construct classes list
+ var aClasses = eval(this._options.classesItems);
+ var sClasses = "";
+
+ for(var i = 0; i < aClasses.length; i++) {
+ var oClass = aClasses[i];
+ if(oClass.name && oClass.title)
+ var sClass = this._options.classesItemHtml;
+ sClass = h.replaceAll(sClass, WYMeditor.CLASS_NAME, oClass.name);
+ sClass = h.replaceAll(sClass, WYMeditor.CLASS_TITLE, oClass.title);
+ sClasses += sClass;
+ }
+
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.CLASSES_ITEMS, sClasses);
+
+ //construct containers list
+ var aContainers = eval(this._options.containersItems);
+ var sContainers = "";
+
+ for(var i = 0; i < aContainers.length; i++) {
+ var oContainer = aContainers[i];
+ if(oContainer.name && oContainer.title)
+ var sContainer = this._options.containersItemHtml;
+ sContainer = h.replaceAll(sContainer, WYMeditor.CONTAINER_NAME, oContainer.name);
+ sContainer = h.replaceAll(sContainer, WYMeditor.CONTAINER_TITLE,
+ this._options.stringDelimiterLeft
+ + oContainer.title
+ + this._options.stringDelimiterRight);
+ sContainer = h.replaceAll(sContainer, WYMeditor.CONTAINER_CLASS, oContainer.css);
+ sContainers += sContainer;
+ }
+
+ boxHtml = h.replaceAll(boxHtml, WYMeditor.CONTAINERS_ITEMS, sContainers);
+
+ //l10n
+ boxHtml = this.replaceStrings(boxHtml);
+
+ //load html in wymbox
+ jQuery(this._box).html(boxHtml);
+
+ //hide the html value
+ jQuery(this._box).find(this._options.htmlSelector).hide();
+
+ //enable the skin
+ this.loadSkin();
+
+ }
+};
+
+WYMeditor.editor.prototype.bindEvents = function() {
+
+ //copy the instance
+ var wym = this;
+
+ //handle click event on tools buttons
+ jQuery(this._box).find(this._options.toolSelector).click(function() {
+ wym._iframe.contentWindow.focus(); //See #154
+ wym.exec(jQuery(this).attr(WYMeditor.NAME));
+ return(false);
+ });
+
+ //handle click event on containers buttons
+ jQuery(this._box).find(this._options.containerSelector).click(function() {
+ wym.container(jQuery(this).attr(WYMeditor.NAME));
+ return(false);
+ });
+
+ //handle keyup event on html value: set the editor value
+ //handle focus/blur events to check if the element has focus, see #147
+ jQuery(this._box).find(this._options.htmlValSelector)
+ .keyup(function() { jQuery(wym._doc.body).html(jQuery(this).val());})
+ .focus(function() { jQuery(this).toggleClass('hasfocus'); })
+ .blur(function() { jQuery(this).toggleClass('hasfocus'); });
+
+ //handle click event on classes buttons
+ jQuery(this._box).find(this._options.classSelector).click(function() {
+
+ var aClasses = eval(wym._options.classesItems);
+ var sName = jQuery(this).attr(WYMeditor.NAME);
+
+ var oClass = WYMeditor.Helper.findByName(aClasses, sName);
+
+ if(oClass) {
+ var jqexpr = oClass.expr;
+ wym.toggleClass(sName, jqexpr);
+ }
+ wym._iframe.contentWindow.focus(); //See #154
+ return(false);
+ });
+
+ //handle event on update element
+ jQuery(this._options.updateSelector)
+ .bind(this._options.updateEvent, function() {
+ wym.update();
+ });
+};
+
+WYMeditor.editor.prototype.ready = function() {
+ return(this._doc != null);
+};
+
+
+/********** METHODS **********/
+
+/* @name box
+ * @description Returns the WYMeditor container
+ */
+WYMeditor.editor.prototype.box = function() {
+ return(this._box);
+};
+
+/* @name html
+ * @description Get/Set the html value
+ */
+WYMeditor.editor.prototype.html = function(html) {
+
+ if(typeof html === 'string') jQuery(this._doc.body).html(html);
+ else return(jQuery(this._doc.body).html());
+};
+
+/* @name xhtml
+ * @description Cleans up the HTML
+ */
+WYMeditor.editor.prototype.xhtml = function() {
+ return this.parser.parse(this.html());
+};
+
+/* @name exec
+ * @description Executes a button command
+ */
+WYMeditor.editor.prototype.exec = function(cmd) {
+
+ //base function for execCommand
+ //open a dialog or exec
+ switch(cmd) {
+ case WYMeditor.CREATE_LINK:
+ var container = this.container();
+ if(container || this._selected_image) this.dialog(WYMeditor.DIALOG_LINK);
+ break;
+
+ case WYMeditor.INSERT_IMAGE:
+ this.dialog(WYMeditor.DIALOG_IMAGE);
+ break;
+
+ case WYMeditor.INSERT_TABLE:
+ this.dialog(WYMeditor.DIALOG_TABLE);
+ break;
+
+ case WYMeditor.PASTE:
+ this.dialog(WYMeditor.DIALOG_PASTE);
+ break;
+
+ case WYMeditor.TOGGLE_HTML:
+ this.update();
+ this.toggleHtml();
+ break;
+
+ case WYMeditor.PREVIEW:
+ this.dialog(WYMeditor.PREVIEW, this._options.dialogFeaturesPreview);
+ break;
+
+ default:
+ this._exec(cmd);
+ break;
+ }
+};
+
+/* @name container
+ * @description Get/Set the selected container
+ */
+WYMeditor.editor.prototype.container = function(sType) {
+
+ if(sType) {
+
+ var container = null;
+
+ if(sType.toLowerCase() == WYMeditor.TH) {
+
+ container = this.container();
+
+ //find the TD or TH container
+ switch(container.tagName.toLowerCase()) {
+
+ case WYMeditor.TD: case WYMeditor.TH:
+ break;
+ default:
+ var aTypes = new Array(WYMeditor.TD,WYMeditor.TH);
+ container = this.findUp(this.container(), aTypes);
+ break;
+ }
+
+ //if it exists, switch
+ if(container!=null) {
+
+ sType = (container.tagName.toLowerCase() == WYMeditor.TD)? WYMeditor.TH: WYMeditor.TD;
+ this.switchTo(container,sType);
+ this.update();
+ }
+ } else {
+
+ //set the container type
+ var aTypes=new Array(WYMeditor.P,WYMeditor.H1,WYMeditor.H2,WYMeditor.H3,WYMeditor.H4,WYMeditor.H5,
+ WYMeditor.H6,WYMeditor.PRE,WYMeditor.BLOCKQUOTE);
+ container = this.findUp(this.container(), aTypes);
+
+ if(container) {
+
+ var newNode = null;
+
+ //blockquotes must contain a block level element
+ if(sType.toLowerCase() == WYMeditor.BLOCKQUOTE) {
+
+ var blockquote = this.findUp(this.container(), WYMeditor.BLOCKQUOTE);
+
+ if(blockquote == null) {
+
+ newNode = this._doc.createElement(sType);
+ container.parentNode.insertBefore(newNode,container);
+ newNode.appendChild(container);
+ this.setFocusToNode(newNode.firstChild);
+
+ } else {
+
+ var nodes = blockquote.childNodes;
+ var lgt = nodes.length;
+ var firstNode = null;
+
+ if(lgt > 0) firstNode = nodes.item(0);
+ for(var x=0; x<lgt; x++) {
+ blockquote.parentNode.insertBefore(nodes.item(0),blockquote);
+ }
+ blockquote.parentNode.removeChild(blockquote);
+ if(firstNode) this.setFocusToNode(firstNode);
+ }
+ }
+
+ else this.switchTo(container,sType);
+
+ this.update();
+ }
+ }
+ }
+ else return(this.selected());
+};
+
+/* @name toggleClass
+ * @description Toggles class on selected element, or one of its parents
+ */
+WYMeditor.editor.prototype.toggleClass = function(sClass, jqexpr) {
+
+ var container = (this._selected_image
+ ? this._selected_image
+ : jQuery(this.selected()));
+ container = jQuery(container).parentsOrSelf(jqexpr);
+ jQuery(container).toggleClass(sClass);
+
+ if(!jQuery(container).attr(WYMeditor.CLASS)) jQuery(container).removeAttr(this._class);
+
+};
+
+/* @name findUp
+ * @description Returns the first parent or self container, based on its type
+ */
+WYMeditor.editor.prototype.findUp = function(node, filter) {
+
+ //filter is a string or an array of strings
+
+ if(node) {
+
+ var tagname = node.tagName.toLowerCase();
+
+ if(typeof(filter) == WYMeditor.STRING) {
+
+ while(tagname != filter && tagname != WYMeditor.BODY) {
+
+ node = node.parentNode;
+ tagname = node.tagName.toLowerCase();
+ }
+
+ } else {
+
+ var bFound = false;
+
+ while(!bFound && tagname != WYMeditor.BODY) {
+ for(var i = 0; i < filter.length; i++) {
+ if(tagname == filter[i]) {
+ bFound = true;
+ break;
+ }
+ }
+ if(!bFound) {
+ node = node.parentNode;
+ tagname = node.tagName.toLowerCase();
+ }
+ }
+ }
+
+ if(tagname != WYMeditor.BODY) return(node);
+ else return(null);
+
+ } else return(null);
+};
+
+/* @name switchTo
+ * @description Switch the node's type
+ */
+WYMeditor.editor.prototype.switchTo = function(node,sType) {
+
+ var newNode = this._doc.createElement(sType);
+ var html = jQuery(node).html();
+ node.parentNode.replaceChild(newNode,node);
+ jQuery(newNode).html(html);
+ this.setFocusToNode(newNode);
+};
+
+WYMeditor.editor.prototype.replaceStrings = function(sVal) {
+ //check if the language file has already been loaded
+ //if not, get it via a synchronous ajax call
+ if(!WYMeditor.STRINGS[this._options.lang]) {
+ try {
+ eval(jQuery.ajax({url:this._options.langPath
+ + this._options.lang + '.js', async:false}).responseText);
+ } catch(e) {
+ WYMeditor.console.error("WYMeditor: error while parsing language file.");
+ return sVal;
+ }
+ }
+
+ //replace all the strings in sVal and return it
+ for (var key in WYMeditor.STRINGS[this._options.lang]) {
+ sVal = WYMeditor.Helper.replaceAll(sVal, this._options.stringDelimiterLeft + key
+ + this._options.stringDelimiterRight,
+ WYMeditor.STRINGS[this._options.lang][key]);
+ };
+ return(sVal);
+};
+
+WYMeditor.editor.prototype.encloseString = function(sVal) {
+
+ return(this._options.stringDelimiterLeft
+ + sVal
+ + this._options.stringDelimiterRight);
+};
+
+/* @name status
+ * @description Prints a status message
+ */
+WYMeditor.editor.prototype.status = function(sMessage) {
+
+ //print status message
+ jQuery(this._box).find(this._options.statusSelector).html(sMessage);
+};
+
+/* @name update
+ * @description Updates the element and textarea values
+ */
+WYMeditor.editor.prototype.update = function() {
+
+ var html = this.xhtml();
+ jQuery(this._element).val(html);
+ jQuery(this._box).find(this._options.htmlValSelector).not('.hasfocus').val(html); //#147
+};
+
+/* @name dialog
+ * @description Opens a dialog box
+ */
+WYMeditor.editor.prototype.dialog = function( dialogType, dialogFeatures, bodyHtml ) {
+
+ var features = dialogFeatures || this._wym._options.dialogFeatures;
+ var wDialog = window.open('', 'dialog', features);
+
+ if(wDialog) {
+
+ var sBodyHtml = "";
+
+ switch( dialogType ) {
+
+ case(WYMeditor.DIALOG_LINK):
+ sBodyHtml = this._options.dialogLinkHtml;
+ break;
+ case(WYMeditor.DIALOG_IMAGE):
+ sBodyHtml = this._options.dialogImageHtml;
+ break;
+ case(WYMeditor.DIALOG_TABLE):
+ sBodyHtml = this._options.dialogTableHtml;
+ break;
+ case(WYMeditor.DIALOG_PASTE):
+ sBodyHtml = this._options.dialogPasteHtml;
+ break;
+ case(WYMeditor.PREVIEW):
+ sBodyHtml = this._options.dialogPreviewHtml;
+ break;
+
+ default:
+ sBodyHtml = bodyHtml;
+ }
+
+ var h = WYMeditor.Helper;
+
+ //construct the dialog
+ var dialogHtml = this._options.dialogHtml;
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.BASE_PATH, this._options.basePath);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIRECTION, this._options.direction);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.CSS_PATH, this._options.skinPath + WYMeditor.SKINS_DEFAULT_CSS);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.WYM_PATH, this._options.wymPath);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.JQUERY_PATH, this._options.jQueryPath);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIALOG_TITLE, this.encloseString( dialogType ));
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.DIALOG_BODY, sBodyHtml);
+ dialogHtml = h.replaceAll(dialogHtml, WYMeditor.INDEX, this._index);
+
+ dialogHtml = this.replaceStrings(dialogHtml);
+
+ var doc = wDialog.document;
+ doc.write(dialogHtml);
+ doc.close();
+ }
+};
+
+/* @name toggleHtml
+ * @description Shows/Hides the HTML
+ */
+WYMeditor.editor.prototype.toggleHtml = function() {
+ jQuery(this._box).find(this._options.htmlSelector).toggle();
+};
+
+WYMeditor.editor.prototype.uniqueStamp = function() {
+ var now = new Date();
+ return("wym-" + now.getTime());
+};
+
+WYMeditor.editor.prototype.paste = function(sData) {
+
+ var sTmp;
+ var container = this.selected();
+
+ //split the data, using double newlines as the separator
+ var aP = sData.split(this._newLine + this._newLine);
+ var rExp = new RegExp(this._newLine, "g");
+
+ //add a P for each item
+ if(container && container.tagName.toLowerCase() != WYMeditor.BODY) {
+ for(x = aP.length - 1; x >= 0; x--) {
+ sTmp = aP[x];
+ //simple newlines are replaced by a break
+ sTmp = sTmp.replace(rExp, "<br />");
+ jQuery(container).after("<p>" + sTmp + "</p>");
+ }
+ } else {
+ for(x = 0; x < aP.length; x++) {
+ sTmp = aP[x];
+ //simple newlines are replaced by a break
+ sTmp = sTmp.replace(rExp, "<br />");
+ jQuery(this._doc.body).append("<p>" + sTmp + "</p>");
+ }
+
+ }
+};
+
+WYMeditor.editor.prototype.insert = function(html) {
+ // Do we have a selection?
+ if (this._iframe.contentWindow.getSelection().focusNode != null) {
+ // Overwrite selection with provided html
+ this._exec( WYMeditor.INSERT_HTML, html);
+ } else {
+ // Fall back to the internal paste function if there's no selection
+ this.paste(html)
+ }
+};
+
+WYMeditor.editor.prototype.wrap = function(left, right) {
+ // Do we have a selection?
+ if (this._iframe.contentWindow.getSelection().focusNode != null) {
+ // Wrap selection with provided html
+ this._exec( WYMeditor.INSERT_HTML, left + this._iframe.contentWindow.getSelection().toString() + right);
+ }
+};
+
+WYMeditor.editor.prototype.unwrap = function() {
+ // Do we have a selection?
+ if (this._iframe.contentWindow.getSelection().focusNode != null) {
+ // Unwrap selection
+ this._exec( WYMeditor.INSERT_HTML, this._iframe.contentWindow.getSelection().toString() );
+ }
+};
+
+WYMeditor.editor.prototype.setFocusToNode = function(node, toStart) {
+ var range = this._doc.createRange(),
+ selection = this._iframe.contentWindow.getSelection();
+ toStart = toStart ? 0 : 1;
+
+ range.selectNodeContents(node);
+ selection.addRange(range);
+ selection.collapse(node, toStart);
+ this._iframe.contentWindow.focus();
+};
+
+WYMeditor.editor.prototype.addCssRules = function(doc, aCss) {
+ var styles = doc.styleSheets[0];
+ if(styles) {
+ for(var i = 0; i < aCss.length; i++) {
+ var oCss = aCss[i];
+ if(oCss.name && oCss.css) this.addCssRule(styles, oCss);
+ }
+ }
+};
+
+/********** CONFIGURATION **********/
+
+WYMeditor.editor.prototype.computeBasePath = function() {
+ return jQuery(jQuery.grep(jQuery('script'), function(s){
+ return (s.src && s.src.match(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/ ))
+ })).attr('src').replace(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/, '');
+};
+
+WYMeditor.editor.prototype.computeWymPath = function() {
+ return jQuery(jQuery.grep(jQuery('script'), function(s){
+ return (s.src && s.src.match(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/ ))
+ })).attr('src');
+};
+
+WYMeditor.editor.prototype.computeJqueryPath = function() {
+ return jQuery(jQuery.grep(jQuery('script'), function(s){
+ return (s.src && s.src.match(/jquery(-(.*)){0,1}(\.pack|\.min|\.packed)?\.js(\?.*)?$/ ))
+ })).attr('src');
+};
+
+WYMeditor.editor.prototype.computeCssPath = function() {
+ return jQuery(jQuery.grep(jQuery('link'), function(s){
+ return (s.href && s.href.match(/wymeditor\/skins\/(.*)screen\.css(\?.*)?$/ ))
+ })).attr('href');
+};
+
+WYMeditor.editor.prototype.configureEditorUsingRawCss = function() {
+
+ var CssParser = new WYMeditor.WymCssParser();
+ if(this._options.stylesheet){
+ CssParser.parse(jQuery.ajax({url: this._options.stylesheet,async:false}).responseText);
+ }else{
+ CssParser.parse(this._options.styles, false);
+ }
+
+ if(this._options.classesItems.length == 0) {
+ this._options.classesItems = CssParser.css_settings.classesItems;
+ }
+ if(this._options.editorStyles.length == 0) {
+ this._options.editorStyles = CssParser.css_settings.editorStyles;
+ }
+ if(this._options.dialogStyles.length == 0) {
+ this._options.dialogStyles = CssParser.css_settings.dialogStyles;
+ }
+};
+
+/********** EVENTS **********/
+
+WYMeditor.editor.prototype.listen = function() {
+ //don't use jQuery.find() on the iframe body
+ //because of MSIE + jQuery + expando issue (#JQ1143)
+ //jQuery(this._doc.body).find("*").bind("mouseup", this.mouseup);
+
+ jQuery(this._doc.body).bind("mousedown", this.mousedown);
+};
+
+WYMeditor.editor.prototype.mousedown = function(evt) {
+ var wym = WYMeditor.INSTANCES[this.ownerDocument.title];
+ wym._selected_image = (evt.target.tagName.toLowerCase() == WYMeditor.IMG) ? evt.target : null;
+};
+
+/********** SKINS **********/
+
+/*
+ * Function: WYMeditor.loadCss
+ * Loads a stylesheet in the document.
+ *
+ * Parameters:
+ * href - The CSS path.
+ */
+WYMeditor.loadCss = function(href) {
+
+ var link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.href = href;
+
+ var head = jQuery('head').get(0);
+ head.appendChild(link);
+};
+
+/*
+ * Function: WYMeditor.editor.loadSkin
+ * Loads the skin CSS and initialization script (if needed).
+ */
+WYMeditor.editor.prototype.loadSkin = function() {
+
+ //does the user want to automatically load the CSS (default: yes)?
+ //we also test if it hasn't been already loaded by another instance
+ //see below for a better (second) test
+ if(this._options.loadSkin && !WYMeditor.SKINS[this._options.skin]) {
+
+ //check if it hasn't been already loaded
+ //so we don't load it more than once
+ //(we check the existing <link> elements)
+
+ var found = false;
+ var rExp = new RegExp(this._options.skin
+ + '\/' + WYMeditor.SKINS_DEFAULT_CSS + '$');
+
+ jQuery('link').each( function() {
+ if(this.href.match(rExp)) found = true;
+ });
+
+ //load it, using the skin path
+ if(!found) WYMeditor.loadCss( this._options.skinPath
+ + WYMeditor.SKINS_DEFAULT_CSS );
+ }
+
+ //put the classname (ex. wym_skin_default) on wym_box
+ jQuery(this._box).addClass( "wym_skin_" + this._options.skin );
+
+ //does the user want to use some JS to initialize the skin (default: yes)?
+ //also check if it hasn't already been loaded by another instance
+ if(this._options.initSkin && !WYMeditor.SKINS[this._options.skin]) {
+
+ eval(jQuery.ajax({url:this._options.skinPath
+ + WYMeditor.SKINS_DEFAULT_JS, async:false}).responseText);
+ }
+
+ //init the skin, if needed
+ if(WYMeditor.SKINS[this._options.skin]
+ && WYMeditor.SKINS[this._options.skin].init)
+ WYMeditor.SKINS[this._options.skin].init(this);
+
+};
+
+
+/********** DIALOGS **********/
+
+WYMeditor.INIT_DIALOG = function(index) {
+
+ var wym = window.opener.WYMeditor.INSTANCES[index];
+ var doc = window.document;
+ var selected = wym.selected();
+ var dialogType = jQuery(wym._options.dialogTypeSelector).val();
+ var sStamp = wym.uniqueStamp();
+
+ switch(dialogType) {
+
+ case WYMeditor.DIALOG_LINK:
+ //ensure that we select the link to populate the fields
+ if(selected && selected.tagName && selected.tagName.toLowerCase != WYMeditor.A)
+ selected = jQuery(selected).parentsOrSelf(WYMeditor.A);
+
+ //fix MSIE selection if link image has been clicked
+ if(!selected && wym._selected_image)
+ selected = jQuery(wym._selected_image).parentsOrSelf(WYMeditor.A);
+ break;
+
+ }
+
+ //pre-init functions
+ if(jQuery.isFunction(wym._options.preInitDialog))
+ wym._options.preInitDialog(wym,window);
+
+ //add css rules from options
+ var styles = doc.styleSheets[0];
+ var aCss = eval(wym._options.dialogStyles);
+
+ wym.addCssRules(doc, aCss);
+
+ //auto populate fields if selected container (e.g. A)
+ if(selected) {
+ jQuery(wym._options.hrefSelector).val(jQuery(selected).attr(WYMeditor.HREF));
+ jQuery(wym._options.srcSelector).val(jQuery(selected).attr(WYMeditor.SRC));
+ jQuery(wym._options.titleSelector).val(jQuery(selected).attr(WYMeditor.TITLE));
+ jQuery(wym._options.altSelector).val(jQuery(selected).attr(WYMeditor.ALT));
+ }
+
+ //auto populate image fields if selected image
+ if(wym._selected_image) {
+ jQuery(wym._options.dialogImageSelector + " " + wym._options.srcSelector)
+ .val(jQuery(wym._selected_image).attr(WYMeditor.SRC));
+ jQuery(wym._options.dialogImageSelector + " " + wym._options.titleSelector)
+ .val(jQuery(wym._selected_image).attr(WYMeditor.TITLE));
+ jQuery(wym._options.dialogImageSelector + " " + wym._options.altSelector)
+ .val(jQuery(wym._selected_image).attr(WYMeditor.ALT));
+ }
+
+ jQuery(wym._options.dialogLinkSelector + " "
+ + wym._options.submitSelector).click(function() {
+
+ var sUrl = jQuery(wym._options.hrefSelector).val();
+ if(sUrl.length > 0) {
+ var link;
+
+ if (selected[0] && selected[0].tagName.toLowerCase() == WYMeditor.A) {
+ link = selected;
+ } else {
+ wym._exec(WYMeditor.CREATE_LINK, sStamp);
+ link = jQuery("a[href=" + sStamp + "]", wym._doc.body);
+ }
+
+ link.attr(WYMeditor.HREF, sUrl)
+ .attr(WYMeditor.TITLE, jQuery(wym._options.titleSelector).val());
+
+ }
+ window.close();
+ });
+
+ jQuery(wym._options.dialogImageSelector + " "
+ + wym._options.submitSelector).click(function() {
+
+ var sUrl = jQuery(wym._options.srcSelector).val();
+ if(sUrl.length > 0) {
+
+ wym._exec(WYMeditor.INSERT_IMAGE, sStamp);
+
+ jQuery("img[src$=" + sStamp + "]", wym._doc.body)
+ .attr(WYMeditor.SRC, sUrl)
+ .attr(WYMeditor.TITLE, jQuery(wym._options.titleSelector).val())
+ .attr(WYMeditor.ALT, jQuery(wym._options.altSelector).val());
+ }
+ window.close();
+ });
+
+ jQuery(wym._options.dialogTableSelector + " "
+ + wym._options.submitSelector).click(function() {
+
+ var iRows = jQuery(wym._options.rowsSelector).val();
+ var iCols = jQuery(wym._options.colsSelector).val();
+
+ if(iRows > 0 && iCols > 0) {
+
+ var table = wym._doc.createElement(WYMeditor.TABLE);
+ var newRow = null;
+ var newCol = null;
+
+ var sCaption = jQuery(wym._options.captionSelector).val();
+
+ //we create the caption
+ var newCaption = table.createCaption();
+ newCaption.innerHTML = sCaption;
+
+ //we create the rows and cells
+ for(x=0; x<iRows; x++) {
+ newRow = table.insertRow(x);
+ for(y=0; y<iCols; y++) {newRow.insertCell(y);}
+ }
+
+ //set the summary attr
+ jQuery(table).attr('summary',
+ jQuery(wym._options.summarySelector).val());
+
+ //append the table after the selected container
+ var node = jQuery(wym.findUp(wym.container(),
+ WYMeditor.MAIN_CONTAINERS)).get(0);
+ if(!node || !node.parentNode) jQuery(wym._doc.body).append(table);
+ else jQuery(node).after(table);
+ }
+ window.close();
+ });
+
+ jQuery(wym._options.dialogPasteSelector + " "
+ + wym._options.submitSelector).click(function() {
+
+ var sText = jQuery(wym._options.textSelector).val();
+ wym.paste(sText);
+ window.close();
+ });
+
+ jQuery(wym._options.dialogPreviewSelector + " "
+ + wym._options.previewSelector)
+ .html(wym.xhtml());
+
+ //cancel button
+ jQuery(wym._options.cancelSelector).mousedown(function() {
+ window.close();
+ });
+
+ //pre-init functions
+ if(jQuery.isFunction(wym._options.postInitDialog))
+ wym._options.postInitDialog(wym,window);
+
+};
+
+/********** XHTML LEXER/PARSER **********/
+
+/*
+* @name xml
+* @description Use these methods to generate XML and XHTML compliant tags and
+* escape tag attributes correctly
+* @author Bermi Ferrer - http://bermi.org
+* @author David Heinemeier Hansson http://loudthinking.com
+*/
+WYMeditor.XmlHelper = function()
+{
+ this._entitiesDiv = document.createElement('div');
+ return this;
+};
+
+
+/*
+* @name tag
+* @description
+* Returns an empty HTML tag of type *name* which by default is XHTML
+* compliant. Setting *open* to true will create an open tag compatible
+* with HTML 4.0 and below. Add HTML attributes by passing an attributes
+* array to *options*. For attributes with no value like (disabled and
+* readonly), give it a value of true in the *options* array.
+*
+* Examples:
+*
+* this.tag('br')
+* # => <br />
+* this.tag ('br', false, true)
+* # => <br>
+* this.tag ('input', jQuery({type:'text',disabled:true }) )
+* # => <input type="text" disabled="disabled" />
+*/
+WYMeditor.XmlHelper.prototype.tag = function(name, options, open)
+{
+ options = options || false;
+ open = open || false;
+ return '<'+name+(options ? this.tagOptions(options) : '')+(open ? '>' : ' />');
+};
+
+/*
+* @name contentTag
+* @description
+* Returns a XML block tag of type *name* surrounding the *content*. Add
+* XML attributes by passing an attributes array to *options*. For attributes
+* with no value like (disabled and readonly), give it a value of true in
+* the *options* array. You can use symbols or strings for the attribute names.
+*
+* this.contentTag ('p', 'Hello world!' )
+* # => <p>Hello world!</p>
+* this.contentTag('div', this.contentTag('p', "Hello world!"), jQuery({class : "strong"}))
+* # => <div class="strong"><p>Hello world!</p></div>
+* this.contentTag("select", options, jQuery({multiple : true}))
+* # => <select multiple="multiple">...options...</select>
+*/
+WYMeditor.XmlHelper.prototype.contentTag = function(name, content, options)
+{
+ options = options || false;
+ return '<'+name+(options ? this.tagOptions(options) : '')+'>'+content+'</'+name+'>';
+};
+
+/*
+* @name cdataSection
+* @description
+* Returns a CDATA section for the given +content+. CDATA sections
+* are used to escape blocks of text containing characters which would
+* otherwise be recognized as markup. CDATA sections begin with the string
+* <tt>&lt;![CDATA[</tt> and } with (and may not contain) the string
+* <tt>]]></tt>.
+*/
+WYMeditor.XmlHelper.prototype.cdataSection = function(content)
+{
+ return '<![CDATA['+content+']]>';
+};
+
+
+/*
+* @name escapeOnce
+* @description
+* Returns the escaped +xml+ without affecting existing escaped entities.
+*
+* this.escapeOnce( "1 > 2 &amp; 3")
+* # => "1 &gt; 2 &amp; 3"
+*/
+WYMeditor.XmlHelper.prototype.escapeOnce = function(xml)
+{
+ return this._fixDoubleEscape(this.escapeEntities(xml));
+};
+
+/*
+* @name _fixDoubleEscape
+* @description
+* Fix double-escaped entities, such as &amp;amp;, &amp;#123;, etc.
+*/
+WYMeditor.XmlHelper.prototype._fixDoubleEscape = function(escaped)
+{
+ return escaped.replace(/&amp;([a-z]+|(#\d+));/ig, "&$1;");
+};
+
+/*
+* @name tagOptions
+* @description
+* Takes an array like the one generated by Tag.parseAttributes
+* [["src", "http://www.editam.com/?a=b&c=d&amp;f=g"], ["title", "Editam, <Simplified> CMS"]]
+* or an object like {src:"http://www.editam.com/?a=b&c=d&amp;f=g", title:"Editam, <Simplified> CMS"}
+* and returns a string properly escaped like
+* ' src = "http://www.editam.com/?a=b&amp;c=d&amp;f=g" title = "Editam, &lt;Simplified&gt; CMS"'
+* which is valid for strict XHTML
+*/
+WYMeditor.XmlHelper.prototype.tagOptions = function(options)
+{
+ var xml = this;
+ xml._formated_options = '';
+
+ for (var key in options) {
+ var formated_options = '';
+ var value = options[key];
+ if(typeof value != 'function' && value.length > 0) {
+
+ if(parseInt(key) == key && typeof value == 'object'){
+ key = value.shift();
+ value = value.pop();
+ }
+ if(key != '' && value != ''){
+ xml._formated_options += ' '+key+'="'+xml.escapeOnce(value)+'"';
+ }
+ }
+ }
+ return xml._formated_options;
+};
+
+/*
+* @name escapeEntities
+* @description
+* Escapes XML/HTML entities <, >, & and ". If seccond parameter is set to false it
+* will not escape ". If set to true it will also escape '
+*/
+WYMeditor.XmlHelper.prototype.escapeEntities = function(string, escape_quotes)
+{
+ this._entitiesDiv.innerHTML = string;
+ this._entitiesDiv.textContent = string;
+ var result = this._entitiesDiv.innerHTML;
+ if(typeof escape_quotes == 'undefined'){
+ if(escape_quotes != false) result = result.replace('"', '&quot;');
+ if(escape_quotes == true) result = result.replace('"', '&#039;');
+ }
+ return result;
+};
+
+/*
+* Parses a string conatining tag attributes and values an returns an array formated like
+* [["src", "http://www.editam.com"], ["title", "Editam, Simplified CMS"]]
+*/
+WYMeditor.XmlHelper.prototype.parseAttributes = function(tag_attributes)
+{
+ // Use a compounded regex to match single quoted, double quoted and unquoted attribute pairs
+ var result = [];
+ var matches = tag_attributes.split(/((=\s*")(")("))|((=\s*\')(\')(\'))|((=\s*[^>\s]*))/g);
+ if(matches.toString() != tag_attributes){
+ for (var k in matches) {
+ var v = matches[k];
+ if(typeof v != 'function' && v.length != 0){
+ var re = new RegExp('(\\w+)\\s*'+v);
+ if(match = tag_attributes.match(re) ){
+ var value = v.replace(/^[\s=]+/, "");
+ var delimiter = value.charAt(0);
+ delimiter = delimiter == '"' ? '"' : (delimiter=="'"?"'":'');
+ if(delimiter != ''){
+ value = delimiter == '"' ? value.replace(/^"|"+$/g, '') : value.replace(/^'|'+$/g, '');
+ }
+ tag_attributes = tag_attributes.replace(match[0],'');
+ result.push([match[1] , value]);
+ }
+ }
+ }
+ }
+ return result;
+};
+
+/**
+* XhtmlValidator for validating tag attributes
+*
+* @author Bermi Ferrer - http://bermi.org
+*/
+WYMeditor.XhtmlValidator = {
+ "_attributes":
+ {
+ "core":
+ {
+ "except":[
+ "base",
+ "head",
+ "html",
+ "meta",
+ "param",
+ "script",
+ "style",
+ "title"
+ ],
+ "attributes":[
+ "class",
+ "id",
+ "style",
+ "title",
+ "accesskey",
+ "tabindex"
+ ]
+ },
+ "language":
+ {
+ "except":[
+ "base",
+ "br",
+ "hr",
+ "iframe",
+ "param",
+ "script"
+ ],
+ "attributes":
+ {
+ "dir":[
+ "ltr",
+ "rtl"
+ ],
+ "0":"lang",
+ "1":"xml:lang"
+ }
+ },
+ "keyboard":
+ {
+ "attributes":
+ {
+ "accesskey":/^(\w){1}$/,
+ "tabindex":/^(\d)+$/
+ }
+ }
+ },
+ "_events":
+ {
+ "window":
+ {
+ "only":[
+ "body"
+ ],
+ "attributes":[
+ "onload",
+ "onunload"
+ ]
+ },
+ "form":
+ {
+ "only":[
+ "form",
+ "input",
+ "textarea",
+ "select",
+ "a",
+ "label",
+ "button"
+ ],
+ "attributes":[
+ "onchange",
+ "onsubmit",
+ "onreset",
+ "onselect",
+ "onblur",
+ "onfocus"
+ ]
+ },
+ "keyboard":
+ {
+ "except":[
+ "base",
+ "bdo",
+ "br",
+ "frame",
+ "frameset",
+ "head",
+ "html",
+ "iframe",
+ "meta",
+ "param",
+ "script",
+ "style",
+ "title"
+ ],
+ "attributes":[
+ "onkeydown",
+ "onkeypress",
+ "onkeyup"
+ ]
+ },
+ "mouse":
+ {
+ "except":[
+ "base",
+ "bdo",
+ "br",
+ "head",
+ "html",
+ "meta",
+ "param",
+ "script",
+ "style",
+ "title"
+ ],
+ "attributes":[
+ "onclick",
+ "ondblclick",
+ "onmousedown",
+ "onmousemove",
+ "onmouseover",
+ "onmouseout",
+ "onmouseup"
+ ]
+ }
+ },
+ "_tags":
+ {
+ "a":
+ {
+ "attributes":
+ {
+ "0":"charset",
+ "1":"coords",
+ "2":"href",
+ "3":"hreflang",
+ "4":"name",
+ "rel":/^(alternate|designates|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark| |shortcut|icon)+$/,
+ "rev":/^(alternate|designates|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark| |shortcut|icon)+$/,
+ "shape":/^(rect|rectangle|circ|circle|poly|polygon)$/,
+ "5":"type"
+ }
+ },
+ "0":"abbr",
+ "1":"acronym",
+ "2":"address",
+ "area":
+ {
+ "attributes":
+ {
+ "0":"alt",
+ "1":"coords",
+ "2":"href",
+ "nohref":/^(true|false)$/,
+ "shape":/^(rect|rectangle|circ|circle|poly|polygon)$/
+ },
+ "required":[
+ "alt"
+ ]
+ },
+ "3":"b",
+ "base":
+ {
+ "attributes":[
+ "href"
+ ],
+ "required":[
+ "href"
+ ]
+ },
+ "bdo":
+ {
+ "attributes":
+ {
+ "dir":/^(ltr|rtl)$/
+ },
+ "required":[
+ "dir"
+ ]
+ },
+ "4":"big",
+ "blockquote":
+ {
+ "attributes":[
+ "cite"
+ ]
+ },
+ "5":"body",
+ "6":"br",
+ "button":
+ {
+ "attributes":
+ {
+ "disabled":/^(disabled)$/,
+ "type":/^(button|reset|submit)$/,
+ "0":"value"
+ },
+ "inside":"form"
+ },
+ "7":"caption",
+ "8":"cite",
+ "9":"code",
+ "col":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify)$/,
+ "0":"char",
+ "1":"charoff",
+ "span":/^(\d)+$/,
+ "valign":/^(top|middle|bottom|baseline)$/,
+ "2":"width"
+ },
+ "inside":"colgroup"
+ },
+ "colgroup":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify)$/,
+ "0":"char",
+ "1":"charoff",
+ "span":/^(\d)+$/,
+ "valign":/^(top|middle|bottom|baseline)$/,
+ "2":"width"
+ }
+ },
+ "10":"dd",
+ "del":
+ {
+ "attributes":
+ {
+ "0":"cite",
+ "datetime":/^([0-9]){8}/
+ }
+ },
+ "11":"div",
+ "12":"dfn",
+ "13":"dl",
+ "14":"dt",
+ "15":"em",
+ "fieldset":
+ {
+ "inside":"form"
+ },
+ "form":
+ {
+ "attributes":
+ {
+ "0":"action",
+ "1":"accept",
+ "2":"accept-charset",
+ "3":"enctype",
+ "method":/^(get|post)$/
+ },
+ "required":[
+ "action"
+ ]
+ },
+ "head":
+ {
+ "attributes":[
+ "profile"
+ ]
+ },
+ "16":"h1",
+ "17":"h2",
+ "18":"h3",
+ "19":"h4",
+ "20":"h5",
+ "21":"h6",
+ "22":"hr",
+ "html":
+ {
+ "attributes":[
+ "xmlns"
+ ]
+ },
+ "23":"i",
+ "img":
+ {
+ "attributes":[
+ "alt",
+ "src",
+ "height",
+ "ismap",
+ "longdesc",
+ "usemap",
+ "width"
+ ],
+ "required":[
+ "alt",
+ "src"
+ ]
+ },
+ "input":
+ {
+ "attributes":
+ {
+ "0":"accept",
+ "1":"alt",
+ "checked":/^(checked)$/,
+ "disabled":/^(disabled)$/,
+ "maxlength":/^(\d)+$/,
+ "2":"name",
+ "readonly":/^(readonly)$/,
+ "size":/^(\d)+$/,
+ "3":"src",
+ "type":/^(button|checkbox|file|hidden|image|password|radio|reset|submit|text)$/,
+ "4":"value"
+ },
+ "inside":"form"
+ },
+ "ins":
+ {
+ "attributes":
+ {
+ "0":"cite",
+ "datetime":/^([0-9]){8}/
+ }
+ },
+ "24":"kbd",
+ "label":
+ {
+ "attributes":[
+ "for"
+ ],
+ "inside":"form"
+ },
+ "25":"legend",
+ "26":"li",
+ "link":
+ {
+ "attributes":
+ {
+ "0":"charset",
+ "1":"href",
+ "2":"hreflang",
+ "media":/^(all|braille|print|projection|screen|speech|,|;| )+$/i,
+ //next comment line required by Opera!
+ /*"rel":/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i,*/
+ "rel":/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i,
+ "rev":/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i,
+ "3":"type"
+ },
+ "inside":"head"
+ },
+ "map":
+ {
+ "attributes":[
+ "id",
+ "name"
+ ],
+ "required":[
+ "id"
+ ]
+ },
+ "meta":
+ {
+ "attributes":
+ {
+ "0":"content",
+ "http-equiv":/^(content\-type|expires|refresh|set\-cookie)$/i,
+ "1":"name",
+ "2":"scheme"
+ },
+ "required":[
+ "content"
+ ]
+ },
+ "27":"noscript",
+ "object":
+ {
+ "attributes":[
+ "archive",
+ "classid",
+ "codebase",
+ "codetype",
+ "data",
+ "declare",
+ "height",
+ "name",
+ "standby",
+ "type",
+ "usemap",
+ "width"
+ ]
+ },
+ "28":"ol",
+ "optgroup":
+ {
+ "attributes":
+ {
+ "0":"label",
+ "disabled": /^(disabled)$/
+ },
+ "required":[
+ "label"
+ ]
+ },
+ "option":
+ {
+ "attributes":
+ {
+ "0":"label",
+ "disabled":/^(disabled)$/,
+ "selected":/^(selected)$/,
+ "1":"value"
+ },
+ "inside":"select"
+ },
+ "29":"p",
+ "param":
+ {
+ "attributes":
+ {
+ "0":"type",
+ "valuetype":/^(data|ref|object)$/,
+ "1":"valuetype",
+ "2":"value"
+ },
+ "required":[
+ "name"
+ ]
+ },
+ "30":"pre",
+ "q":
+ {
+ "attributes":[
+ "cite"
+ ]
+ },
+ "31":"samp",
+ "script":
+ {
+ "attributes":
+ {
+ "type":/^(text\/ecmascript|text\/javascript|text\/jscript|text\/vbscript|text\/vbs|text\/xml)$/,
+ "0":"charset",
+ "defer":/^(defer)$/,
+ "1":"src"
+ },
+ "required":[
+ "type"
+ ]
+ },
+ "select":
+ {
+ "attributes":
+ {
+ "disabled":/^(disabled)$/,
+ "multiple":/^(multiple)$/,
+ "0":"name",
+ "1":"size"
+ },
+ "inside":"form"
+ },
+ "32":"small",
+ "33":"span",
+ "34":"strong",
+ "style":
+ {
+ "attributes":
+ {
+ "0":"type",
+ "media":/^(screen|tty|tv|projection|handheld|print|braille|aural|all)$/
+ },
+ "required":[
+ "type"
+ ]
+ },
+ "35":"sub",
+ "36":"sup",
+ "table":
+ {
+ "attributes":
+ {
+ "0":"border",
+ "1":"cellpadding",
+ "2":"cellspacing",
+ "frame":/^(void|above|below|hsides|lhs|rhs|vsides|box|border)$/,
+ "rules":/^(none|groups|rows|cols|all)$/,
+ "3":"summary",
+ "4":"width"
+ }
+ },
+ "tbody":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify)$/,
+ "0":"char",
+ "1":"charoff",
+ "valign":/^(top|middle|bottom|baseline)$/
+ }
+ },
+ "td":
+ {
+ "attributes":
+ {
+ "0":"abbr",
+ "align":/^(left|right|center|justify|char)$/,
+ "1":"axis",
+ "2":"char",
+ "3":"charoff",
+ "colspan":/^(\d)+$/,
+ "4":"headers",
+ "rowspan":/^(\d)+$/,
+ "scope":/^(col|colgroup|row|rowgroup)$/,
+ "valign":/^(top|middle|bottom|baseline)$/
+ }
+ },
+ "textarea":
+ {
+ "attributes":[
+ "cols",
+ "rows",
+ "disabled",
+ "name",
+ "readonly"
+ ],
+ "required":[
+ "cols",
+ "rows"
+ ],
+ "inside":"form"
+ },
+ "tfoot":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify)$/,
+ "0":"char",
+ "1":"charoff",
+ "valign":/^(top|middle|bottom)$/,
+ "2":"baseline"
+ }
+ },
+ "th":
+ {
+ "attributes":
+ {
+ "0":"abbr",
+ "align":/^(left|right|center|justify|char)$/,
+ "1":"axis",
+ "2":"char",
+ "3":"charoff",
+ "colspan":/^(\d)+$/,
+ "4":"headers",
+ "rowspan":/^(\d)+$/,
+ "scope":/^(col|colgroup|row|rowgroup)$/,
+ "valign":/^(top|middle|bottom|baseline)$/
+ }
+ },
+ "thead":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify)$/,
+ "0":"char",
+ "1":"charoff",
+ "valign":/^(top|middle|bottom|baseline)$/
+ }
+ },
+ "37":"title",
+ "tr":
+ {
+ "attributes":
+ {
+ "align":/^(right|left|center|justify|char)$/,
+ "0":"char",
+ "1":"charoff",
+ "valign":/^(top|middle|bottom|baseline)$/
+ }
+ },
+ "38":"tt",
+ "39":"ul",
+ "40":"var"
+ },
+
+ // Temporary skiped attributes
+ skiped_attributes : [],
+ skiped_attribute_values : [],
+
+ getValidTagAttributes: function(tag, attributes)
+ {
+ var valid_attributes = {};
+ var possible_attributes = this.getPossibleTagAttributes(tag);
+ for(var attribute in attributes) {
+ var value = attributes[attribute];
+ var h = WYMeditor.Helper;
+ if(!h.contains(this.skiped_attributes, attribute) && !h.contains(this.skiped_attribute_values, value)){
+ if (typeof value != 'function' && h.contains(possible_attributes, attribute)) {
+ if (this.doesAttributeNeedsValidation(tag, attribute)) {
+ if(this.validateAttribute(tag, attribute, value)){
+ valid_attributes[attribute] = value;
+ }
+ }else{
+ valid_attributes[attribute] = value;
+ }
+ }
+ }
+ }
+ return valid_attributes;
+ },
+ getUniqueAttributesAndEventsForTag : function(tag)
+ {
+ var result = [];
+
+ if (this._tags[tag] && this._tags[tag]['attributes']) {
+ for (k in this._tags[tag]['attributes']) {
+ result.push(parseInt(k) == k ? this._tags[tag]['attributes'][k] : k);
+ }
+ }
+ return result;
+ },
+ getDefaultAttributesAndEventsForTags : function()
+ {
+ var result = [];
+ for (var key in this._events){
+ result.push(this._events[key]);
+ }
+ for (var key in this._attributes){
+ result.push(this._attributes[key]);
+ }
+ return result;
+ },
+ isValidTag : function(tag)
+ {
+ if(this._tags[tag]){
+ return true;
+ }
+ for(var key in this._tags){
+ if(this._tags[key] == tag){
+ return true;
+ }
+ }
+ return false;
+ },
+ getDefaultAttributesAndEventsForTag : function(tag)
+ {
+ var default_attributes = [];
+ if (this.isValidTag(tag)) {
+ var default_attributes_and_events = this.getDefaultAttributesAndEventsForTags();
+
+ for(var key in default_attributes_and_events) {
+ var defaults = default_attributes_and_events[key];
+ if(typeof defaults == 'object'){
+ var h = WYMeditor.Helper;
+ if ((defaults['except'] && h.contains(defaults['except'], tag)) || (defaults['only'] && !h.contains(defaults['only'], tag))) {
+ continue;
+ }
+
+ var tag_defaults = defaults['attributes'] ? defaults['attributes'] : defaults['events'];
+ for(var k in tag_defaults) {
+ default_attributes.push(typeof tag_defaults[k] != 'string' ? k : tag_defaults[k]);
+ }
+ }
+ }
+ }
+ return default_attributes;
+ },
+ doesAttributeNeedsValidation: function(tag, attribute)
+ {
+ return this._tags[tag] && ((this._tags[tag]['attributes'] && this._tags[tag]['attributes'][attribute]) || (this._tags[tag]['required'] &&
+ WYMeditor.Helper.contains(this._tags[tag]['required'], attribute)));
+ },
+ validateAttribute : function(tag, attribute, value)
+ {
+ if ( this._tags[tag] &&
+ (this._tags[tag]['attributes'] && this._tags[tag]['attributes'][attribute] && value.length > 0 && !value.match(this._tags[tag]['attributes'][attribute])) || // invalid format
+ (this._tags[tag] && this._tags[tag]['required'] && WYMeditor.Helper.contains(this._tags[tag]['required'], attribute) && value.length == 0) // required attribute
+ ) {
+ return false;
+ }
+ return typeof this._tags[tag] != 'undefined';
+ },
+ getPossibleTagAttributes : function(tag)
+ {
+ if (!this._possible_tag_attributes) {
+ this._possible_tag_attributes = {};
+ }
+ if (!this._possible_tag_attributes[tag]) {
+ this._possible_tag_attributes[tag] = this.getUniqueAttributesAndEventsForTag(tag).concat(this.getDefaultAttributesAndEventsForTag(tag));
+ }
+ return this._possible_tag_attributes[tag];
+ }
+};
+
+
+/**
+* Compounded regular expression. Any of
+* the contained patterns could match and
+* when one does, it's label is returned.
+*
+* Constructor. Starts with no patterns.
+* @param boolean case True for case sensitive, false
+* for insensitive.
+* @access public
+* @author Marcus Baker (http://lastcraft.com)
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.ParallelRegex = function(case_sensitive)
+{
+ this._case = case_sensitive;
+ this._patterns = [];
+ this._labels = [];
+ this._regex = null;
+ return this;
+};
+
+
+/**
+* Adds a pattern with an optional label.
+* @param string pattern Perl style regex, but ( and )
+* lose the usual meaning.
+* @param string label Label of regex to be returned
+* on a match.
+* @access public
+*/
+WYMeditor.ParallelRegex.prototype.addPattern = function(pattern, label)
+{
+ label = label || true;
+ var count = this._patterns.length;
+ this._patterns[count] = pattern;
+ this._labels[count] = label;
+ this._regex = null;
+};
+
+/**
+* Attempts to match all patterns at once against
+* a string.
+* @param string subject String to match against.
+*
+* @return boolean True on success.
+* @return string match First matched portion of
+* subject.
+* @access public
+*/
+WYMeditor.ParallelRegex.prototype.match = function(subject)
+{
+ if (this._patterns.length == 0) {
+ return [false, ''];
+ }
+ var matches = subject.match(this._getCompoundedRegex());
+
+ if(!matches){
+ return [false, ''];
+ }
+ var match = matches[0];
+ for (var i = 1; i < matches.length; i++) {
+ if (matches[i]) {
+ return [this._labels[i-1], match];
+ }
+ }
+ return [true, matches[0]];
+};
+
+/**
+* Compounds the patterns into a single
+* regular expression separated with the
+* "or" operator. Caches the regex.
+* Will automatically escape (, ) and / tokens.
+* @param array patterns List of patterns in order.
+* @access private
+*/
+WYMeditor.ParallelRegex.prototype._getCompoundedRegex = function()
+{
+ if (this._regex == null) {
+ for (var i = 0, count = this._patterns.length; i < count; i++) {
+ this._patterns[i] = '(' + this._untokenizeRegex(this._tokenizeRegex(this._patterns[i]).replace(/([\/\(\)])/g,'\\$1')) + ')';
+ }
+ this._regex = new RegExp(this._patterns.join("|") ,this._getPerlMatchingFlags());
+ }
+ return this._regex;
+};
+
+/**
+* Escape lookahead/lookbehind blocks
+*/
+WYMeditor.ParallelRegex.prototype._tokenizeRegex = function(regex)
+{
+ return regex.
+ replace(/\(\?(i|m|s|x|U)\)/, '~~~~~~Tk1\$1~~~~~~').
+ replace(/\(\?(\-[i|m|s|x|U])\)/, '~~~~~~Tk2\$1~~~~~~').
+ replace(/\(\?\=(.*)\)/, '~~~~~~Tk3\$1~~~~~~').
+ replace(/\(\?\!(.*)\)/, '~~~~~~Tk4\$1~~~~~~').
+ replace(/\(\?\<\=(.*)\)/, '~~~~~~Tk5\$1~~~~~~').
+ replace(/\(\?\<\!(.*)\)/, '~~~~~~Tk6\$1~~~~~~').
+ replace(/\(\?\:(.*)\)/, '~~~~~~Tk7\$1~~~~~~');
+};
+
+/**
+* Unscape lookahead/lookbehind blocks
+*/
+WYMeditor.ParallelRegex.prototype._untokenizeRegex = function(regex)
+{
+ return regex.
+ replace(/~~~~~~Tk1(.{1})~~~~~~/, "(?\$1)").
+ replace(/~~~~~~Tk2(.{2})~~~~~~/, "(?\$1)").
+ replace(/~~~~~~Tk3(.*)~~~~~~/, "(?=\$1)").
+ replace(/~~~~~~Tk4(.*)~~~~~~/, "(?!\$1)").
+ replace(/~~~~~~Tk5(.*)~~~~~~/, "(?<=\$1)").
+ replace(/~~~~~~Tk6(.*)~~~~~~/, "(?<!\$1)").
+ replace(/~~~~~~Tk7(.*)~~~~~~/, "(?:\$1)");
+};
+
+
+/**
+* Accessor for perl regex mode flags to use.
+* @return string Perl regex flags.
+* @access private
+*/
+WYMeditor.ParallelRegex.prototype._getPerlMatchingFlags = function()
+{
+ return (this._case ? "m" : "mi");
+};
+
+
+
+/**
+* States for a stack machine.
+*
+* Constructor. Starts in named state.
+* @param string start Starting state name.
+* @access public
+* @author Marcus Baker (http://lastcraft.com)
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.StateStack = function(start)
+{
+ this._stack = [start];
+ return this;
+};
+
+/**
+* Accessor for current state.
+* @return string State.
+* @access public
+*/
+WYMeditor.StateStack.prototype.getCurrent = function()
+{
+ return this._stack[this._stack.length - 1];
+};
+
+/**
+* Adds a state to the stack and sets it
+* to be the current state.
+* @param string state New state.
+* @access public
+*/
+WYMeditor.StateStack.prototype.enter = function(state)
+{
+ this._stack.push(state);
+};
+
+/**
+* Leaves the current state and reverts
+* to the previous one.
+* @return boolean False if we drop off
+* the bottom of the list.
+* @access public
+*/
+WYMeditor.StateStack.prototype.leave = function()
+{
+ if (this._stack.length == 1) {
+ return false;
+ }
+ this._stack.pop();
+ return true;
+};
+
+
+// GLOBALS
+WYMeditor.LEXER_ENTER = 1;
+WYMeditor.LEXER_MATCHED = 2;
+WYMeditor.LEXER_UNMATCHED = 3;
+WYMeditor.LEXER_EXIT = 4;
+WYMeditor.LEXER_SPECIAL = 5;
+
+
+/**
+* Accepts text and breaks it into tokens.
+* Some optimisation to make the sure the
+* content is only scanned by the PHP regex
+* parser once. Lexer modes must not start
+* with leading underscores.
+*
+* Sets up the lexer in case insensitive matching
+* by default.
+* @param Parser parser Handling strategy by reference.
+* @param string start Starting handler.
+* @param boolean case True for case sensitive.
+* @access public
+* @author Marcus Baker (http://lastcraft.com)
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.Lexer = function(parser, start, case_sensitive)
+{
+ start = start || 'accept';
+ this._case = case_sensitive || false;
+ this._regexes = {};
+ this._parser = parser;
+ this._mode = new WYMeditor.StateStack(start);
+ this._mode_handlers = {};
+ this._mode_handlers[start] = start;
+ return this;
+};
+
+/**
+* Adds a token search pattern for a particular
+* parsing mode. The pattern does not change the
+* current mode.
+* @param string pattern Perl style regex, but ( and )
+* lose the usual meaning.
+* @param string mode Should only apply this
+* pattern when dealing with
+* this type of input.
+* @access public
+*/
+WYMeditor.Lexer.prototype.addPattern = function(pattern, mode)
+{
+ var mode = mode || "accept";
+ if (typeof this._regexes[mode] == 'undefined') {
+ this._regexes[mode] = new WYMeditor.ParallelRegex(this._case);
+ }
+ this._regexes[mode].addPattern(pattern);
+ if (typeof this._mode_handlers[mode] == 'undefined') {
+ this._mode_handlers[mode] = mode;
+ }
+};
+
+/**
+* Adds a pattern that will enter a new parsing
+* mode. Useful for entering parenthesis, strings,
+* tags, etc.
+* @param string pattern Perl style regex, but ( and )
+* lose the usual meaning.
+* @param string mode Should only apply this
+* pattern when dealing with
+* this type of input.
+* @param string new_mode Change parsing to this new
+* nested mode.
+* @access public
+*/
+WYMeditor.Lexer.prototype.addEntryPattern = function(pattern, mode, new_mode)
+{
+ if (typeof this._regexes[mode] == 'undefined') {
+ this._regexes[mode] = new WYMeditor.ParallelRegex(this._case);
+ }
+ this._regexes[mode].addPattern(pattern, new_mode);
+ if (typeof this._mode_handlers[new_mode] == 'undefined') {
+ this._mode_handlers[new_mode] = new_mode;
+ }
+};
+
+/**
+* Adds a pattern that will exit the current mode
+* and re-enter the previous one.
+* @param string pattern Perl style regex, but ( and )
+* lose the usual meaning.
+* @param string mode Mode to leave.
+* @access public
+*/
+WYMeditor.Lexer.prototype.addExitPattern = function(pattern, mode)
+{
+ if (typeof this._regexes[mode] == 'undefined') {
+ this._regexes[mode] = new WYMeditor.ParallelRegex(this._case);
+ }
+ this._regexes[mode].addPattern(pattern, "__exit");
+ if (typeof this._mode_handlers[mode] == 'undefined') {
+ this._mode_handlers[mode] = mode;
+ }
+};
+
+/**
+* Adds a pattern that has a special mode. Acts as an entry
+* and exit pattern in one go, effectively calling a special
+* parser handler for this token only.
+* @param string pattern Perl style regex, but ( and )
+* lose the usual meaning.
+* @param string mode Should only apply this
+* pattern when dealing with
+* this type of input.
+* @param string special Use this mode for this one token.
+* @access public
+*/
+WYMeditor.Lexer.prototype.addSpecialPattern = function(pattern, mode, special)
+{
+ if (typeof this._regexes[mode] == 'undefined') {
+ this._regexes[mode] = new WYMeditor.ParallelRegex(this._case);
+ }
+ this._regexes[mode].addPattern(pattern, '_'+special);
+ if (typeof this._mode_handlers[special] == 'undefined') {
+ this._mode_handlers[special] = special;
+ }
+};
+
+/**
+* Adds a mapping from a mode to another handler.
+* @param string mode Mode to be remapped.
+* @param string handler New target handler.
+* @access public
+*/
+WYMeditor.Lexer.prototype.mapHandler = function(mode, handler)
+{
+ this._mode_handlers[mode] = handler;
+};
+
+/**
+* Splits the page text into tokens. Will fail
+* if the handlers report an error or if no
+* content is consumed. If successful then each
+* unparsed and parsed token invokes a call to the
+* held listener.
+* @param string raw Raw HTML text.
+* @return boolean True on success, else false.
+* @access public
+*/
+WYMeditor.Lexer.prototype.parse = function(raw)
+{
+ if (typeof this._parser == 'undefined') {
+ return false;
+ }
+
+ var length = raw.length;
+ var parsed;
+ while (typeof (parsed = this._reduce(raw)) == 'object') {
+ var raw = parsed[0];
+ var unmatched = parsed[1];
+ var matched = parsed[2];
+ var mode = parsed[3];
+
+ if (! this._dispatchTokens(unmatched, matched, mode)) {
+ return false;
+ }
+
+ if (raw == '') {
+ return true;
+ }
+ if (raw.length == length) {
+ return false;
+ }
+ length = raw.length;
+ }
+ if (! parsed ) {
+ return false;
+ }
+
+ return this._invokeParser(raw, WYMeditor.LEXER_UNMATCHED);
+};
+
+/**
+* Sends the matched token and any leading unmatched
+* text to the parser changing the lexer to a new
+* mode if one is listed.
+* @param string unmatched Unmatched leading portion.
+* @param string matched Actual token match.
+* @param string mode Mode after match. A boolean
+* false mode causes no change.
+* @return boolean False if there was any error
+* from the parser.
+* @access private
+*/
+WYMeditor.Lexer.prototype._dispatchTokens = function(unmatched, matched, mode)
+{
+ mode = mode || false;
+
+ if (! this._invokeParser(unmatched, WYMeditor.LEXER_UNMATCHED)) {
+ return false;
+ }
+
+ if (typeof mode == 'boolean') {
+ return this._invokeParser(matched, WYMeditor.LEXER_MATCHED);
+ }
+ if (this._isModeEnd(mode)) {
+ if (! this._invokeParser(matched, WYMeditor.LEXER_EXIT)) {
+ return false;
+ }
+ return this._mode.leave();
+ }
+ if (this._isSpecialMode(mode)) {
+ this._mode.enter(this._decodeSpecial(mode));
+ if (! this._invokeParser(matched, WYMeditor.LEXER_SPECIAL)) {
+ return false;
+ }
+ return this._mode.leave();
+ }
+ this._mode.enter(mode);
+
+ return this._invokeParser(matched, WYMeditor.LEXER_ENTER);
+};
+
+/**
+* Tests to see if the new mode is actually to leave
+* the current mode and pop an item from the matching
+* mode stack.
+* @param string mode Mode to test.
+* @return boolean True if this is the exit mode.
+* @access private
+*/
+WYMeditor.Lexer.prototype._isModeEnd = function(mode)
+{
+ return (mode === "__exit");
+};
+
+/**
+* Test to see if the mode is one where this mode
+* is entered for this token only and automatically
+* leaves immediately afterwoods.
+* @param string mode Mode to test.
+* @return boolean True if this is the exit mode.
+* @access private
+*/
+WYMeditor.Lexer.prototype._isSpecialMode = function(mode)
+{
+ return (mode.substring(0,1) == "_");
+};
+
+/**
+* Strips the magic underscore marking single token
+* modes.
+* @param string mode Mode to decode.
+* @return string Underlying mode name.
+* @access private
+*/
+WYMeditor.Lexer.prototype._decodeSpecial = function(mode)
+{
+ return mode.substring(1);
+};
+
+/**
+* Calls the parser method named after the current
+* mode. Empty content will be ignored. The lexer
+* has a parser handler for each mode in the lexer.
+* @param string content Text parsed.
+* @param boolean is_match Token is recognised rather
+* than unparsed data.
+* @access private
+*/
+WYMeditor.Lexer.prototype._invokeParser = function(content, is_match)
+{
+
+ if (content === '') {
+ return true;
+ }
+ var current = this._mode.getCurrent();
+ var handler = this._mode_handlers[current];
+ var result;
+ eval('result = this._parser.' + handler + '(content, is_match);');
+ return result;
+};
+
+/**
+* Tries to match a chunk of text and if successful
+* removes the recognised chunk and any leading
+* unparsed data. Empty strings will not be matched.
+* @param string raw The subject to parse. This is the
+* content that will be eaten.
+* @return array/boolean Three item list of unparsed
+* content followed by the
+* recognised token and finally the
+* action the parser is to take.
+* True if no match, false if there
+* is a parsing error.
+* @access private
+*/
+WYMeditor.Lexer.prototype._reduce = function(raw)
+{
+ var matched = this._regexes[this._mode.getCurrent()].match(raw);
+ var match = matched[1];
+ var action = matched[0];
+ if (action) {
+ var unparsed_character_count = raw.indexOf(match);
+ var unparsed = raw.substr(0, unparsed_character_count);
+ raw = raw.substring(unparsed_character_count + match.length);
+ return [raw, unparsed, match, action];
+ }
+ return true;
+};
+
+
+
+/**
+* This are the rules for breaking the XHTML code into events
+* handled by the provided parser.
+*
+* @author Marcus Baker (http://lastcraft.com)
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.XhtmlLexer = function(parser)
+{
+ jQuery.extend(this, new WYMeditor.Lexer(parser, 'Text'));
+
+ this.mapHandler('Text', 'Text');
+
+ this.addTokens();
+
+ this.init();
+
+ return this;
+};
+
+
+WYMeditor.XhtmlLexer.prototype.init = function()
+{
+};
+
+WYMeditor.XhtmlLexer.prototype.addTokens = function()
+{
+ this.addCommentTokens('Text');
+ this.addScriptTokens('Text');
+ this.addCssTokens('Text');
+ this.addTagTokens('Text');
+};
+
+WYMeditor.XhtmlLexer.prototype.addCommentTokens = function(scope)
+{
+ this.addEntryPattern("<!--", scope, 'Comment');
+ this.addExitPattern("-->", 'Comment');
+};
+
+WYMeditor.XhtmlLexer.prototype.addScriptTokens = function(scope)
+{
+ this.addEntryPattern("<script", scope, 'Script');
+ this.addExitPattern("</script>", 'Script');
+};
+
+WYMeditor.XhtmlLexer.prototype.addCssTokens = function(scope)
+{
+ this.addEntryPattern("<style", scope, 'Css');
+ this.addExitPattern("</style>", 'Css');
+};
+
+WYMeditor.XhtmlLexer.prototype.addTagTokens = function(scope)
+{
+ this.addSpecialPattern("<\\s*[a-z0-9:\-]+\\s*>", scope, 'OpeningTag');
+ this.addEntryPattern("<[a-z0-9:\-]+"+'[\\\/ \\\>]+', scope, 'OpeningTag');
+ this.addInTagDeclarationTokens('OpeningTag');
+
+ this.addSpecialPattern("</\\s*[a-z0-9:\-]+\\s*>", scope, 'ClosingTag');
+
+};
+
+WYMeditor.XhtmlLexer.prototype.addInTagDeclarationTokens = function(scope)
+{
+ this.addSpecialPattern('\\s+', scope, 'Ignore');
+
+ this.addAttributeTokens(scope);
+
+ this.addExitPattern('/>', scope);
+ this.addExitPattern('>', scope);
+
+};
+
+WYMeditor.XhtmlLexer.prototype.addAttributeTokens = function(scope)
+{
+ this.addSpecialPattern("\\s*[a-z-_0-9]*:?[a-z-_0-9]+\\s*(?=\=)\\s*", scope, 'TagAttributes');
+
+ this.addEntryPattern('=\\s*"', scope, 'DoubleQuotedAttribute');
+ this.addPattern("\\\\\"", 'DoubleQuotedAttribute');
+ this.addExitPattern('"', 'DoubleQuotedAttribute');
+
+ this.addEntryPattern("=\\s*'", scope, 'SingleQuotedAttribute');
+ this.addPattern("\\\\'", 'SingleQuotedAttribute');
+ this.addExitPattern("'", 'SingleQuotedAttribute');
+
+ this.addSpecialPattern('=\\s*[^>\\s]*', scope, 'UnquotedAttribute');
+};
+
+
+
+/**
+* XHTML Parser.
+*
+* This XHTML parser will trigger the events available on on
+* current SaxListener
+*
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.XhtmlParser = function(Listener, mode)
+{
+ var mode = mode || 'Text';
+ this._Lexer = new WYMeditor.XhtmlLexer(this);
+ this._Listener = Listener;
+ this._mode = mode;
+ this._matches = [];
+ this._last_match = '';
+ this._current_match = '';
+
+ return this;
+};
+
+WYMeditor.XhtmlParser.prototype.parse = function(raw)
+{
+ this._Lexer.parse(this.beforeParsing(raw));
+ return this.afterParsing(this._Listener.getResult());
+};
+
+WYMeditor.XhtmlParser.prototype.beforeParsing = function(raw)
+{
+ if(raw.match(/class="MsoNormal"/) || raw.match(/ns = "urn:schemas-microsoft-com/)){
+ // Usefull for cleaning up content pasted from other sources (MSWord)
+ this._Listener.avoidStylingTagsAndAttributes();
+ }
+ return this._Listener.beforeParsing(raw);
+};
+
+WYMeditor.XhtmlParser.prototype.afterParsing = function(parsed)
+{
+ if(this._Listener._avoiding_tags_implicitly){
+ this._Listener.allowStylingTagsAndAttributes();
+ }
+ return this._Listener.afterParsing(parsed);
+};
+
+
+WYMeditor.XhtmlParser.prototype.Ignore = function(match, state)
+{
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.Text = function(text)
+{
+ this._Listener.addContent(text);
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.Comment = function(match, status)
+{
+ return this._addNonTagBlock(match, status, 'addComment');
+};
+
+WYMeditor.XhtmlParser.prototype.Script = function(match, status)
+{
+ return this._addNonTagBlock(match, status, 'addScript');
+};
+
+WYMeditor.XhtmlParser.prototype.Css = function(match, status)
+{
+ return this._addNonTagBlock(match, status, 'addCss');
+};
+
+WYMeditor.XhtmlParser.prototype._addNonTagBlock = function(match, state, type)
+{
+ switch (state){
+ case WYMeditor.LEXER_ENTER:
+ this._non_tag = match;
+ break;
+ case WYMeditor.LEXER_UNMATCHED:
+ this._non_tag += match;
+ break;
+ case WYMeditor.LEXER_EXIT:
+ switch(type) {
+ case 'addComment':
+ this._Listener.addComment(this._non_tag+match);
+ break;
+ case 'addScript':
+ this._Listener.addScript(this._non_tag+match);
+ break;
+ case 'addCss':
+ this._Listener.addCss(this._non_tag+match);
+ break;
+ }
+ }
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.OpeningTag = function(match, state)
+{
+ switch (state){
+ case WYMeditor.LEXER_ENTER:
+ this._tag = this.normalizeTag(match);
+ this._tag_attributes = {};
+ break;
+ case WYMeditor.LEXER_SPECIAL:
+ this._callOpenTagListener(this.normalizeTag(match));
+ break;
+ case WYMeditor.LEXER_EXIT:
+ this._callOpenTagListener(this._tag, this._tag_attributes);
+ }
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.ClosingTag = function(match, state)
+{
+ this._callCloseTagListener(this.normalizeTag(match));
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype._callOpenTagListener = function(tag, attributes)
+{
+ var attributes = attributes || {};
+ this.autoCloseUnclosedBeforeNewOpening(tag);
+
+ if(this._Listener.isBlockTag(tag)){
+ this._Listener._tag_stack.push(tag);
+ this._Listener.fixNestingBeforeOpeningBlockTag(tag, attributes);
+ this._Listener.openBlockTag(tag, attributes);
+ this._increaseOpenTagCounter(tag);
+ }else if(this._Listener.isInlineTag(tag)){
+ this._Listener.inlineTag(tag, attributes);
+ }else{
+ this._Listener.openUnknownTag(tag, attributes);
+ this._increaseOpenTagCounter(tag);
+ }
+ this._Listener.last_tag = tag;
+ this._Listener.last_tag_opened = true;
+ this._Listener.last_tag_attributes = attributes;
+};
+
+WYMeditor.XhtmlParser.prototype._callCloseTagListener = function(tag)
+{
+ if(this._decreaseOpenTagCounter(tag)){
+ this.autoCloseUnclosedBeforeTagClosing(tag);
+
+ if(this._Listener.isBlockTag(tag)){
+ var expected_tag = this._Listener._tag_stack.pop();
+ if(expected_tag == false){
+ return;
+ }else if(expected_tag != tag){
+ tag = expected_tag;
+ }
+ this._Listener.closeBlockTag(tag);
+ }else{
+ this._Listener.closeUnknownTag(tag);
+ }
+ }else{
+ this._Listener.closeUnopenedTag(tag);
+ }
+ this._Listener.last_tag = tag;
+ this._Listener.last_tag_opened = false;
+};
+
+WYMeditor.XhtmlParser.prototype._increaseOpenTagCounter = function(tag)
+{
+ this._Listener._open_tags[tag] = this._Listener._open_tags[tag] || 0;
+ this._Listener._open_tags[tag]++;
+};
+
+WYMeditor.XhtmlParser.prototype._decreaseOpenTagCounter = function(tag)
+{
+ if(this._Listener._open_tags[tag]){
+ this._Listener._open_tags[tag]--;
+ if(this._Listener._open_tags[tag] == 0){
+ this._Listener._open_tags[tag] = undefined;
+ }
+ return true;
+ }
+ return false;
+};
+
+WYMeditor.XhtmlParser.prototype.autoCloseUnclosedBeforeNewOpening = function(new_tag)
+{
+ this._autoCloseUnclosed(new_tag, false);
+};
+
+WYMeditor.XhtmlParser.prototype.autoCloseUnclosedBeforeTagClosing = function(tag)
+{
+ this._autoCloseUnclosed(tag, true);
+};
+
+WYMeditor.XhtmlParser.prototype._autoCloseUnclosed = function(new_tag, closing)
+{
+ var closing = closing || false;
+ if(this._Listener._open_tags){
+ for (var tag in this._Listener._open_tags) {
+ var counter = this._Listener._open_tags[tag];
+ if(counter > 0 && this._Listener.shouldCloseTagAutomatically(tag, new_tag, closing)){
+ this._callCloseTagListener(tag, true);
+ }
+ }
+ }
+};
+
+WYMeditor.XhtmlParser.prototype.getTagReplacements = function()
+{
+ return this._Listener.getTagReplacements();
+};
+
+WYMeditor.XhtmlParser.prototype.normalizeTag = function(tag)
+{
+ tag = tag.replace(/^([\s<\/>]*)|([\s<\/>]*)$/gm,'').toLowerCase();
+ var tags = this._Listener.getTagReplacements();
+ if(tags[tag]){
+ return tags[tag];
+ }
+ return tag;
+};
+
+WYMeditor.XhtmlParser.prototype.TagAttributes = function(match, state)
+{
+ if(WYMeditor.LEXER_SPECIAL == state){
+ this._current_attribute = match;
+ }
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.DoubleQuotedAttribute = function(match, state)
+{
+ if(WYMeditor.LEXER_UNMATCHED == state){
+ this._tag_attributes[this._current_attribute] = match;
+ }
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.SingleQuotedAttribute = function(match, state)
+{
+ if(WYMeditor.LEXER_UNMATCHED == state){
+ this._tag_attributes[this._current_attribute] = match;
+ }
+ return true;
+};
+
+WYMeditor.XhtmlParser.prototype.UnquotedAttribute = function(match, state)
+{
+ this._tag_attributes[this._current_attribute] = match.replace(/^=/,'');
+ return true;
+};
+
+
+
+/**
+* XHTML Sax parser.
+*
+* @author Bermi Ferrer (http://bermi.org)
+*/
+WYMeditor.XhtmlSaxListener = function()
+{
+ this.output = '';
+ this.helper = new WYMeditor.XmlHelper();
+ this._open_tags = {};
+ this.validator = WYMeditor.XhtmlValidator;
+ this._tag_stack = [];
+ this.avoided_tags = [];
+
+ this.entities = {
+ '&nbsp;':'&#160;','&iexcl;':'&#161;','&cent;':'&#162;',
+ '&pound;':'&#163;','&curren;':'&#164;','&yen;':'&#165;',
+ '&brvbar;':'&#166;','&sect;':'&#167;','&uml;':'&#168;',
+ '&copy;':'&#169;','&ordf;':'&#170;','&laquo;':'&#171;',
+ '&not;':'&#172;','&shy;':'&#173;','&reg;':'&#174;',
+ '&macr;':'&#175;','&deg;':'&#176;','&plusmn;':'&#177;',
+ '&sup2;':'&#178;','&sup3;':'&#179;','&acute;':'&#180;',
+ '&micro;':'&#181;','&para;':'&#182;','&middot;':'&#183;',
+ '&cedil;':'&#184;','&sup1;':'&#185;','&ordm;':'&#186;',
+ '&raquo;':'&#187;','&frac14;':'&#188;','&frac12;':'&#189;',
+ '&frac34;':'&#190;','&iquest;':'&#191;','&Agrave;':'&#192;',
+ '&Aacute;':'&#193;','&Acirc;':'&#194;','&Atilde;':'&#195;',
+ '&Auml;':'&#196;','&Aring;':'&#197;','&AElig;':'&#198;',
+ '&Ccedil;':'&#199;','&Egrave;':'&#200;','&Eacute;':'&#201;',
+ '&Ecirc;':'&#202;','&Euml;':'&#203;','&Igrave;':'&#204;',
+ '&Iacute;':'&#205;','&Icirc;':'&#206;','&Iuml;':'&#207;',
+ '&ETH;':'&#208;','&Ntilde;':'&#209;','&Ograve;':'&#210;',
+ '&Oacute;':'&#211;','&Ocirc;':'&#212;','&Otilde;':'&#213;',
+ '&Ouml;':'&#214;','&times;':'&#215;','&Oslash;':'&#216;',
+ '&Ugrave;':'&#217;','&Uacute;':'&#218;','&Ucirc;':'&#219;',
+ '&Uuml;':'&#220;','&Yacute;':'&#221;','&THORN;':'&#222;',
+ '&szlig;':'&#223;','&agrave;':'&#224;','&aacute;':'&#225;',
+ '&acirc;':'&#226;','&atilde;':'&#227;','&auml;':'&#228;',
+ '&aring;':'&#229;','&aelig;':'&#230;','&ccedil;':'&#231;',
+ '&egrave;':'&#232;','&eacute;':'&#233;','&ecirc;':'&#234;',
+ '&euml;':'&#235;','&igrave;':'&#236;','&iacute;':'&#237;',
+ '&icirc;':'&#238;','&iuml;':'&#239;','&eth;':'&#240;',
+ '&ntilde;':'&#241;','&ograve;':'&#242;','&oacute;':'&#243;',
+ '&ocirc;':'&#244;','&otilde;':'&#245;','&ouml;':'&#246;',
+ '&divide;':'&#247;','&oslash;':'&#248;','&ugrave;':'&#249;',
+ '&uacute;':'&#250;','&ucirc;':'&#251;','&uuml;':'&#252;',
+ '&yacute;':'&#253;','&thorn;':'&#254;','&yuml;':'&#255;',
+ '&OElig;':'&#338;','&oelig;':'&#339;','&Scaron;':'&#352;',
+ '&scaron;':'&#353;','&Yuml;':'&#376;','&fnof;':'&#402;',
+ '&circ;':'&#710;','&tilde;':'&#732;','&Alpha;':'&#913;',
+ '&Beta;':'&#914;','&Gamma;':'&#915;','&Delta;':'&#916;',
+ '&Epsilon;':'&#917;','&Zeta;':'&#918;','&Eta;':'&#919;',
+ '&Theta;':'&#920;','&Iota;':'&#921;','&Kappa;':'&#922;',
+ '&Lambda;':'&#923;','&Mu;':'&#924;','&Nu;':'&#925;',
+ '&Xi;':'&#926;','&Omicron;':'&#927;','&Pi;':'&#928;',
+ '&Rho;':'&#929;','&Sigma;':'&#931;','&Tau;':'&#932;',
+ '&Upsilon;':'&#933;','&Phi;':'&#934;','&Chi;':'&#935;',
+ '&Psi;':'&#936;','&Omega;':'&#937;','&alpha;':'&#945;',
+ '&beta;':'&#946;','&gamma;':'&#947;','&delta;':'&#948;',
+ '&epsilon;':'&#949;','&zeta;':'&#950;','&eta;':'&#951;',
+ '&theta;':'&#952;','&iota;':'&#953;','&kappa;':'&#954;',
+ '&lambda;':'&#955;','&mu;':'&#956;','&nu;':'&#957;',
+ '&xi;':'&#958;','&omicron;':'&#959;','&pi;':'&#960;',
+ '&rho;':'&#961;','&sigmaf;':'&#962;','&sigma;':'&#963;',
+ '&tau;':'&#964;','&upsilon;':'&#965;','&phi;':'&#966;',
+ '&chi;':'&#967;','&psi;':'&#968;','&omega;':'&#969;',
+ '&thetasym;':'&#977;','&upsih;':'&#978;','&piv;':'&#982;',
+ '&ensp;':'&#8194;','&emsp;':'&#8195;','&thinsp;':'&#8201;',
+ '&zwnj;':'&#8204;','&zwj;':'&#8205;','&lrm;':'&#8206;',
+ '&rlm;':'&#8207;','&ndash;':'&#8211;','&mdash;':'&#8212;',
+ '&lsquo;':'&#8216;','&rsquo;':'&#8217;','&sbquo;':'&#8218;',
+ '&ldquo;':'&#8220;','&rdquo;':'&#8221;','&bdquo;':'&#8222;',
+ '&dagger;':'&#8224;','&Dagger;':'&#8225;','&bull;':'&#8226;',
+ '&hellip;':'&#8230;','&permil;':'&#8240;','&prime;':'&#8242;',
+ '&Prime;':'&#8243;','&lsaquo;':'&#8249;','&rsaquo;':'&#8250;',
+ '&oline;':'&#8254;','&frasl;':'&#8260;','&euro;':'&#8364;',
+ '&image;':'&#8465;','&weierp;':'&#8472;','&real;':'&#8476;',
+ '&trade;':'&#8482;','&alefsym;':'&#8501;','&larr;':'&#8592;',
+ '&uarr;':'&#8593;','&rarr;':'&#8594;','&darr;':'&#8595;',
+ '&harr;':'&#8596;','&crarr;':'&#8629;','&lArr;':'&#8656;',
+ '&uArr;':'&#8657;','&rArr;':'&#8658;','&dArr;':'&#8659;',
+ '&hArr;':'&#8660;','&forall;':'&#8704;','&part;':'&#8706;',
+ '&exist;':'&#8707;','&empty;':'&#8709;','&nabla;':'&#8711;',
+ '&isin;':'&#8712;','&notin;':'&#8713;','&ni;':'&#8715;',
+ '&prod;':'&#8719;','&sum;':'&#8721;','&minus;':'&#8722;',
+ '&lowast;':'&#8727;','&radic;':'&#8730;','&prop;':'&#8733;',
+ '&infin;':'&#8734;','&ang;':'&#8736;','&and;':'&#8743;',
+ '&or;':'&#8744;','&cap;':'&#8745;','&cup;':'&#8746;',
+ '&int;':'&#8747;','&there4;':'&#8756;','&sim;':'&#8764;',
+ '&cong;':'&#8773;','&asymp;':'&#8776;','&ne;':'&#8800;',
+ '&equiv;':'&#8801;','&le;':'&#8804;','&ge;':'&#8805;',
+ '&sub;':'&#8834;','&sup;':'&#8835;','&nsub;':'&#8836;',
+ '&sube;':'&#8838;','&supe;':'&#8839;','&oplus;':'&#8853;',
+ '&otimes;':'&#8855;','&perp;':'&#8869;','&sdot;':'&#8901;',
+ '&lceil;':'&#8968;','&rceil;':'&#8969;','&lfloor;':'&#8970;',
+ '&rfloor;':'&#8971;','&lang;':'&#9001;','&rang;':'&#9002;',
+ '&loz;':'&#9674;','&spades;':'&#9824;','&clubs;':'&#9827;',
+ '&hearts;':'&#9829;','&diams;':'&#9830;'};
+
+ this.block_tags = ["a", "abbr", "acronym", "address", "area", "b",
+ "base", "bdo", "big", "blockquote", "body", "button",
+ "caption", "cite", "code", "col", "colgroup", "dd", "del", "div",
+ "dfn", "dl", "dt", "em", "fieldset", "form", "head", "h1", "h2",
+ "h3", "h4", "h5", "h6", "html", "i", "ins",
+ "kbd", "label", "legend", "li", "map", "noscript",
+ "object", "ol", "optgroup", "option", "p", "param", "pre", "q",
+ "samp", "script", "select", "small", "span", "strong", "style",
+ "sub", "sup", "table", "tbody", "td", "textarea", "tfoot", "th",
+ "thead", "title", "tr", "tt", "ul", "var", "extends"];
+
+
+ this.inline_tags = ["br", "hr", "img", "input"];
+
+ return this;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.shouldCloseTagAutomatically = function(tag, now_on_tag, closing)
+{
+ var closing = closing || false;
+ if(tag == 'td'){
+ if((closing && now_on_tag == 'tr') || (!closing && now_on_tag == 'td')){
+ return true;
+ }
+ }
+ if(tag == 'option'){
+ if((closing && now_on_tag == 'select') || (!closing && now_on_tag == 'option')){
+ return true;
+ }
+ }
+ return false;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.beforeParsing = function(raw)
+{
+ this.output = '';
+ return raw;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.afterParsing = function(xhtml)
+{
+ xhtml = this.replaceNamedEntities(xhtml);
+ xhtml = this.joinRepeatedEntities(xhtml);
+ xhtml = this.removeEmptyTags(xhtml);
+ xhtml = this.removeBrInPre(xhtml);
+ return xhtml;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.replaceNamedEntities = function(xhtml)
+{
+ for (var entity in this.entities) {
+ xhtml = xhtml.replace(new RegExp(entity, 'g'), this.entities[entity]);
+ }
+ return xhtml;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.joinRepeatedEntities = function(xhtml)
+{
+ var tags = 'em|strong|sub|sup|acronym|pre|del|address';
+ return xhtml.replace(new RegExp('<\/('+tags+')><\\1>' ,''),'').
+ replace(new RegExp('(\s*<('+tags+')>\s*){2}(.*)(\s*<\/\\2>\s*){2}' ,''),'<\$2>\$3<\$2>');
+};
+
+WYMeditor.XhtmlSaxListener.prototype.removeEmptyTags = function(xhtml)
+{
+ return xhtml.replace(new RegExp('<('+this.block_tags.join("|").replace(/\|td/,'').replace(/\|th/, '')+')>(<br \/>|&#160;|&nbsp;|\\s)*<\/\\1>' ,'g'),'');
+};
+
+WYMeditor.XhtmlSaxListener.prototype.removeBrInPre = function(xhtml)
+{
+ var matches = xhtml.match(new RegExp('<pre[^>]*>(.*?)<\/pre>','gmi'));
+ if(matches) {
+ for(var i=0; i<matches.length; i++) {
+ xhtml = xhtml.replace(matches[i], matches[i].replace(new RegExp('<br \/>', 'g'), String.fromCharCode(13,10)));
+ }
+ }
+ return xhtml;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.getResult = function()
+{
+ return this.output;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.getTagReplacements = function()
+{
+ return {'b':'strong', 'i':'em'};
+};
+
+WYMeditor.XhtmlSaxListener.prototype.addContent = function(text)
+{
+ this.output += text;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.addComment = function(text)
+{
+ if(this.remove_comments){
+ this.output += text;
+ }
+};
+
+WYMeditor.XhtmlSaxListener.prototype.addScript = function(text)
+{
+ if(!this.remove_scripts){
+ this.output += text;
+ }
+};
+
+WYMeditor.XhtmlSaxListener.prototype.addCss = function(text)
+{
+ if(!this.remove_embeded_styles){
+ this.output += text;
+ }
+};
+
+WYMeditor.XhtmlSaxListener.prototype.openBlockTag = function(tag, attributes)
+{
+ this.output += this.helper.tag(tag, this.validator.getValidTagAttributes(tag, attributes), true);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.inlineTag = function(tag, attributes)
+{
+ this.output += this.helper.tag(tag, this.validator.getValidTagAttributes(tag, attributes));
+};
+
+WYMeditor.XhtmlSaxListener.prototype.openUnknownTag = function(tag, attributes)
+{
+ //this.output += this.helper.tag(tag, attributes, true);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.closeBlockTag = function(tag)
+{
+ this.output = this.output.replace(/<br \/>$/, '')+this._getClosingTagContent('before', tag)+"</"+tag+">"+this._getClosingTagContent('after', tag);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.closeUnknownTag = function(tag)
+{
+ //this.output += "</"+tag+">";
+};
+
+WYMeditor.XhtmlSaxListener.prototype.closeUnopenedTag = function(tag)
+{
+ this.output += "</"+tag+">";
+};
+
+WYMeditor.XhtmlSaxListener.prototype.avoidStylingTagsAndAttributes = function()
+{
+ this.avoided_tags = ['div','span'];
+ this.validator.skiped_attributes = ['style'];
+ this.validator.skiped_attribute_values = ['MsoNormal','main1']; // MS Word attributes for class
+ this._avoiding_tags_implicitly = true;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.allowStylingTagsAndAttributes = function()
+{
+ this.avoided_tags = [];
+ this.validator.skiped_attributes = [];
+ this.validator.skiped_attribute_values = [];
+ this._avoiding_tags_implicitly = false;
+};
+
+WYMeditor.XhtmlSaxListener.prototype.isBlockTag = function(tag)
+{
+ return !WYMeditor.Helper.contains(this.avoided_tags, tag) && WYMeditor.Helper.contains(this.block_tags, tag);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.isInlineTag = function(tag)
+{
+ return !WYMeditor.Helper.contains(this.avoided_tags, tag) && WYMeditor.Helper.contains(this.inline_tags, tag);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.insertContentAfterClosingTag = function(tag, content)
+{
+ this._insertContentWhenClosingTag('after', tag, content);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.insertContentBeforeClosingTag = function(tag, content)
+{
+ this._insertContentWhenClosingTag('before', tag, content);
+};
+
+WYMeditor.XhtmlSaxListener.prototype.fixNestingBeforeOpeningBlockTag = function(tag, attributes)
+{
+ if(tag != 'li' && (tag == 'ul' || tag == 'ol') && this.last_tag && !this.last_tag_opened && this.last_tag == 'li'){
+ this.output = this.output.replace(/<\/li>$/, '');
+ this.insertContentAfterClosingTag(tag, '</li>');
+ }
+};
+
+WYMeditor.XhtmlSaxListener.prototype._insertContentWhenClosingTag = function(position, tag, content)
+{
+ if(!this['_insert_'+position+'_closing']){
+ this['_insert_'+position+'_closing'] = [];
+ }
+ if(!this['_insert_'+position+'_closing'][tag]){
+ this['_insert_'+position+'_closing'][tag] = [];
+ }
+ this['_insert_'+position+'_closing'][tag].push(content);
+};
+
+WYMeditor.XhtmlSaxListener.prototype._getClosingTagContent = function(position, tag)
+{
+ if( this['_insert_'+position+'_closing'] &&
+ this['_insert_'+position+'_closing'][tag] &&
+ this['_insert_'+position+'_closing'][tag].length > 0){
+ return this['_insert_'+position+'_closing'][tag].pop();
+ }
+ return '';
+};
+
+
+/********** CSS PARSER **********/
+
+
+WYMeditor.WymCssLexer = function(parser, only_wym_blocks)
+{
+ var only_wym_blocks = (typeof only_wym_blocks == 'undefined' ? true : only_wym_blocks);
+
+ jQuery.extend(this, new WYMeditor.Lexer(parser, (only_wym_blocks?'Ignore':'WymCss')));
+
+ this.mapHandler('WymCss', 'Ignore');
+
+ if(only_wym_blocks == true){
+ this.addEntryPattern("/\\\x2a[<\\s]*WYMeditor[>\\s]*\\\x2a/", 'Ignore', 'WymCss');
+ this.addExitPattern("/\\\x2a[<\/\\s]*WYMeditor[>\\s]*\\\x2a/", 'WymCss');
+ }
+
+ this.addSpecialPattern("[\\sa-z1-6]*\\\x2e[a-z-_0-9]+", 'WymCss', 'WymCssStyleDeclaration');
+
+ this.addEntryPattern("/\\\x2a", 'WymCss', 'WymCssComment');
+ this.addExitPattern("\\\x2a/", 'WymCssComment');
+
+ this.addEntryPattern("\x7b", 'WymCss', 'WymCssStyle');
+ this.addExitPattern("\x7d", 'WymCssStyle');
+
+ this.addEntryPattern("/\\\x2a", 'WymCssStyle', 'WymCssFeedbackStyle');
+ this.addExitPattern("\\\x2a/", 'WymCssFeedbackStyle');
+
+ return this;
+};
+
+WYMeditor.WymCssParser = function()
+{
+ this._in_style = false;
+ this._has_title = false;
+ this.only_wym_blocks = true;
+ this.css_settings = {'classesItems':[], 'editorStyles':[], 'dialogStyles':[]};
+ return this;
+};
+
+WYMeditor.WymCssParser.prototype.parse = function(raw, only_wym_blocks)
+{
+ var only_wym_blocks = (typeof only_wym_blocks == 'undefined' ? this.only_wym_blocks : only_wym_blocks);
+ this._Lexer = new WYMeditor.WymCssLexer(this, only_wym_blocks);
+ this._Lexer.parse(raw);
+};
+
+WYMeditor.WymCssParser.prototype.Ignore = function(match, state)
+{
+ return true;
+};
+
+WYMeditor.WymCssParser.prototype.WymCssComment = function(text, status)
+{
+ if(text.match(/end[a-z0-9\s]*wym[a-z0-9\s]*/mi)){
+ return false;
+ }
+ if(status == WYMeditor.LEXER_UNMATCHED){
+ if(!this._in_style){
+ this._has_title = true;
+ this._current_item = {'title':WYMeditor.Helper.trim(text)};
+ }else{
+ if(this._current_item[this._current_element]){
+ if(!this._current_item[this._current_element].expressions){
+ this._current_item[this._current_element].expressions = [text];
+ }else{
+ this._current_item[this._current_element].expressions.push(text);
+ }
+ }
+ }
+ this._in_style = true;
+ }
+ return true;
+};
+
+WYMeditor.WymCssParser.prototype.WymCssStyle = function(match, status)
+{
+ if(status == WYMeditor.LEXER_UNMATCHED){
+ match = WYMeditor.Helper.trim(match);
+ if(match != ''){
+ this._current_item[this._current_element].style = match;
+ }
+ }else if (status == WYMeditor.LEXER_EXIT){
+ this._in_style = false;
+ this._has_title = false;
+ this.addStyleSetting(this._current_item);
+ }
+ return true;
+};
+
+WYMeditor.WymCssParser.prototype.WymCssFeedbackStyle = function(match, status)
+{
+ if(status == WYMeditor.LEXER_UNMATCHED){
+ this._current_item[this._current_element].feedback_style = match.replace(/^([\s\/\*]*)|([\s\/\*]*)$/gm,'');
+ }
+ return true;
+};
+
+WYMeditor.WymCssParser.prototype.WymCssStyleDeclaration = function(match)
+{
+ match = match.replace(/^([\s\.]*)|([\s\.*]*)$/gm, '');
+
+ var tag = '';
+ if(match.indexOf('.') > 0){
+ var parts = match.split('.');
+ this._current_element = parts[1];
+ var tag = parts[0];
+ }else{
+ this._current_element = match;
+ }
+
+ if(!this._has_title){
+ this._current_item = {'title':(!tag?'':tag.toUpperCase()+': ')+this._current_element};
+ this._has_title = true;
+ }
+
+ if(!this._current_item[this._current_element]){
+ this._current_item[this._current_element] = {'name':this._current_element};
+ }
+ if(tag){
+ if(!this._current_item[this._current_element].tags){
+ this._current_item[this._current_element].tags = [tag];
+ }else{
+ this._current_item[this._current_element].tags.push(tag);
+ }
+ }
+ return true;
+};
+
+WYMeditor.WymCssParser.prototype.addStyleSetting = function(style_details)
+{
+ for (var name in style_details){
+ var details = style_details[name];
+ if(typeof details == 'object' && name != 'title'){
+
+ this.css_settings.classesItems.push({
+ 'name': WYMeditor.Helper.trim(details.name),
+ 'title': style_details.title,
+ 'expr' : WYMeditor.Helper.trim((details.expressions||details.tags).join(', '))
+ });
+ if(details.feedback_style){
+ this.css_settings.editorStyles.push({
+ 'name': '.'+ WYMeditor.Helper.trim(details.name),
+ 'css': details.feedback_style
+ });
+ }
+ if(details.style){
+ this.css_settings.dialogStyles.push({
+ 'name': '.'+ WYMeditor.Helper.trim(details.name),
+ 'css': details.style
+ });
+ }
+ }
+ }
+};
+
+/********** HELPERS **********/
+
+// Returns true if it is a text node with whitespaces only
+jQuery.fn.isPhantomNode = function() {
+ if (this[0].nodeType == 3)
+ return !(/[^\t\n\r ]/.test(this[0].data));
+
+ return false;
+};
+
+WYMeditor.isPhantomNode = function(n) {
+ if (n.nodeType == 3)
+ return !(/[^\t\n\r ]/.test(n.data));
+
+ return false;
+};
+
+WYMeditor.isPhantomString = function(str) {
+ return !(/[^\t\n\r ]/.test(str));
+};
+
+// Returns the Parents or the node itself
+// jqexpr = a jQuery expression
+jQuery.fn.parentsOrSelf = function(jqexpr) {
+ var n = this;
+
+ if (n[0].nodeType == 3)
+ n = n.parents().slice(0,1);
+
+// if (n.is(jqexpr)) // XXX should work, but doesn't (probably a jQuery bug)
+ if (n.filter(jqexpr).size() == 1)
+ return n;
+ else
+ return n.parents(jqexpr).slice(0,1);
+};
+
+// String & array helpers
+
+WYMeditor.Helper = {
+
+ //replace all instances of 'old' by 'rep' in 'str' string
+ replaceAll: function(str, old, rep) {
+ var rExp = new RegExp(old, "g");
+ return(str.replace(rExp, rep));
+ },
+
+ //insert 'inserted' at position 'pos' in 'str' string
+ insertAt: function(str, inserted, pos) {
+ return(str.substr(0,pos) + inserted + str.substring(pos));
+ },
+
+ //trim 'str' string
+ trim: function(str) {
+ return str.replace(/^(\s*)|(\s*)$/gm,'');
+ },
+
+ //return true if 'arr' array contains 'elem', or false
+ contains: function(arr, elem) {
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i] === elem) return true;
+ }
+ return false;
+ },
+
+ //return 'item' position in 'arr' array, or -1
+ indexOf: function(arr, item) {
+ var ret=-1;
+ for(var i = 0; i < arr.length; i++) {
+ if (arr[i] == item) {
+ ret = i;
+ break;
+ }
+ }
+ return(ret);
+ },
+
+ //return 'item' object in 'arr' array, checking its 'name' property, or null
+ findByName: function(arr, name) {
+ for(var i = 0; i < arr.length; i++) {
+ var item = arr[i];
+ if(item.name == name) return(item);
+ }
+ return(null);
+ }
+};
+
+
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.explorer.js
+ * MSIE specific class and functions.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ * Bermi Ferrer (wymeditor a-t bermi dotorg)
+ * Frédéric Palluel-Lafleur (fpalluel a-t gmail dotcom)
+ * Jonatan Lundin (jonatan.lundin a-t gmail dotcom)
+ */
+
+WYMeditor.WymClassExplorer = function(wym) {
+
+ this._wym = wym;
+ this._class = "className";
+ this._newLine = "\r\n";
+
+};
+
+WYMeditor.WymClassExplorer.prototype.initIframe = function(iframe) {
+
+ //This function is executed twice, though it is called once!
+ //But MSIE needs that, otherwise designMode won't work.
+ //Weird.
+
+ this._iframe = iframe;
+ this._doc = iframe.contentWindow.document;
+
+ //add css rules from options
+ var styles = this._doc.styleSheets[0];
+ var aCss = eval(this._options.editorStyles);
+
+ this.addCssRules(this._doc, aCss);
+
+ this._doc.title = this._wym._index;
+
+ //set the text direction
+ jQuery('html', this._doc).attr('dir', this._options.direction);
+
+ //init html value
+ jQuery(this._doc.body).html(this._wym._html);
+
+ //handle events
+ var wym = this;
+
+ this._doc.body.onfocus = function()
+ {wym._doc.designMode = "on"; wym._doc = iframe.contentWindow.document;};
+ this._doc.onbeforedeactivate = function() {wym.saveCaret();};
+ this._doc.onkeyup = function() {
+ wym.saveCaret();
+ wym.keyup();
+ };
+ this._doc.onclick = function() {wym.saveCaret();};
+
+ this._doc.body.onbeforepaste = function() {
+ wym._iframe.contentWindow.event.returnValue = false;
+ };
+
+ this._doc.body.onpaste = function() {
+ wym._iframe.contentWindow.event.returnValue = false;
+ wym.paste(window.clipboardData.getData("Text"));
+ };
+
+ //callback can't be executed twice, so we check
+ if(this._initialized) {
+
+ //pre-bind functions
+ if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
+
+ //bind external events
+ this._wym.bindEvents();
+
+ //post-init functions
+ if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
+
+ //add event listeners to doc elements, e.g. images
+ this.listen();
+ }
+
+ this._initialized = true;
+
+ //init designMode
+ this._doc.designMode="on";
+ try{
+ // (bermi's note) noticed when running unit tests on IE6
+ // Is this really needed, it trigger an unexisting property on IE6
+ this._doc = iframe.contentWindow.document;
+ }catch(e){}
+};
+
+WYMeditor.WymClassExplorer.prototype._exec = function(cmd,param) {
+
+ switch(cmd) {
+
+ case WYMeditor.INDENT: case WYMeditor.OUTDENT:
+
+ var container = this.findUp(this.container(), WYMeditor.LI);
+ if(container) {
+ var ancestor = container.parentNode.parentNode;
+ if(container.parentNode.childNodes.length>1
+ || ancestor.tagName.toLowerCase() == WYMeditor.OL
+ || ancestor.tagName.toLowerCase() == WYMeditor.UL)
+ this._doc.execCommand(cmd);
+ }
+ break;
+ default:
+ if(param) this._doc.execCommand(cmd,false,param);
+ else this._doc.execCommand(cmd);
+ break;
+ }
+
+};
+
+WYMeditor.WymClassExplorer.prototype.selected = function() {
+
+ var caretPos = this._iframe.contentWindow.document.caretPos;
+ if(caretPos!=null) {
+ if(caretPos.parentElement!=undefined)
+ return(caretPos.parentElement());
+ }
+};
+
+WYMeditor.WymClassExplorer.prototype.saveCaret = function() {
+
+ this._doc.caretPos = this._doc.selection.createRange();
+};
+
+WYMeditor.WymClassExplorer.prototype.addCssRule = function(styles, oCss) {
+
+ styles.addRule(oCss.name, oCss.css);
+};
+
+WYMeditor.WymClassExplorer.prototype.insert = function(html) {
+
+ // Get the current selection
+ var range = this._doc.selection.createRange();
+
+ // Check if the current selection is inside the editor
+ if ( jQuery(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) {
+ try {
+ // Overwrite selection with provided html
+ range.pasteHTML(html);
+ } catch (e) { }
+ } else {
+ // Fall back to the internal paste function if there's no selection
+ this.paste(html);
+ }
+};
+
+WYMeditor.WymClassExplorer.prototype.wrap = function(left, right) {
+
+ // Get the current selection
+ var range = this._doc.selection.createRange();
+
+ // Check if the current selection is inside the editor
+ if ( jQuery(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) {
+ try {
+ // Overwrite selection with provided html
+ range.pasteHTML(left + range.text + right);
+ } catch (e) { }
+ }
+};
+
+WYMeditor.WymClassExplorer.prototype.unwrap = function() {
+
+ // Get the current selection
+ var range = this._doc.selection.createRange();
+
+ // Check if the current selection is inside the editor
+ if ( jQuery(range.parentElement()).parents( this._options.iframeBodySelector ).is('*') ) {
+ try {
+ // Unwrap selection
+ var text = range.text;
+ this._exec( 'Cut' );
+ range.pasteHTML( text );
+ } catch (e) { }
+ }
+};
+
+//keyup handler
+WYMeditor.WymClassExplorer.prototype.keyup = function() {
+ this._selected_image = null;
+};
+
+WYMeditor.WymClassExplorer.prototype.setFocusToNode = function(node, toStart) {
+ var range = this._doc.selection.createRange();
+ toStart = toStart ? true : false;
+
+ range.moveToElementText(node);
+ range.collapse(toStart);
+ range.select();
+ node.focus();
+};
+
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.mozilla.js
+ * Gecko specific class and functions.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ * Volker Mische (vmx a-t gmx dotde)
+ * Bermi Ferrer (wymeditor a-t bermi dotorg)
+ * Frédéric Palluel-Lafleur (fpalluel a-t gmail dotcom)
+ * Jonatan Lundin (jonatan.lundin a-t gmail dotcom)
+ */
+
+WYMeditor.WymClassMozilla = function(wym) {
+
+ this._wym = wym;
+ this._class = "class";
+ this._newLine = "\n";
+};
+
+WYMeditor.WymClassMozilla.prototype.initIframe = function(iframe) {
+ var wym = this;
+
+ this._iframe = iframe;
+ this._doc = iframe.contentDocument;
+
+ //add css rules from options
+
+ var styles = this._doc.styleSheets[0];
+ var aCss = eval(this._options.editorStyles);
+
+ this.addCssRules(this._doc, aCss);
+
+ this._doc.title = this._wym._index;
+
+ //set the text direction
+ jQuery('html', this._doc).attr('dir', this._options.direction);
+
+ //init html value
+ this.html(this._wym._html);
+
+ //init designMode
+ this.enableDesignMode();
+
+ //pre-bind functions
+ if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
+
+ //bind external events
+ this._wym.bindEvents();
+
+ //bind editor keydown events
+ jQuery(this._doc).bind("keydown", this.keydown);
+
+ //bind editor keyup events
+ jQuery(this._doc).bind("keyup", this.keyup);
+
+ //bind editor focus events (used to reset designmode - Gecko bug)
+ jQuery(this._doc).bind("focus", function () {
+ // Fix scope
+ wym.enableDesignMode.call(wym);
+ });
+
+ //post-init functions
+ if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
+
+ //add event listeners to doc elements, e.g. images
+ this.listen();
+};
+
+/* @name html
+ * @description Get/Set the html value
+ */
+WYMeditor.WymClassMozilla.prototype.html = function(html) {
+
+ if(typeof html === 'string') {
+
+ //disable designMode
+ try { this._doc.designMode = "off"; } catch(e) { };
+
+ //replace em by i and strong by bold
+ //(designMode issue)
+ html = html.replace(/<em(\b[^>]*)>/gi, "<i$1>")
+ .replace(/<\/em>/gi, "</i>")
+ .replace(/<strong(\b[^>]*)>/gi, "<b$1>")
+ .replace(/<\/strong>/gi, "</b>");
+
+ //update the html body
+ jQuery(this._doc.body).html(html);
+
+ //re-init designMode
+ this.enableDesignMode();
+ }
+ else return(jQuery(this._doc.body).html());
+};
+
+WYMeditor.WymClassMozilla.prototype._exec = function(cmd,param) {
+
+ if(!this.selected()) return(false);
+
+ switch(cmd) {
+
+ case WYMeditor.INDENT: case WYMeditor.OUTDENT:
+
+ var focusNode = this.selected();
+ var sel = this._iframe.contentWindow.getSelection();
+ var anchorNode = sel.anchorNode;
+ if(anchorNode.nodeName == "#text") anchorNode = anchorNode.parentNode;
+
+ focusNode = this.findUp(focusNode, WYMeditor.BLOCKS);
+ anchorNode = this.findUp(anchorNode, WYMeditor.BLOCKS);
+
+ if(focusNode && focusNode == anchorNode
+ && focusNode.tagName.toLowerCase() == WYMeditor.LI) {
+
+ var ancestor = focusNode.parentNode.parentNode;
+
+ if(focusNode.parentNode.childNodes.length>1
+ || ancestor.tagName.toLowerCase() == WYMeditor.OL
+ || ancestor.tagName.toLowerCase() == WYMeditor.UL)
+ this._doc.execCommand(cmd,'',null);
+ }
+
+ break;
+
+ default:
+
+ if(param) this._doc.execCommand(cmd,'',param);
+ else this._doc.execCommand(cmd,'',null);
+ }
+
+ //set to P if parent = BODY
+ var container = this.selected();
+ if(container.tagName.toLowerCase() == WYMeditor.BODY)
+ this._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
+};
+
+/* @name selected
+ * @description Returns the selected container
+ */
+WYMeditor.WymClassMozilla.prototype.selected = function() {
+
+ var sel = this._iframe.contentWindow.getSelection();
+ var node = sel.focusNode;
+ if(node) {
+ if(node.nodeName == "#text") return(node.parentNode);
+ else return(node);
+ } else return(null);
+};
+
+WYMeditor.WymClassMozilla.prototype.addCssRule = function(styles, oCss) {
+
+ styles.insertRule(oCss.name + " {" + oCss.css + "}",
+ styles.cssRules.length);
+};
+
+
+//keydown handler, mainly used for keyboard shortcuts
+WYMeditor.WymClassMozilla.prototype.keydown = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+ var container = null;
+
+ if(evt.ctrlKey){
+ if(evt.keyCode == 66){
+ //CTRL+b => STRONG
+ wym._exec(WYMeditor.BOLD);
+ return false;
+ }
+ if(evt.keyCode == 73){
+ //CTRL+i => EMPHASIS
+ wym._exec(WYMeditor.ITALIC);
+ return false;
+ }
+ }
+
+ else if(evt.keyCode == 13) {
+ if(!evt.shiftKey){
+ //fix PRE bug #73
+ container = wym.selected();
+ if(container && container.tagName.toLowerCase() == WYMeditor.PRE) {
+ evt.preventDefault();
+ wym.insert('<p></p>');
+ }
+ }
+ }
+};
+
+//keyup handler, mainly used for cleanups
+WYMeditor.WymClassMozilla.prototype.keyup = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+
+ wym._selected_image = null;
+ var container = null;
+
+ if(evt.keyCode == 13 && !evt.shiftKey) {
+
+ //RETURN key
+ //cleanup <br><br> between paragraphs
+ jQuery(wym._doc.body).children(WYMeditor.BR).remove();
+ }
+
+ if(evt.keyCode != 8
+ && evt.keyCode != 17
+ && evt.keyCode != 46
+ && evt.keyCode != 224
+ && !evt.metaKey
+ && !evt.ctrlKey) {
+
+ //NOT BACKSPACE, NOT DELETE, NOT CTRL, NOT COMMAND
+ //text nodes replaced by P
+
+ container = wym.selected();
+ var name = container.tagName.toLowerCase();
+
+ //fix forbidden main containers
+ if(
+ name == "strong" ||
+ name == "b" ||
+ name == "em" ||
+ name == "i" ||
+ name == "sub" ||
+ name == "sup" ||
+ name == "a"
+
+ ) name = container.parentNode.tagName.toLowerCase();
+
+ if(name == WYMeditor.BODY) wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
+ }
+};
+
+WYMeditor.WymClassMozilla.prototype.enableDesignMode = function() {
+ if(this._doc.designMode == "off") {
+ try {
+ this._doc.designMode = "on";
+ this._doc.execCommand("styleWithCSS", '', false);
+ } catch(e) { }
+ }
+};
+
+WYMeditor.WymClassMozilla.prototype.openBlockTag = function(tag, attributes)
+{
+ var attributes = this.validator.getValidTagAttributes(tag, attributes);
+
+ // Handle Mozilla styled spans
+ if(tag == 'span' && attributes.style){
+ var new_tag = this.getTagForStyle(attributes.style);
+ if(new_tag){
+ this._tag_stack.pop();
+ var tag = new_tag;
+ this._tag_stack.push(new_tag);
+ attributes.style = '';
+ }else{
+ return;
+ }
+ }
+
+ this.output += this.helper.tag(tag, attributes, true);
+};
+
+WYMeditor.WymClassMozilla.prototype.getTagForStyle = function(style) {
+
+ if(/bold/.test(style)) return 'strong';
+ if(/italic/.test(style)) return 'em';
+ if(/sub/.test(style)) return 'sub';
+ if(/super/.test(style)) return 'sup';
+ return false;
+};
+
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.opera.js
+ * Opera specific class and functions.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ */
+
+WYMeditor.WymClassOpera = function(wym) {
+
+ this._wym = wym;
+ this._class = "class";
+ this._newLine = "\r\n";
+};
+
+WYMeditor.WymClassOpera.prototype.initIframe = function(iframe) {
+
+ this._iframe = iframe;
+ this._doc = iframe.contentWindow.document;
+
+ //add css rules from options
+ var styles = this._doc.styleSheets[0];
+ var aCss = eval(this._options.editorStyles);
+
+ this.addCssRules(this._doc, aCss);
+
+ this._doc.title = this._wym._index;
+
+ //set the text direction
+ jQuery('html', this._doc).attr('dir', this._options.direction);
+
+ //init designMode
+ this._doc.designMode = "on";
+
+ //init html value
+ this.html(this._wym._html);
+
+ //pre-bind functions
+ if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
+
+ //bind external events
+ this._wym.bindEvents();
+
+ //bind editor keydown events
+ jQuery(this._doc).bind("keydown", this.keydown);
+
+ //bind editor events
+ jQuery(this._doc).bind("keyup", this.keyup);
+
+ //post-init functions
+ if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
+
+ //add event listeners to doc elements, e.g. images
+ this.listen();
+};
+
+WYMeditor.WymClassOpera.prototype._exec = function(cmd,param) {
+
+ if(param) this._doc.execCommand(cmd,false,param);
+ else this._doc.execCommand(cmd);
+
+};
+
+WYMeditor.WymClassOpera.prototype.selected = function() {
+
+ var sel=this._iframe.contentWindow.getSelection();
+ var node=sel.focusNode;
+ if(node) {
+ if(node.nodeName=="#text")return(node.parentNode);
+ else return(node);
+ } else return(null);
+};
+
+WYMeditor.WymClassOpera.prototype.addCssRule = function(styles, oCss) {
+
+ styles.insertRule(oCss.name + " {" + oCss.css + "}",
+ styles.cssRules.length);
+};
+
+//keydown handler
+WYMeditor.WymClassOpera.prototype.keydown = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+ var sel = wym._iframe.contentWindow.getSelection();
+ startNode = sel.getRangeAt(0).startContainer;
+
+ //Get a P instead of no container
+ if(!jQuery(startNode).parentsOrSelf(
+ WYMeditor.MAIN_CONTAINERS.join(","))[0]
+ && !jQuery(startNode).parentsOrSelf('li')
+ && evt.keyCode != WYMeditor.KEY.ENTER
+ && evt.keyCode != WYMeditor.KEY.LEFT
+ && evt.keyCode != WYMeditor.KEY.UP
+ && evt.keyCode != WYMeditor.KEY.RIGHT
+ && evt.keyCode != WYMeditor.KEY.DOWN
+ && evt.keyCode != WYMeditor.KEY.BACKSPACE
+ && evt.keyCode != WYMeditor.KEY.DELETE)
+ wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
+
+};
+
+//keyup handler
+WYMeditor.WymClassOpera.prototype.keyup = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+ wym._selected_image = null;
+};
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.safari.js
+ * Safari specific class and functions.
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ * Scott Lewis (lewiscot a-t gmail dotcom)
+ */
+
+WYMeditor.WymClassSafari = function(wym) {
+
+ this._wym = wym;
+ this._class = "class";
+ this._newLine = "\n";
+};
+
+WYMeditor.WymClassSafari.prototype.initIframe = function(iframe) {
+
+ this._iframe = iframe;
+ this._doc = iframe.contentDocument;
+
+ //add css rules from options
+
+ var styles = this._doc.styleSheets[0];
+ var aCss = eval(this._options.editorStyles);
+
+ this.addCssRules(this._doc, aCss);
+
+ this._doc.title = this._wym._index;
+
+ //set the text direction
+ jQuery('html', this._doc).attr('dir', this._options.direction);
+
+ //init designMode
+ this._doc.designMode = "on";
+
+ //init html value
+ this.html(this._wym._html);
+
+ //pre-bind functions
+ if(jQuery.isFunction(this._options.preBind)) this._options.preBind(this);
+
+ //bind external events
+ this._wym.bindEvents();
+
+ //bind editor keydown events
+ jQuery(this._doc).bind("keydown", this.keydown);
+
+ //bind editor keyup events
+ jQuery(this._doc).bind("keyup", this.keyup);
+
+ //post-init functions
+ if(jQuery.isFunction(this._options.postInit)) this._options.postInit(this);
+
+ //add event listeners to doc elements, e.g. images
+ this.listen();
+};
+
+WYMeditor.WymClassSafari.prototype._exec = function(cmd,param) {
+
+ if(!this.selected()) return(false);
+
+ switch(cmd) {
+
+ case WYMeditor.INDENT: case WYMeditor.OUTDENT:
+
+ var focusNode = this.selected();
+ var sel = this._iframe.contentWindow.getSelection();
+ var anchorNode = sel.anchorNode;
+ if(anchorNode.nodeName == "#text") anchorNode = anchorNode.parentNode;
+
+ focusNode = this.findUp(focusNode, WYMeditor.BLOCKS);
+ anchorNode = this.findUp(anchorNode, WYMeditor.BLOCKS);
+
+ if(focusNode && focusNode == anchorNode
+ && focusNode.tagName.toLowerCase() == WYMeditor.LI) {
+
+ var ancestor = focusNode.parentNode.parentNode;
+
+ if(focusNode.parentNode.childNodes.length>1
+ || ancestor.tagName.toLowerCase() == WYMeditor.OL
+ || ancestor.tagName.toLowerCase() == WYMeditor.UL)
+ this._doc.execCommand(cmd,'',null);
+ }
+
+ break;
+
+ case WYMeditor.INSERT_ORDEREDLIST: case WYMeditor.INSERT_UNORDEREDLIST:
+
+ this._doc.execCommand(cmd,'',null);
+
+ //Safari creates lists in e.g. paragraphs.
+ //Find the container, and remove it.
+ var focusNode = this.selected();
+ var container = this.findUp(focusNode, WYMeditor.MAIN_CONTAINERS);
+ if(container) jQuery(container).replaceWith(jQuery(container).html());
+
+ break;
+
+ default:
+
+ if(param) this._doc.execCommand(cmd,'',param);
+ else this._doc.execCommand(cmd,'',null);
+ }
+
+ //set to P if parent = BODY
+ var container = this.selected();
+ if(container && container.tagName.toLowerCase() == WYMeditor.BODY)
+ this._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P);
+
+};
+
+/* @name selected
+ * @description Returns the selected container
+ */
+WYMeditor.WymClassSafari.prototype.selected = function() {
+
+ var sel = this._iframe.contentWindow.getSelection();
+ var node = sel.focusNode;
+ if(node) {
+ if(node.nodeName == "#text") return(node.parentNode);
+ else return(node);
+ } else return(null);
+};
+
+WYMeditor.WymClassSafari.prototype.addCssRule = function(styles, oCss) {
+
+ styles.insertRule(oCss.name + " {" + oCss.css + "}",
+ styles.cssRules.length);
+};
+
+
+//keydown handler, mainly used for keyboard shortcuts
+WYMeditor.WymClassSafari.prototype.keydown = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+
+ if(evt.ctrlKey){
+ if(evt.keyCode == 66){
+ //CTRL+b => STRONG
+ wym._exec(WYMeditor.BOLD);
+ return false;
+ }
+ if(evt.keyCode == 73){
+ //CTRL+i => EMPHASIS
+ wym._exec(WYMeditor.ITALIC);
+ return false;
+ }
+ }
+};
+
+//keyup handler, mainly used for cleanups
+WYMeditor.WymClassSafari.prototype.keyup = function(evt) {
+
+ //'this' is the doc
+ var wym = WYMeditor.INSTANCES[this.title];
+
+ wym._selected_image = null;
+ var container = null;
+
+ if(evt.keyCode == 13 && !evt.shiftKey) {
+
+ //RETURN key
+ //cleanup <br><br> between paragraphs
+ jQuery(wym._doc.body).children(WYMeditor.BR).remove();
+
+ //fix PRE bug #73
+ container = wym.selected();
+ if(container && container.tagName.toLowerCase() == WYMeditor.PRE)
+ wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); //create P after PRE
+ }
+
+ //fix #112
+ if(evt.keyCode == 13 && evt.shiftKey) {
+ wym._exec('InsertLineBreak');
+ }
+
+ if(evt.keyCode != 8
+ && evt.keyCode != 17
+ && evt.keyCode != 46
+ && evt.keyCode != 224
+ && !evt.metaKey
+ && !evt.ctrlKey) {
+
+ //NOT BACKSPACE, NOT DELETE, NOT CTRL, NOT COMMAND
+ //text nodes replaced by P
+
+ container = wym.selected();
+ var name = container.tagName.toLowerCase();
+
+ //fix forbidden main containers
+ if(
+ name == "strong" ||
+ name == "b" ||
+ name == "em" ||
+ name == "i" ||
+ name == "sub" ||
+ name == "sup" ||
+ name == "a" ||
+ name == "span" //fix #110
+
+ ) name = container.parentNode.tagName.toLowerCase();
+
+ if(name == WYMeditor.BODY || name == WYMeditor.DIV) wym._exec(WYMeditor.FORMAT_BLOCK, WYMeditor.P); //fix #110 for DIV
+ }
+};
+
+WYMeditor.WymClassSafari.prototype.openBlockTag = function(tag, attributes)
+{
+ var attributes = this.validator.getValidTagAttributes(tag, attributes);
+
+ // Handle Safari styled spans
+ if(tag == 'span' && attributes.style) {
+ var new_tag = this.getTagForStyle(attributes.style);
+ if(new_tag){
+ this._tag_stack.pop();
+ var tag = new_tag;
+ this._tag_stack.push(new_tag);
+ attributes.style = '';
+
+ //should fix #125 - also removed the xhtml() override
+ if(typeof attributes['class'] == 'string')
+ attributes['class'] = attributes['class'].replace(/apple-style-span/gi, '');
+
+ } else {
+ return;
+ }
+ }
+
+ this.output += this.helper.tag(tag, attributes, true);
+};
+
+WYMeditor.WymClassSafari.prototype.getTagForStyle = function(style) {
+
+ if(/bold/.test(style)) return 'strong';
+ if(/italic/.test(style)) return 'em';
+ if(/sub/.test(style)) return 'sub';
+ if(/super/.test(style)) return 'sup';
+ return false;
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.min.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.min.js
new file mode 100644
index 0000000..a7f9018
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.min.js
@@ -0,0 +1 @@
+if(!WYMeditor){var WYMeditor={}}(function(){if(!window.console||!console.firebug){var b=["log","debug","info","warn","error","assert","dir","dirxml","group","groupEnd","time","timeEnd","count","trace","profile","profileEnd"];WYMeditor.console={};for(var a=0;a<b.length;++a){WYMeditor.console[b[a]]=function(){}}}else{WYMeditor.console=window.console}})();jQuery.extend(WYMeditor,{VERSION:"0.5-rc1",INSTANCES:[],STRINGS:[],SKINS:[],NAME:"name",INDEX:"{Wym_Index}",WYM_INDEX:"wym_index",BASE_PATH:"{Wym_Base_Path}",CSS_PATH:"{Wym_Css_Path}",WYM_PATH:"{Wym_Wym_Path}",SKINS_DEFAULT_PATH:"skins/",SKINS_DEFAULT_CSS:"skin.css",SKINS_DEFAULT_JS:"skin.js",LANG_DEFAULT_PATH:"lang/",IFRAME_BASE_PATH:"{Wym_Iframe_Base_Path}",IFRAME_DEFAULT:"iframe/default/",JQUERY_PATH:"{Wym_Jquery_Path}",DIRECTION:"{Wym_Direction}",LOGO:"{Wym_Logo}",TOOLS:"{Wym_Tools}",TOOLS_ITEMS:"{Wym_Tools_Items}",TOOL_NAME:"{Wym_Tool_Name}",TOOL_TITLE:"{Wym_Tool_Title}",TOOL_CLASS:"{Wym_Tool_Class}",CLASSES:"{Wym_Classes}",CLASSES_ITEMS:"{Wym_Classes_Items}",CLASS_NAME:"{Wym_Class_Name}",CLASS_TITLE:"{Wym_Class_Title}",CONTAINERS:"{Wym_Containers}",CONTAINERS_ITEMS:"{Wym_Containers_Items}",CONTAINER_NAME:"{Wym_Container_Name}",CONTAINER_TITLE:"{Wym_Containers_Title}",CONTAINER_CLASS:"{Wym_Container_Class}",HTML:"{Wym_Html}",IFRAME:"{Wym_Iframe}",STATUS:"{Wym_Status}",DIALOG_TITLE:"{Wym_Dialog_Title}",DIALOG_BODY:"{Wym_Dialog_Body}",STRING:"string",BODY:"body",DIV:"div",P:"p",H1:"h1",H2:"h2",H3:"h3",H4:"h4",H5:"h5",H6:"h6",PRE:"pre",BLOCKQUOTE:"blockquote",A:"a",BR:"br",IMG:"img",TABLE:"table",TD:"td",TH:"th",UL:"ul",OL:"ol",LI:"li",CLASS:"class",HREF:"href",SRC:"src",TITLE:"title",ALT:"alt",DIALOG_LINK:"Link",DIALOG_IMAGE:"Image",DIALOG_TABLE:"Table",DIALOG_PASTE:"Paste_From_Word",BOLD:"Bold",ITALIC:"Italic",CREATE_LINK:"CreateLink",INSERT_IMAGE:"InsertImage",INSERT_TABLE:"InsertTable",INSERT_HTML:"InsertHTML",PASTE:"Paste",INDENT:"Indent",OUTDENT:"Outdent",TOGGLE_HTML:"ToggleHtml",FORMAT_BLOCK:"FormatBlock",PREVIEW:"Preview",UNLINK:"Unlink",INSERT_UNORDEREDLIST:"InsertUnorderedList",INSERT_ORDEREDLIST:"InsertOrderedList",MAIN_CONTAINERS:new Array("p","h1","h2","h3","h4","h5","h6","pre","blockquote"),BLOCKS:new Array("address","blockquote","div","dl","fieldset","form","h1","h2","h3","h4","h5","h6","hr","noscript","ol","p","pre","table","ul","dd","dt","li","tbody","td","tfoot","th","thead","tr"),KEY:{BACKSPACE:8,ENTER:13,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,CURSOR:new Array(37,38,39,40),DELETE:46},NODE:{ELEMENT:1,ATTRIBUTE:2,TEXT:3},editor:function(b,a){this._index=WYMeditor.INSTANCES.push(this)-1;this._element=b;this._options=a;this._html=jQuery(b).val();if(this._options.html){this._html=this._options.html}this._options.basePath=this._options.basePath||this.computeBasePath();this._options.skinPath=this._options.skinPath||this._options.basePath+WYMeditor.SKINS_DEFAULT_PATH+this._options.skin+"/";this._options.wymPath=this._options.wymPath||this.computeWymPath();this._options.langPath=this._options.langPath||this._options.basePath+WYMeditor.LANG_DEFAULT_PATH;this._options.iframeBasePath=this._options.iframeBasePath||this._options.basePath+WYMeditor.IFRAME_DEFAULT;this._options.jQueryPath=this._options.jQueryPath||this.computeJqueryPath();this.init()}});jQuery.fn.wymeditor=function(a){a=jQuery.extend({html:"",basePath:false,skinPath:false,wymPath:false,iframeBasePath:false,jQueryPath:false,styles:false,stylesheet:false,skin:"default",initSkin:true,loadSkin:true,lang:"en",direction:"ltr",boxHtml:"<div class='wym_box'><div class='wym_area_top'>"+WYMeditor.TOOLS+"</div><div class='wym_area_left'></div><div class='wym_area_right'>"+WYMeditor.CONTAINERS+WYMeditor.CLASSES+"</div><div class='wym_area_main'>"+WYMeditor.HTML+WYMeditor.IFRAME+WYMeditor.STATUS+"</div><div class='wym_area_bottom'>"+WYMeditor.LOGO+"</div></div>",logoHtml:"<a class='wym_wymeditor_link' href='http://www.wymeditor.org/'>WYMeditor</a>",iframeHtml:"<div class='wym_iframe wym_section'><iframe src='"+WYMeditor.IFRAME_BASE_PATH+"wymiframe.html' onload='this.contentWindow.parent.WYMeditor.INSTANCES["+WYMeditor.INDEX+"].initIframe(this)'></iframe></div>",editorStyles:[],toolsHtml:"<div class='wym_tools wym_section'><h2>{Tools}</h2><ul>"+WYMeditor.TOOLS_ITEMS+"</ul></div>",toolsItemHtml:"<li class='"+WYMeditor.TOOL_CLASS+"'><a href='#' name='"+WYMeditor.TOOL_NAME+"' title='"+WYMeditor.TOOL_TITLE+"'>"+WYMeditor.TOOL_TITLE+"</a></li>",toolsItems:[{name:"Bold",title:"Strong",css:"wym_tools_strong"},{name:"Italic",title:"Emphasis",css:"wym_tools_emphasis"},{name:"Superscript",title:"Superscript",css:"wym_tools_superscript"},{name:"Subscript",title:"Subscript",css:"wym_tools_subscript"},{name:"InsertOrderedList",title:"Ordered_List",css:"wym_tools_ordered_list"},{name:"InsertUnorderedList",title:"Unordered_List",css:"wym_tools_unordered_list"},{name:"Indent",title:"Indent",css:"wym_tools_indent"},{name:"Outdent",title:"Outdent",css:"wym_tools_outdent"},{name:"Undo",title:"Undo",css:"wym_tools_undo"},{name:"Redo",title:"Redo",css:"wym_tools_redo"},{name:"CreateLink",title:"Link",css:"wym_tools_link"},{name:"Unlink",title:"Unlink",css:"wym_tools_unlink"},{name:"InsertImage",title:"Image",css:"wym_tools_image"},{name:"InsertTable",title:"Table",css:"wym_tools_table"},{name:"Paste",title:"Paste_From_Word",css:"wym_tools_paste"},{name:"ToggleHtml",title:"HTML",css:"wym_tools_html"},{name:"Preview",title:"Preview",css:"wym_tools_preview"}],containersHtml:"<div class='wym_containers wym_section'><h2>{Containers}</h2><ul>"+WYMeditor.CONTAINERS_ITEMS+"</ul></div>",containersItemHtml:"<li class='"+WYMeditor.CONTAINER_CLASS+"'><a href='#' name='"+WYMeditor.CONTAINER_NAME+"'>"+WYMeditor.CONTAINER_TITLE+"</a></li>",containersItems:[{name:"P",title:"Paragraph",css:"wym_containers_p"},{name:"H1",title:"Heading_1",css:"wym_containers_h1"},{name:"H2",title:"Heading_2",css:"wym_containers_h2"},{name:"H3",title:"Heading_3",css:"wym_containers_h3"},{name:"H4",title:"Heading_4",css:"wym_containers_h4"},{name:"H5",title:"Heading_5",css:"wym_containers_h5"},{name:"H6",title:"Heading_6",css:"wym_containers_h6"},{name:"PRE",title:"Preformatted",css:"wym_containers_pre"},{name:"BLOCKQUOTE",title:"Blockquote",css:"wym_containers_blockquote"},{name:"TH",title:"Table_Header",css:"wym_containers_th"}],classesHtml:"<div class='wym_classes wym_section'><h2>{Classes}</h2><ul>"+WYMeditor.CLASSES_ITEMS+"</ul></div>",classesItemHtml:"<li class='wym_classes_"+WYMeditor.CLASS_NAME+"'><a href='#' name='"+WYMeditor.CLASS_NAME+"'>"+WYMeditor.CLASS_TITLE+"</a></li>",classesItems:[],statusHtml:"<div class='wym_status wym_section'><h2>{Status}</h2></div>",htmlHtml:"<div class='wym_html wym_section'><h2>{Source_Code}</h2><textarea class='wym_html_val'></textarea></div>",boxSelector:".wym_box",toolsSelector:".wym_tools",toolsListSelector:" ul",containersSelector:".wym_containers",classesSelector:".wym_classes",htmlSelector:".wym_html",iframeSelector:".wym_iframe iframe",iframeBodySelector:".wym_iframe",statusSelector:".wym_status",toolSelector:".wym_tools a",containerSelector:".wym_containers a",classSelector:".wym_classes a",htmlValSelector:".wym_html_val",hrefSelector:".wym_href",srcSelector:".wym_src",titleSelector:".wym_title",altSelector:".wym_alt",textSelector:".wym_text",rowsSelector:".wym_rows",colsSelector:".wym_cols",captionSelector:".wym_caption",summarySelector:".wym_summary",submitSelector:".wym_submit",cancelSelector:".wym_cancel",previewSelector:"",dialogTypeSelector:".wym_dialog_type",dialogLinkSelector:".wym_dialog_link",dialogImageSelector:".wym_dialog_image",dialogTableSelector:".wym_dialog_table",dialogPasteSelector:".wym_dialog_paste",dialogPreviewSelector:".wym_dialog_preview",updateSelector:".wymupdate",updateEvent:"click",dialogFeatures:"menubar=no,titlebar=no,toolbar=no,resizable=no,width=560,height=300,top=0,left=0",dialogFeaturesPreview:"menubar=no,titlebar=no,toolbar=no,resizable=no,scrollbars=yes,width=560,height=300,top=0,left=0",dialogHtml:"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'><html dir='"+WYMeditor.DIRECTION+"'><head><link rel='stylesheet' type='text/css' media='screen' href='"+WYMeditor.CSS_PATH+"' /><title>"+WYMeditor.DIALOG_TITLE+"</title><script type='text/javascript' src='"+WYMeditor.JQUERY_PATH+"'><\/script><script type='text/javascript' src='"+WYMeditor.WYM_PATH+"'><\/script></head>"+WYMeditor.DIALOG_BODY+"</html>",dialogLinkHtml:"<body class='wym_dialog wym_dialog_link' onload='WYMeditor.INIT_DIALOG("+WYMeditor.INDEX+")'><form><fieldset><input type='hidden' class='wym_dialog_type' value='"+WYMeditor.DIALOG_LINK+"' /><legend>{Link}</legend><div class='row'><label>{URL}</label><input type='text' class='wym_href' value='' size='40' /></div><div class='row'><label>{Title}</label><input type='text' class='wym_title' value='' size='40' /></div><div class='row row-indent'><input class='wym_submit' type='button' value='{Submit}' /><input class='wym_cancel' type='button'value='{Cancel}' /></div></fieldset></form></body>",dialogImageHtml:"<body class='wym_dialog wym_dialog_image' onload='WYMeditor.INIT_DIALOG("+WYMeditor.INDEX+")'><form><fieldset><input type='hidden' class='wym_dialog_type' value='"+WYMeditor.DIALOG_IMAGE+"' /><legend>{Image}</legend><div class='row'><label>{URL}</label><input type='text' class='wym_src' value='' size='40' /></div><div class='row'><label>{Alternative_Text}</label><input type='text' class='wym_alt' value='' size='40' /></div><div class='row'><label>{Title}</label><input type='text' class='wym_title' value='' size='40' /></div><div class='row row-indent'><input class='wym_submit' type='button' value='{Submit}' /><input class='wym_cancel' type='button'value='{Cancel}' /></div></fieldset></form></body>",dialogTableHtml:"<body class='wym_dialog wym_dialog_table' onload='WYMeditor.INIT_DIALOG("+WYMeditor.INDEX+")'><form><fieldset><input type='hidden' class='wym_dialog_type' value='"+WYMeditor.DIALOG_TABLE+"' /><legend>{Table}</legend><div class='row'><label>{Caption}</label><input type='text' class='wym_caption' value='' size='40' /></div><div class='row'><label>{Summary}</label><input type='text' class='wym_summary' value='' size='40' /></div><div class='row'><label>{Number_Of_Rows}</label><input type='text' class='wym_rows' value='3' size='3' /></div><div class='row'><label>{Number_Of_Cols}</label><input type='text' class='wym_cols' value='2' size='3' /></div><div class='row row-indent'><input class='wym_submit' type='button' value='{Submit}' /><input class='wym_cancel' type='button'value='{Cancel}' /></div></fieldset></form></body>",dialogPasteHtml:"<body class='wym_dialog wym_dialog_paste' onload='WYMeditor.INIT_DIALOG("+WYMeditor.INDEX+")'><form><input type='hidden' class='wym_dialog_type' value='"+WYMeditor.DIALOG_PASTE+"' /><fieldset><legend>{Paste_From_Word}</legend><div class='row'><textarea class='wym_text' rows='10' cols='50'></textarea></div><div class='row'><input class='wym_submit' type='button' value='{Submit}' /><input class='wym_cancel' type='button'value='{Cancel}' /></div></fieldset></form></body>",dialogPreviewHtml:"<body class='wym_dialog wym_dialog_preview' onload='WYMeditor.INIT_DIALOG("+WYMeditor.INDEX+")'></body>",dialogStyles:[],stringDelimiterLeft:"{",stringDelimiterRight:"}",preInit:null,preBind:null,postInit:null,preInitDialog:null,postInitDialog:null},a);return this.each(function(){new WYMeditor.editor(jQuery(this),a)})};jQuery.extend({wymeditors:function(a){return(WYMeditor.INSTANCES[a])}});WYMeditor.editor.prototype.init=function(){if(jQuery.browser.msie){var WymClass=new WYMeditor.WymClassExplorer(this)}else{if(jQuery.browser.mozilla){var WymClass=new WYMeditor.WymClassMozilla(this)}else{if(jQuery.browser.opera){var WymClass=new WYMeditor.WymClassOpera(this)}else{if(jQuery.browser.safari){var WymClass=new WYMeditor.WymClassSafari(this)}}}}if(WymClass){if(jQuery.isFunction(this._options.preInit)){this._options.preInit(this)}var SaxListener=new WYMeditor.XhtmlSaxListener();jQuery.extend(SaxListener,WymClass);this.parser=new WYMeditor.XhtmlParser(SaxListener);if(this._options.styles||this._options.stylesheet){this.configureEditorUsingRawCss()}this.helper=new WYMeditor.XmlHelper();for(var prop in WymClass){this[prop]=WymClass[prop]}this._box=jQuery(this._element).hide().after(this._options.boxHtml).next().addClass("wym_box_"+this._index);if(jQuery.isFunction(jQuery.fn.data)){jQuery.data(this._box.get(0),WYMeditor.WYM_INDEX,this._index);jQuery.data(this._element.get(0),WYMeditor.WYM_INDEX,this._index)}var h=WYMeditor.Helper;var iframeHtml=this._options.iframeHtml;iframeHtml=h.replaceAll(iframeHtml,WYMeditor.INDEX,this._index);iframeHtml=h.replaceAll(iframeHtml,WYMeditor.IFRAME_BASE_PATH,this._options.iframeBasePath);var boxHtml=jQuery(this._box).html();boxHtml=h.replaceAll(boxHtml,WYMeditor.LOGO,this._options.logoHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.TOOLS,this._options.toolsHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.CONTAINERS,this._options.containersHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.CLASSES,this._options.classesHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.HTML,this._options.htmlHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.IFRAME,iframeHtml);boxHtml=h.replaceAll(boxHtml,WYMeditor.STATUS,this._options.statusHtml);var aTools=eval(this._options.toolsItems);var sTools="";for(var i=0;i<aTools.length;i++){var oTool=aTools[i];if(oTool.name&&oTool.title){var sTool=this._options.toolsItemHtml}var sTool=h.replaceAll(sTool,WYMeditor.TOOL_NAME,oTool.name);sTool=h.replaceAll(sTool,WYMeditor.TOOL_TITLE,this._options.stringDelimiterLeft+oTool.title+this._options.stringDelimiterRight);sTool=h.replaceAll(sTool,WYMeditor.TOOL_CLASS,oTool.css);sTools+=sTool}boxHtml=h.replaceAll(boxHtml,WYMeditor.TOOLS_ITEMS,sTools);var aClasses=eval(this._options.classesItems);var sClasses="";for(var i=0;i<aClasses.length;i++){var oClass=aClasses[i];if(oClass.name&&oClass.title){var sClass=this._options.classesItemHtml}sClass=h.replaceAll(sClass,WYMeditor.CLASS_NAME,oClass.name);sClass=h.replaceAll(sClass,WYMeditor.CLASS_TITLE,oClass.title);sClasses+=sClass}boxHtml=h.replaceAll(boxHtml,WYMeditor.CLASSES_ITEMS,sClasses);var aContainers=eval(this._options.containersItems);var sContainers="";for(var i=0;i<aContainers.length;i++){var oContainer=aContainers[i];if(oContainer.name&&oContainer.title){var sContainer=this._options.containersItemHtml}sContainer=h.replaceAll(sContainer,WYMeditor.CONTAINER_NAME,oContainer.name);sContainer=h.replaceAll(sContainer,WYMeditor.CONTAINER_TITLE,this._options.stringDelimiterLeft+oContainer.title+this._options.stringDelimiterRight);sContainer=h.replaceAll(sContainer,WYMeditor.CONTAINER_CLASS,oContainer.css);sContainers+=sContainer}boxHtml=h.replaceAll(boxHtml,WYMeditor.CONTAINERS_ITEMS,sContainers);boxHtml=this.replaceStrings(boxHtml);jQuery(this._box).html(boxHtml);jQuery(this._box).find(this._options.htmlSelector).hide();this.loadSkin()}};WYMeditor.editor.prototype.bindEvents=function(){var wym=this;jQuery(this._box).find(this._options.toolSelector).click(function(){wym._iframe.contentWindow.focus();wym.exec(jQuery(this).attr(WYMeditor.NAME));return(false)});jQuery(this._box).find(this._options.containerSelector).click(function(){wym.container(jQuery(this).attr(WYMeditor.NAME));return(false)});jQuery(this._box).find(this._options.htmlValSelector).keyup(function(){jQuery(wym._doc.body).html(jQuery(this).val())}).focus(function(){jQuery(this).toggleClass("hasfocus")}).blur(function(){jQuery(this).toggleClass("hasfocus")});jQuery(this._box).find(this._options.classSelector).click(function(){var aClasses=eval(wym._options.classesItems);var sName=jQuery(this).attr(WYMeditor.NAME);var oClass=WYMeditor.Helper.findByName(aClasses,sName);if(oClass){var jqexpr=oClass.expr;wym.toggleClass(sName,jqexpr)}wym._iframe.contentWindow.focus();return(false)});jQuery(this._options.updateSelector).bind(this._options.updateEvent,function(){wym.update()})};WYMeditor.editor.prototype.ready=function(){return(this._doc!=null)};WYMeditor.editor.prototype.box=function(){return(this._box)};WYMeditor.editor.prototype.html=function(a){if(typeof a==="string"){jQuery(this._doc.body).html(a)}else{return(jQuery(this._doc.body).html())}};WYMeditor.editor.prototype.xhtml=function(){return this.parser.parse(this.html())};WYMeditor.editor.prototype.exec=function(b){switch(b){case WYMeditor.CREATE_LINK:var a=this.container();if(a||this._selected_image){this.dialog(WYMeditor.DIALOG_LINK)}break;case WYMeditor.INSERT_IMAGE:this.dialog(WYMeditor.DIALOG_IMAGE);break;case WYMeditor.INSERT_TABLE:this.dialog(WYMeditor.DIALOG_TABLE);break;case WYMeditor.PASTE:this.dialog(WYMeditor.DIALOG_PASTE);break;case WYMeditor.TOGGLE_HTML:this.update();this.toggleHtml();break;case WYMeditor.PREVIEW:this.dialog(WYMeditor.PREVIEW,this._options.dialogFeaturesPreview);break;default:this._exec(b);break}};WYMeditor.editor.prototype.container=function(a){if(a){var d=null;if(a.toLowerCase()==WYMeditor.TH){d=this.container();switch(d.tagName.toLowerCase()){case WYMeditor.TD:case WYMeditor.TH:break;default:var e=new Array(WYMeditor.TD,WYMeditor.TH);d=this.findUp(this.container(),e);break}if(d!=null){a=(d.tagName.toLowerCase()==WYMeditor.TD)?WYMeditor.TH:WYMeditor.TD;this.switchTo(d,a);this.update()}}else{var e=new Array(WYMeditor.P,WYMeditor.H1,WYMeditor.H2,WYMeditor.H3,WYMeditor.H4,WYMeditor.H5,WYMeditor.H6,WYMeditor.PRE,WYMeditor.BLOCKQUOTE);d=this.findUp(this.container(),e);if(d){var i=null;if(a.toLowerCase()==WYMeditor.BLOCKQUOTE){var f=this.findUp(this.container(),WYMeditor.BLOCKQUOTE);if(f==null){i=this._doc.createElement(a);d.parentNode.insertBefore(i,d);i.appendChild(d);this.setFocusToNode(i.firstChild)}else{var c=f.childNodes;var g=c.length;var b=null;if(g>0){b=c.item(0)}for(var h=0;h<g;h++){f.parentNode.insertBefore(c.item(0),f)}f.parentNode.removeChild(f);if(b){this.setFocusToNode(b)}}}else{this.switchTo(d,a)}this.update()}}}else{return(this.selected())}};WYMeditor.editor.prototype.toggleClass=function(c,b){var a=(this._selected_image?this._selected_image:jQuery(this.selected()));a=jQuery(a).parentsOrSelf(b);jQuery(a).toggleClass(c);if(!jQuery(a).attr(WYMeditor.CLASS)){jQuery(a).removeAttr(this._class)}};WYMeditor.editor.prototype.findUp=function(d,c){if(d){var e=d.tagName.toLowerCase();if(typeof(c)==WYMeditor.STRING){while(e!=c&&e!=WYMeditor.BODY){d=d.parentNode;e=d.tagName.toLowerCase()}}else{var b=false;while(!b&&e!=WYMeditor.BODY){for(var a=0;a<c.length;a++){if(e==c[a]){b=true;break}}if(!b){d=d.parentNode;e=d.tagName.toLowerCase()}}}if(e!=WYMeditor.BODY){return(d)}else{return(null)}}else{return(null)}};WYMeditor.editor.prototype.switchTo=function(c,d){var b=this._doc.createElement(d);var a=jQuery(c).html();c.parentNode.replaceChild(b,c);jQuery(b).html(a);this.setFocusToNode(b)};WYMeditor.editor.prototype.replaceStrings=function(sVal){if(!WYMeditor.STRINGS[this._options.lang]){try{eval(jQuery.ajax({url:this._options.langPath+this._options.lang+".js",async:false}).responseText)}catch(e){WYMeditor.console.error("WYMeditor: error while parsing language file.");return sVal}}for(var key in WYMeditor.STRINGS[this._options.lang]){sVal=WYMeditor.Helper.replaceAll(sVal,this._options.stringDelimiterLeft+key+this._options.stringDelimiterRight,WYMeditor.STRINGS[this._options.lang][key])}return(sVal)};WYMeditor.editor.prototype.encloseString=function(a){return(this._options.stringDelimiterLeft+a+this._options.stringDelimiterRight)};WYMeditor.editor.prototype.status=function(a){jQuery(this._box).find(this._options.statusSelector).html(a)};WYMeditor.editor.prototype.update=function(){var a=this.xhtml();jQuery(this._element).val(a);jQuery(this._box).find(this._options.htmlValSelector).not(".hasfocus").val(a)};WYMeditor.editor.prototype.dialog=function(j,c,f){var a=c||this._wym._options.dialogFeatures;var d=window.open("","dialog",a);if(d){var b="";switch(j){case (WYMeditor.DIALOG_LINK):b=this._options.dialogLinkHtml;break;case (WYMeditor.DIALOG_IMAGE):b=this._options.dialogImageHtml;break;case (WYMeditor.DIALOG_TABLE):b=this._options.dialogTableHtml;break;case (WYMeditor.DIALOG_PASTE):b=this._options.dialogPasteHtml;break;case (WYMeditor.PREVIEW):b=this._options.dialogPreviewHtml;break;default:b=f}var e=WYMeditor.Helper;var g=this._options.dialogHtml;g=e.replaceAll(g,WYMeditor.BASE_PATH,this._options.basePath);g=e.replaceAll(g,WYMeditor.DIRECTION,this._options.direction);g=e.replaceAll(g,WYMeditor.CSS_PATH,this._options.skinPath+WYMeditor.SKINS_DEFAULT_CSS);g=e.replaceAll(g,WYMeditor.WYM_PATH,this._options.wymPath);g=e.replaceAll(g,WYMeditor.JQUERY_PATH,this._options.jQueryPath);g=e.replaceAll(g,WYMeditor.DIALOG_TITLE,this.encloseString(j));g=e.replaceAll(g,WYMeditor.DIALOG_BODY,b);g=e.replaceAll(g,WYMeditor.INDEX,this._index);g=this.replaceStrings(g);var i=d.document;i.write(g);i.close()}};WYMeditor.editor.prototype.toggleHtml=function(){jQuery(this._box).find(this._options.htmlSelector).toggle()};WYMeditor.editor.prototype.uniqueStamp=function(){var a=new Date();return("wym-"+a.getTime())};WYMeditor.editor.prototype.paste=function(b){var e;var a=this.selected();var c=b.split(this._newLine+this._newLine);var d=new RegExp(this._newLine,"g");if(a&&a.tagName.toLowerCase()!=WYMeditor.BODY){for(x=c.length-1;x>=0;x--){e=c[x];e=e.replace(d,"<br />");jQuery(a).after("<p>"+e+"</p>")}}else{for(x=0;x<c.length;x++){e=c[x];e=e.replace(d,"<br />");jQuery(this._doc.body).append("<p>"+e+"</p>")}}};WYMeditor.editor.prototype.insert=function(a){if(this._iframe.contentWindow.getSelection().focusNode!=null){this._exec(WYMeditor.INSERT_HTML,a)}else{this.paste(a)}};WYMeditor.editor.prototype.wrap=function(b,a){if(this._iframe.contentWindow.getSelection().focusNode!=null){this._exec(WYMeditor.INSERT_HTML,b+this._iframe.contentWindow.getSelection().toString()+a)}};WYMeditor.editor.prototype.unwrap=function(){if(this._iframe.contentWindow.getSelection().focusNode!=null){this._exec(WYMeditor.INSERT_HTML,this._iframe.contentWindow.getSelection().toString())}};WYMeditor.editor.prototype.setFocusToNode=function(d,b){var a=this._doc.createRange(),c=this._iframe.contentWindow.getSelection();b=b?0:1;a.selectNodeContents(d);c.addRange(a);c.collapse(d,b);this._iframe.contentWindow.focus()};WYMeditor.editor.prototype.addCssRules=function(e,c){var b=e.styleSheets[0];if(b){for(var a=0;a<c.length;a++){var d=c[a];if(d.name&&d.css){this.addCssRule(b,d)}}}};WYMeditor.editor.prototype.computeBasePath=function(){return jQuery(jQuery.grep(jQuery("script"),function(a){return(a.src&&a.src.match(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/))})).attr("src").replace(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/,"")};WYMeditor.editor.prototype.computeWymPath=function(){return jQuery(jQuery.grep(jQuery("script"),function(a){return(a.src&&a.src.match(/jquery\.wymeditor(\.pack|\.min|\.packed)?\.js(\?.*)?$/))})).attr("src")};WYMeditor.editor.prototype.computeJqueryPath=function(){return jQuery(jQuery.grep(jQuery("script"),function(a){return(a.src&&a.src.match(/jquery(-(.*)){0,1}(\.pack|\.min|\.packed)?\.js(\?.*)?$/))})).attr("src")};WYMeditor.editor.prototype.computeCssPath=function(){return jQuery(jQuery.grep(jQuery("link"),function(a){return(a.href&&a.href.match(/wymeditor\/skins\/(.*)screen\.css(\?.*)?$/))})).attr("href")};WYMeditor.editor.prototype.configureEditorUsingRawCss=function(){var a=new WYMeditor.WymCssParser();if(this._options.stylesheet){a.parse(jQuery.ajax({url:this._options.stylesheet,async:false}).responseText)}else{a.parse(this._options.styles,false)}if(this._options.classesItems.length==0){this._options.classesItems=a.css_settings.classesItems}if(this._options.editorStyles.length==0){this._options.editorStyles=a.css_settings.editorStyles}if(this._options.dialogStyles.length==0){this._options.dialogStyles=a.css_settings.dialogStyles}};WYMeditor.editor.prototype.listen=function(){jQuery(this._doc.body).bind("mousedown",this.mousedown)};WYMeditor.editor.prototype.mousedown=function(a){var b=WYMeditor.INSTANCES[this.ownerDocument.title];b._selected_image=(a.target.tagName.toLowerCase()==WYMeditor.IMG)?a.target:null};WYMeditor.loadCss=function(a){var c=document.createElement("link");c.rel="stylesheet";c.href=a;var b=jQuery("head").get(0);b.appendChild(c)};WYMeditor.editor.prototype.loadSkin=function(){if(this._options.loadSkin&&!WYMeditor.SKINS[this._options.skin]){var found=false;var rExp=new RegExp(this._options.skin+"/"+WYMeditor.SKINS_DEFAULT_CSS+"$");jQuery("link").each(function(){if(this.href.match(rExp)){found=true}});if(!found){WYMeditor.loadCss(this._options.skinPath+WYMeditor.SKINS_DEFAULT_CSS)}}jQuery(this._box).addClass("wym_skin_"+this._options.skin);if(this._options.initSkin&&!WYMeditor.SKINS[this._options.skin]){eval(jQuery.ajax({url:this._options.skinPath+WYMeditor.SKINS_DEFAULT_JS,async:false}).responseText)}if(WYMeditor.SKINS[this._options.skin]&&WYMeditor.SKINS[this._options.skin].init){WYMeditor.SKINS[this._options.skin].init(this)}};WYMeditor.INIT_DIALOG=function(index){var wym=window.opener.WYMeditor.INSTANCES[index];var doc=window.document;var selected=wym.selected();var dialogType=jQuery(wym._options.dialogTypeSelector).val();var sStamp=wym.uniqueStamp();switch(dialogType){case WYMeditor.DIALOG_LINK:if(selected&&selected.tagName&&selected.tagName.toLowerCase!=WYMeditor.A){selected=jQuery(selected).parentsOrSelf(WYMeditor.A)}if(!selected&&wym._selected_image){selected=jQuery(wym._selected_image).parentsOrSelf(WYMeditor.A)}break}if(jQuery.isFunction(wym._options.preInitDialog)){wym._options.preInitDialog(wym,window)}var styles=doc.styleSheets[0];var aCss=eval(wym._options.dialogStyles);wym.addCssRules(doc,aCss);if(selected){jQuery(wym._options.hrefSelector).val(jQuery(selected).attr(WYMeditor.HREF));jQuery(wym._options.srcSelector).val(jQuery(selected).attr(WYMeditor.SRC));jQuery(wym._options.titleSelector).val(jQuery(selected).attr(WYMeditor.TITLE));jQuery(wym._options.altSelector).val(jQuery(selected).attr(WYMeditor.ALT))}if(wym._selected_image){jQuery(wym._options.dialogImageSelector+" "+wym._options.srcSelector).val(jQuery(wym._selected_image).attr(WYMeditor.SRC));jQuery(wym._options.dialogImageSelector+" "+wym._options.titleSelector).val(jQuery(wym._selected_image).attr(WYMeditor.TITLE));jQuery(wym._options.dialogImageSelector+" "+wym._options.altSelector).val(jQuery(wym._selected_image).attr(WYMeditor.ALT))}jQuery(wym._options.dialogLinkSelector+" "+wym._options.submitSelector).click(function(){var sUrl=jQuery(wym._options.hrefSelector).val();if(sUrl.length>0){var link;if(selected[0]&&selected[0].tagName.toLowerCase()==WYMeditor.A){link=selected}else{wym._exec(WYMeditor.CREATE_LINK,sStamp);link=jQuery("a[href="+sStamp+"]",wym._doc.body)}link.attr(WYMeditor.HREF,sUrl).attr(WYMeditor.TITLE,jQuery(wym._options.titleSelector).val())}window.close()});jQuery(wym._options.dialogImageSelector+" "+wym._options.submitSelector).click(function(){var sUrl=jQuery(wym._options.srcSelector).val();if(sUrl.length>0){wym._exec(WYMeditor.INSERT_IMAGE,sStamp);jQuery("img[src$="+sStamp+"]",wym._doc.body).attr(WYMeditor.SRC,sUrl).attr(WYMeditor.TITLE,jQuery(wym._options.titleSelector).val()).attr(WYMeditor.ALT,jQuery(wym._options.altSelector).val())}window.close()});jQuery(wym._options.dialogTableSelector+" "+wym._options.submitSelector).click(function(){var iRows=jQuery(wym._options.rowsSelector).val();var iCols=jQuery(wym._options.colsSelector).val();if(iRows>0&&iCols>0){var table=wym._doc.createElement(WYMeditor.TABLE);var newRow=null;var newCol=null;var sCaption=jQuery(wym._options.captionSelector).val();var newCaption=table.createCaption();newCaption.innerHTML=sCaption;for(x=0;x<iRows;x++){newRow=table.insertRow(x);for(y=0;y<iCols;y++){newRow.insertCell(y)}}jQuery(table).attr("summary",jQuery(wym._options.summarySelector).val());var node=jQuery(wym.findUp(wym.container(),WYMeditor.MAIN_CONTAINERS)).get(0);if(!node||!node.parentNode){jQuery(wym._doc.body).append(table)}else{jQuery(node).after(table)}}window.close()});jQuery(wym._options.dialogPasteSelector+" "+wym._options.submitSelector).click(function(){var sText=jQuery(wym._options.textSelector).val();wym.paste(sText);window.close()});jQuery(wym._options.dialogPreviewSelector+" "+wym._options.previewSelector).html(wym.xhtml());jQuery(wym._options.cancelSelector).mousedown(function(){window.close()});if(jQuery.isFunction(wym._options.postInitDialog)){wym._options.postInitDialog(wym,window)}};WYMeditor.XmlHelper=function(){this._entitiesDiv=document.createElement("div");return this};WYMeditor.XmlHelper.prototype.tag=function(c,b,a){b=b||false;a=a||false;return"<"+c+(b?this.tagOptions(b):"")+(a?">":" />")};WYMeditor.XmlHelper.prototype.contentTag=function(b,c,a){a=a||false;return"<"+b+(a?this.tagOptions(a):"")+">"+c+"</"+b+">"};WYMeditor.XmlHelper.prototype.cdataSection=function(a){return"<![CDATA["+a+"]]>"};WYMeditor.XmlHelper.prototype.escapeOnce=function(a){return this._fixDoubleEscape(this.escapeEntities(a))};WYMeditor.XmlHelper.prototype._fixDoubleEscape=function(a){return a.replace(/&amp;([a-z]+|(#\d+));/ig,"&$1;")};WYMeditor.XmlHelper.prototype.tagOptions=function(b){var a=this;a._formated_options="";for(var c in b){var d="";var e=b[c];if(typeof e!="function"&&e.length>0){if(parseInt(c)==c&&typeof e=="object"){c=e.shift();e=e.pop()}if(c!=""&&e!=""){a._formated_options+=" "+c+'="'+a.escapeOnce(e)+'"'}}}return a._formated_options};WYMeditor.XmlHelper.prototype.escapeEntities=function(c,b){this._entitiesDiv.innerHTML=c;this._entitiesDiv.textContent=c;var a=this._entitiesDiv.innerHTML;if(typeof b=="undefined"){if(b!=false){a=a.replace('"',"&quot;")}if(b==true){a=a.replace('"',"&#039;")}}return a};WYMeditor.XmlHelper.prototype.parseAttributes=function(h){var a=[];var g=h.split(/((=\s*")(")("))|((=\s*\')(\')(\'))|((=\s*[^>\s]*))/g);if(g.toString()!=h){for(var d in g){var c=g[d];if(typeof c!="function"&&c.length!=0){var e=new RegExp("(\\w+)\\s*"+c);if(match=h.match(e)){var f=c.replace(/^[\s=]+/,"");var b=f.charAt(0);b=b=='"'?'"':(b=="'"?"'":"");if(b!=""){f=b=='"'?f.replace(/^"|"+$/g,""):f.replace(/^'|'+$/g,"")}h=h.replace(match[0],"");a.push([match[1],f])}}}}return a};WYMeditor.XhtmlValidator={_attributes:{core:{except:["base","head","html","meta","param","script","style","title"],attributes:["class","id","style","title","accesskey","tabindex"]},language:{except:["base","br","hr","iframe","param","script"],attributes:{dir:["ltr","rtl"],"0":"lang","1":"xml:lang"}},keyboard:{attributes:{accesskey:/^(\w){1}$/,tabindex:/^(\d)+$/}}},_events:{window:{only:["body"],attributes:["onload","onunload"]},form:{only:["form","input","textarea","select","a","label","button"],attributes:["onchange","onsubmit","onreset","onselect","onblur","onfocus"]},keyboard:{except:["base","bdo","br","frame","frameset","head","html","iframe","meta","param","script","style","title"],attributes:["onkeydown","onkeypress","onkeyup"]},mouse:{except:["base","bdo","br","head","html","meta","param","script","style","title"],attributes:["onclick","ondblclick","onmousedown","onmousemove","onmouseover","onmouseout","onmouseup"]}},_tags:{a:{attributes:{"0":"charset","1":"coords","2":"href","3":"hreflang","4":"name",rel:/^(alternate|designates|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark| |shortcut|icon)+$/,rev:/^(alternate|designates|stylesheet|start|next|prev|contents|index|glossary|copyright|chapter|section|subsection|appendix|help|bookmark| |shortcut|icon)+$/,shape:/^(rect|rectangle|circ|circle|poly|polygon)$/,"5":"type"}},"0":"abbr","1":"acronym","2":"address",area:{attributes:{"0":"alt","1":"coords","2":"href",nohref:/^(true|false)$/,shape:/^(rect|rectangle|circ|circle|poly|polygon)$/},required:["alt"]},"3":"b",base:{attributes:["href"],required:["href"]},bdo:{attributes:{dir:/^(ltr|rtl)$/},required:["dir"]},"4":"big",blockquote:{attributes:["cite"]},"5":"body","6":"br",button:{attributes:{disabled:/^(disabled)$/,type:/^(button|reset|submit)$/,"0":"value"},inside:"form"},"7":"caption","8":"cite","9":"code",col:{attributes:{align:/^(right|left|center|justify)$/,"0":"char","1":"charoff",span:/^(\d)+$/,valign:/^(top|middle|bottom|baseline)$/,"2":"width"},inside:"colgroup"},colgroup:{attributes:{align:/^(right|left|center|justify)$/,"0":"char","1":"charoff",span:/^(\d)+$/,valign:/^(top|middle|bottom|baseline)$/,"2":"width"}},"10":"dd",del:{attributes:{"0":"cite",datetime:/^([0-9]){8}/}},"11":"div","12":"dfn","13":"dl","14":"dt","15":"em",fieldset:{inside:"form"},form:{attributes:{"0":"action","1":"accept","2":"accept-charset","3":"enctype",method:/^(get|post)$/},required:["action"]},head:{attributes:["profile"]},"16":"h1","17":"h2","18":"h3","19":"h4","20":"h5","21":"h6","22":"hr",html:{attributes:["xmlns"]},"23":"i",img:{attributes:["alt","src","height","ismap","longdesc","usemap","width"],required:["alt","src"]},input:{attributes:{"0":"accept","1":"alt",checked:/^(checked)$/,disabled:/^(disabled)$/,maxlength:/^(\d)+$/,"2":"name",readonly:/^(readonly)$/,size:/^(\d)+$/,"3":"src",type:/^(button|checkbox|file|hidden|image|password|radio|reset|submit|text)$/,"4":"value"},inside:"form"},ins:{attributes:{"0":"cite",datetime:/^([0-9]){8}/}},"24":"kbd",label:{attributes:["for"],inside:"form"},"25":"legend","26":"li",link:{attributes:{"0":"charset","1":"href","2":"hreflang",media:/^(all|braille|print|projection|screen|speech|,|;| )+$/i,rel:/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i,rev:/^(alternate|appendix|bookmark|chapter|contents|copyright|glossary|help|home|index|next|prev|section|start|stylesheet|subsection| |shortcut|icon)+$/i,"3":"type"},inside:"head"},map:{attributes:["id","name"],required:["id"]},meta:{attributes:{"0":"content","http-equiv":/^(content\-type|expires|refresh|set\-cookie)$/i,"1":"name","2":"scheme"},required:["content"]},"27":"noscript",object:{attributes:["archive","classid","codebase","codetype","data","declare","height","name","standby","type","usemap","width"]},"28":"ol",optgroup:{attributes:{"0":"label",disabled:/^(disabled)$/},required:["label"]},option:{attributes:{"0":"label",disabled:/^(disabled)$/,selected:/^(selected)$/,"1":"value"},inside:"select"},"29":"p",param:{attributes:{"0":"type",valuetype:/^(data|ref|object)$/,"1":"valuetype","2":"value"},required:["name"]},"30":"pre",q:{attributes:["cite"]},"31":"samp",script:{attributes:{type:/^(text\/ecmascript|text\/javascript|text\/jscript|text\/vbscript|text\/vbs|text\/xml)$/,"0":"charset",defer:/^(defer)$/,"1":"src"},required:["type"]},select:{attributes:{disabled:/^(disabled)$/,multiple:/^(multiple)$/,"0":"name","1":"size"},inside:"form"},"32":"small","33":"span","34":"strong",style:{attributes:{"0":"type",media:/^(screen|tty|tv|projection|handheld|print|braille|aural|all)$/},required:["type"]},"35":"sub","36":"sup",table:{attributes:{"0":"border","1":"cellpadding","2":"cellspacing",frame:/^(void|above|below|hsides|lhs|rhs|vsides|box|border)$/,rules:/^(none|groups|rows|cols|all)$/,"3":"summary","4":"width"}},tbody:{attributes:{align:/^(right|left|center|justify)$/,"0":"char","1":"charoff",valign:/^(top|middle|bottom|baseline)$/}},td:{attributes:{"0":"abbr",align:/^(left|right|center|justify|char)$/,"1":"axis","2":"char","3":"charoff",colspan:/^(\d)+$/,"4":"headers",rowspan:/^(\d)+$/,scope:/^(col|colgroup|row|rowgroup)$/,valign:/^(top|middle|bottom|baseline)$/}},textarea:{attributes:["cols","rows","disabled","name","readonly"],required:["cols","rows"],inside:"form"},tfoot:{attributes:{align:/^(right|left|center|justify)$/,"0":"char","1":"charoff",valign:/^(top|middle|bottom)$/,"2":"baseline"}},th:{attributes:{"0":"abbr",align:/^(left|right|center|justify|char)$/,"1":"axis","2":"char","3":"charoff",colspan:/^(\d)+$/,"4":"headers",rowspan:/^(\d)+$/,scope:/^(col|colgroup|row|rowgroup)$/,valign:/^(top|middle|bottom|baseline)$/}},thead:{attributes:{align:/^(right|left|center|justify)$/,"0":"char","1":"charoff",valign:/^(top|middle|bottom|baseline)$/}},"37":"title",tr:{attributes:{align:/^(right|left|center|justify|char)$/,"0":"char","1":"charoff",valign:/^(top|middle|bottom|baseline)$/}},"38":"tt","39":"ul","40":"var"},skiped_attributes:[],skiped_attribute_values:[],getValidTagAttributes:function(a,b){var c={};var g=this.getPossibleTagAttributes(a);for(var e in b){var f=b[e];var d=WYMeditor.Helper;if(!d.contains(this.skiped_attributes,e)&&!d.contains(this.skiped_attribute_values,f)){if(typeof f!="function"&&d.contains(g,e)){if(this.doesAttributeNeedsValidation(a,e)){if(this.validateAttribute(a,e,f)){c[e]=f}}else{c[e]=f}}}}return c},getUniqueAttributesAndEventsForTag:function(b){var a=[];if(this._tags[b]&&this._tags[b]["attributes"]){for(k in this._tags[b]["attributes"]){a.push(parseInt(k)==k?this._tags[b]["attributes"][k]:k)}}return a},getDefaultAttributesAndEventsForTags:function(){var a=[];for(var b in this._events){a.push(this._events[b])}for(var b in this._attributes){a.push(this._attributes[b])}return a},isValidTag:function(a){if(this._tags[a]){return true}for(var b in this._tags){if(this._tags[b]==a){return true}}return false},getDefaultAttributesAndEventsForTag:function(a){var i=[];if(this.isValidTag(a)){var g=this.getDefaultAttributesAndEventsForTags();for(var d in g){var f=g[d];if(typeof f=="object"){var e=WYMeditor.Helper;if((f.except&&e.contains(f.except,a))||(f.only&&!e.contains(f.only,a))){continue}var c=f.attributes?f.attributes:f.events;for(var b in c){i.push(typeof c[b]!="string"?b:c[b])}}}}return i},doesAttributeNeedsValidation:function(a,b){return this._tags[a]&&((this._tags[a]["attributes"]&&this._tags[a]["attributes"][b])||(this._tags[a]["required"]&&WYMeditor.Helper.contains(this._tags[a]["required"],b)))},validateAttribute:function(a,b,c){if(this._tags[a]&&(this._tags[a]["attributes"]&&this._tags[a]["attributes"][b]&&c.length>0&&!c.match(this._tags[a]["attributes"][b]))||(this._tags[a]&&this._tags[a]["required"]&&WYMeditor.Helper.contains(this._tags[a]["required"],b)&&c.length==0)){return false}return typeof this._tags[a]!="undefined"},getPossibleTagAttributes:function(a){if(!this._possible_tag_attributes){this._possible_tag_attributes={}}if(!this._possible_tag_attributes[a]){this._possible_tag_attributes[a]=this.getUniqueAttributesAndEventsForTag(a).concat(this.getDefaultAttributesAndEventsForTag(a))}return this._possible_tag_attributes[a]}};WYMeditor.ParallelRegex=function(a){this._case=a;this._patterns=[];this._labels=[];this._regex=null;return this};WYMeditor.ParallelRegex.prototype.addPattern=function(c,a){a=a||true;var b=this._patterns.length;this._patterns[b]=c;this._labels[b]=a;this._regex=null};WYMeditor.ParallelRegex.prototype.match=function(c){if(this._patterns.length==0){return[false,""]}var d=c.match(this._getCompoundedRegex());if(!d){return[false,""]}var a=d[0];for(var b=1;b<d.length;b++){if(d[b]){return[this._labels[b-1],a]}}return[true,d[0]]};WYMeditor.ParallelRegex.prototype._getCompoundedRegex=function(){if(this._regex==null){for(var a=0,b=this._patterns.length;a<b;a++){this._patterns[a]="("+this._untokenizeRegex(this._tokenizeRegex(this._patterns[a]).replace(/([\/\(\)])/g,"\\$1"))+")"}this._regex=new RegExp(this._patterns.join("|"),this._getPerlMatchingFlags())}return this._regex};WYMeditor.ParallelRegex.prototype._tokenizeRegex=function(a){return a.replace(/\(\?(i|m|s|x|U)\)/,"~~~~~~Tk1$1~~~~~~").replace(/\(\?(\-[i|m|s|x|U])\)/,"~~~~~~Tk2$1~~~~~~").replace(/\(\?\=(.*)\)/,"~~~~~~Tk3$1~~~~~~").replace(/\(\?\!(.*)\)/,"~~~~~~Tk4$1~~~~~~").replace(/\(\?\<\=(.*)\)/,"~~~~~~Tk5$1~~~~~~").replace(/\(\?\<\!(.*)\)/,"~~~~~~Tk6$1~~~~~~").replace(/\(\?\:(.*)\)/,"~~~~~~Tk7$1~~~~~~")};WYMeditor.ParallelRegex.prototype._untokenizeRegex=function(a){return a.replace(/~~~~~~Tk1(.{1})~~~~~~/,"(?$1)").replace(/~~~~~~Tk2(.{2})~~~~~~/,"(?$1)").replace(/~~~~~~Tk3(.*)~~~~~~/,"(?=$1)").replace(/~~~~~~Tk4(.*)~~~~~~/,"(?!$1)").replace(/~~~~~~Tk5(.*)~~~~~~/,"(?<=$1)").replace(/~~~~~~Tk6(.*)~~~~~~/,"(?<!$1)").replace(/~~~~~~Tk7(.*)~~~~~~/,"(?:$1)")};WYMeditor.ParallelRegex.prototype._getPerlMatchingFlags=function(){return(this._case?"m":"mi")};WYMeditor.StateStack=function(a){this._stack=[a];return this};WYMeditor.StateStack.prototype.getCurrent=function(){return this._stack[this._stack.length-1]};WYMeditor.StateStack.prototype.enter=function(a){this._stack.push(a)};WYMeditor.StateStack.prototype.leave=function(){if(this._stack.length==1){return false}this._stack.pop();return true};WYMeditor.LEXER_ENTER=1;WYMeditor.LEXER_MATCHED=2;WYMeditor.LEXER_UNMATCHED=3;WYMeditor.LEXER_EXIT=4;WYMeditor.LEXER_SPECIAL=5;WYMeditor.Lexer=function(c,b,a){b=b||"accept";this._case=a||false;this._regexes={};this._parser=c;this._mode=new WYMeditor.StateStack(b);this._mode_handlers={};this._mode_handlers[b]=b;return this};WYMeditor.Lexer.prototype.addPattern=function(a,b){var b=b||"accept";if(typeof this._regexes[b]=="undefined"){this._regexes[b]=new WYMeditor.ParallelRegex(this._case)}this._regexes[b].addPattern(a);if(typeof this._mode_handlers[b]=="undefined"){this._mode_handlers[b]=b}};WYMeditor.Lexer.prototype.addEntryPattern=function(b,c,a){if(typeof this._regexes[c]=="undefined"){this._regexes[c]=new WYMeditor.ParallelRegex(this._case)}this._regexes[c].addPattern(b,a);if(typeof this._mode_handlers[a]=="undefined"){this._mode_handlers[a]=a}};WYMeditor.Lexer.prototype.addExitPattern=function(a,b){if(typeof this._regexes[b]=="undefined"){this._regexes[b]=new WYMeditor.ParallelRegex(this._case)}this._regexes[b].addPattern(a,"__exit");if(typeof this._mode_handlers[b]=="undefined"){this._mode_handlers[b]=b}};WYMeditor.Lexer.prototype.addSpecialPattern=function(b,c,a){if(typeof this._regexes[c]=="undefined"){this._regexes[c]=new WYMeditor.ParallelRegex(this._case)}this._regexes[c].addPattern(b,"_"+a);if(typeof this._mode_handlers[a]=="undefined"){this._mode_handlers[a]=a}};WYMeditor.Lexer.prototype.mapHandler=function(b,a){this._mode_handlers[b]=a};WYMeditor.Lexer.prototype.parse=function(d){if(typeof this._parser=="undefined"){return false}var e=d.length;var c;while(typeof(c=this._reduce(d))=="object"){var d=c[0];var b=c[1];var a=c[2];var f=c[3];if(!this._dispatchTokens(b,a,f)){return false}if(d==""){return true}if(d.length==e){return false}e=d.length}if(!c){return false}return this._invokeParser(d,WYMeditor.LEXER_UNMATCHED)};WYMeditor.Lexer.prototype._dispatchTokens=function(b,a,c){c=c||false;if(!this._invokeParser(b,WYMeditor.LEXER_UNMATCHED)){return false}if(typeof c=="boolean"){return this._invokeParser(a,WYMeditor.LEXER_MATCHED)}if(this._isModeEnd(c)){if(!this._invokeParser(a,WYMeditor.LEXER_EXIT)){return false}return this._mode.leave()}if(this._isSpecialMode(c)){this._mode.enter(this._decodeSpecial(c));if(!this._invokeParser(a,WYMeditor.LEXER_SPECIAL)){return false}return this._mode.leave()}this._mode.enter(c);return this._invokeParser(a,WYMeditor.LEXER_ENTER)};WYMeditor.Lexer.prototype._isModeEnd=function(a){return(a==="__exit")};WYMeditor.Lexer.prototype._isSpecialMode=function(a){return(a.substring(0,1)=="_")};WYMeditor.Lexer.prototype._decodeSpecial=function(a){return a.substring(1)};WYMeditor.Lexer.prototype._invokeParser=function(content,is_match){if(content===""){return true}var current=this._mode.getCurrent();var handler=this._mode_handlers[current];var result;eval("result = this._parser."+handler+"(content, is_match);");return result};WYMeditor.Lexer.prototype._reduce=function(c){var a=this._regexes[this._mode.getCurrent()].match(c);var b=a[1];var e=a[0];if(e){var f=c.indexOf(b);var d=c.substr(0,f);c=c.substring(f+b.length);return[c,d,b,e]}return true};WYMeditor.XhtmlLexer=function(a){jQuery.extend(this,new WYMeditor.Lexer(a,"Text"));this.mapHandler("Text","Text");this.addTokens();this.init();return this};WYMeditor.XhtmlLexer.prototype.init=function(){};WYMeditor.XhtmlLexer.prototype.addTokens=function(){this.addCommentTokens("Text");this.addScriptTokens("Text");this.addCssTokens("Text");this.addTagTokens("Text")};WYMeditor.XhtmlLexer.prototype.addCommentTokens=function(a){this.addEntryPattern("<!--",a,"Comment");this.addExitPattern("-->","Comment")};WYMeditor.XhtmlLexer.prototype.addScriptTokens=function(a){this.addEntryPattern("<script",a,"Script");this.addExitPattern("<\/script>","Script")};WYMeditor.XhtmlLexer.prototype.addCssTokens=function(a){this.addEntryPattern("<style",a,"Css");this.addExitPattern("</style>","Css")};WYMeditor.XhtmlLexer.prototype.addTagTokens=function(a){this.addSpecialPattern("<\\s*[a-z0-9:-]+\\s*>",a,"OpeningTag");this.addEntryPattern("<[a-z0-9:-]+[\\/ \\>]+",a,"OpeningTag");this.addInTagDeclarationTokens("OpeningTag");this.addSpecialPattern("</\\s*[a-z0-9:-]+\\s*>",a,"ClosingTag")};WYMeditor.XhtmlLexer.prototype.addInTagDeclarationTokens=function(a){this.addSpecialPattern("\\s+",a,"Ignore");this.addAttributeTokens(a);this.addExitPattern("/>",a);this.addExitPattern(">",a)};WYMeditor.XhtmlLexer.prototype.addAttributeTokens=function(a){this.addSpecialPattern("\\s*[a-z-_0-9]*:?[a-z-_0-9]+\\s*(?==)\\s*",a,"TagAttributes");this.addEntryPattern('=\\s*"',a,"DoubleQuotedAttribute");this.addPattern('\\\\"',"DoubleQuotedAttribute");this.addExitPattern('"',"DoubleQuotedAttribute");this.addEntryPattern("=\\s*'",a,"SingleQuotedAttribute");this.addPattern("\\\\'","SingleQuotedAttribute");this.addExitPattern("'","SingleQuotedAttribute");this.addSpecialPattern("=\\s*[^>\\s]*",a,"UnquotedAttribute")};WYMeditor.XhtmlParser=function(a,b){var b=b||"Text";this._Lexer=new WYMeditor.XhtmlLexer(this);this._Listener=a;this._mode=b;this._matches=[];this._last_match="";this._current_match="";return this};WYMeditor.XhtmlParser.prototype.parse=function(a){this._Lexer.parse(this.beforeParsing(a));return this.afterParsing(this._Listener.getResult())};WYMeditor.XhtmlParser.prototype.beforeParsing=function(a){if(a.match(/class="MsoNormal"/)||a.match(/ns = "urn:schemas-microsoft-com/)){this._Listener.avoidStylingTagsAndAttributes()}return this._Listener.beforeParsing(a)};WYMeditor.XhtmlParser.prototype.afterParsing=function(a){if(this._Listener._avoiding_tags_implicitly){this._Listener.allowStylingTagsAndAttributes()}return this._Listener.afterParsing(a)};WYMeditor.XhtmlParser.prototype.Ignore=function(a,b){return true};WYMeditor.XhtmlParser.prototype.Text=function(a){this._Listener.addContent(a);return true};WYMeditor.XhtmlParser.prototype.Comment=function(b,a){return this._addNonTagBlock(b,a,"addComment")};WYMeditor.XhtmlParser.prototype.Script=function(b,a){return this._addNonTagBlock(b,a,"addScript")};WYMeditor.XhtmlParser.prototype.Css=function(b,a){return this._addNonTagBlock(b,a,"addCss")};WYMeditor.XhtmlParser.prototype._addNonTagBlock=function(a,c,b){switch(c){case WYMeditor.LEXER_ENTER:this._non_tag=a;break;case WYMeditor.LEXER_UNMATCHED:this._non_tag+=a;break;case WYMeditor.LEXER_EXIT:switch(b){case"addComment":this._Listener.addComment(this._non_tag+a);break;case"addScript":this._Listener.addScript(this._non_tag+a);break;case"addCss":this._Listener.addCss(this._non_tag+a);break}}return true};WYMeditor.XhtmlParser.prototype.OpeningTag=function(a,b){switch(b){case WYMeditor.LEXER_ENTER:this._tag=this.normalizeTag(a);this._tag_attributes={};break;case WYMeditor.LEXER_SPECIAL:this._callOpenTagListener(this.normalizeTag(a));break;case WYMeditor.LEXER_EXIT:this._callOpenTagListener(this._tag,this._tag_attributes)}return true};WYMeditor.XhtmlParser.prototype.ClosingTag=function(a,b){this._callCloseTagListener(this.normalizeTag(a));return true};WYMeditor.XhtmlParser.prototype._callOpenTagListener=function(a,b){var b=b||{};this.autoCloseUnclosedBeforeNewOpening(a);if(this._Listener.isBlockTag(a)){this._Listener._tag_stack.push(a);this._Listener.fixNestingBeforeOpeningBlockTag(a,b);this._Listener.openBlockTag(a,b);this._increaseOpenTagCounter(a)}else{if(this._Listener.isInlineTag(a)){this._Listener.inlineTag(a,b)}else{this._Listener.openUnknownTag(a,b);this._increaseOpenTagCounter(a)}}this._Listener.last_tag=a;this._Listener.last_tag_opened=true;this._Listener.last_tag_attributes=b};WYMeditor.XhtmlParser.prototype._callCloseTagListener=function(a){if(this._decreaseOpenTagCounter(a)){this.autoCloseUnclosedBeforeTagClosing(a);if(this._Listener.isBlockTag(a)){var b=this._Listener._tag_stack.pop();if(b==false){return}else{if(b!=a){a=b}}this._Listener.closeBlockTag(a)}else{this._Listener.closeUnknownTag(a)}}else{this._Listener.closeUnopenedTag(a)}this._Listener.last_tag=a;this._Listener.last_tag_opened=false};WYMeditor.XhtmlParser.prototype._increaseOpenTagCounter=function(a){this._Listener._open_tags[a]=this._Listener._open_tags[a]||0;this._Listener._open_tags[a]++};WYMeditor.XhtmlParser.prototype._decreaseOpenTagCounter=function(a){if(this._Listener._open_tags[a]){this._Listener._open_tags[a]--;if(this._Listener._open_tags[a]==0){this._Listener._open_tags[a]=undefined}return true}return false};WYMeditor.XhtmlParser.prototype.autoCloseUnclosedBeforeNewOpening=function(a){this._autoCloseUnclosed(a,false)};WYMeditor.XhtmlParser.prototype.autoCloseUnclosedBeforeTagClosing=function(a){this._autoCloseUnclosed(a,true)};WYMeditor.XhtmlParser.prototype._autoCloseUnclosed=function(c,d){var d=d||false;if(this._Listener._open_tags){for(var a in this._Listener._open_tags){var b=this._Listener._open_tags[a];if(b>0&&this._Listener.shouldCloseTagAutomatically(a,c,d)){this._callCloseTagListener(a,true)}}}};WYMeditor.XhtmlParser.prototype.getTagReplacements=function(){return this._Listener.getTagReplacements()};WYMeditor.XhtmlParser.prototype.normalizeTag=function(a){a=a.replace(/^([\s<\/>]*)|([\s<\/>]*)$/gm,"").toLowerCase();var b=this._Listener.getTagReplacements();if(b[a]){return b[a]}return a};WYMeditor.XhtmlParser.prototype.TagAttributes=function(a,b){if(WYMeditor.LEXER_SPECIAL==b){this._current_attribute=a}return true};WYMeditor.XhtmlParser.prototype.DoubleQuotedAttribute=function(a,b){if(WYMeditor.LEXER_UNMATCHED==b){this._tag_attributes[this._current_attribute]=a}return true};WYMeditor.XhtmlParser.prototype.SingleQuotedAttribute=function(a,b){if(WYMeditor.LEXER_UNMATCHED==b){this._tag_attributes[this._current_attribute]=a}return true};WYMeditor.XhtmlParser.prototype.UnquotedAttribute=function(a,b){this._tag_attributes[this._current_attribute]=a.replace(/^=/,"");return true};WYMeditor.XhtmlSaxListener=function(){this.output="";this.helper=new WYMeditor.XmlHelper();this._open_tags={};this.validator=WYMeditor.XhtmlValidator;this._tag_stack=[];this.avoided_tags=[];this.entities={"&nbsp;":"&#160;","&iexcl;":"&#161;","&cent;":"&#162;","&pound;":"&#163;","&curren;":"&#164;","&yen;":"&#165;","&brvbar;":"&#166;","&sect;":"&#167;","&uml;":"&#168;","&copy;":"&#169;","&ordf;":"&#170;","&laquo;":"&#171;","&not;":"&#172;","&shy;":"&#173;","&reg;":"&#174;","&macr;":"&#175;","&deg;":"&#176;","&plusmn;":"&#177;","&sup2;":"&#178;","&sup3;":"&#179;","&acute;":"&#180;","&micro;":"&#181;","&para;":"&#182;","&middot;":"&#183;","&cedil;":"&#184;","&sup1;":"&#185;","&ordm;":"&#186;","&raquo;":"&#187;","&frac14;":"&#188;","&frac12;":"&#189;","&frac34;":"&#190;","&iquest;":"&#191;","&Agrave;":"&#192;","&Aacute;":"&#193;","&Acirc;":"&#194;","&Atilde;":"&#195;","&Auml;":"&#196;","&Aring;":"&#197;","&AElig;":"&#198;","&Ccedil;":"&#199;","&Egrave;":"&#200;","&Eacute;":"&#201;","&Ecirc;":"&#202;","&Euml;":"&#203;","&Igrave;":"&#204;","&Iacute;":"&#205;","&Icirc;":"&#206;","&Iuml;":"&#207;","&ETH;":"&#208;","&Ntilde;":"&#209;","&Ograve;":"&#210;","&Oacute;":"&#211;","&Ocirc;":"&#212;","&Otilde;":"&#213;","&Ouml;":"&#214;","&times;":"&#215;","&Oslash;":"&#216;","&Ugrave;":"&#217;","&Uacute;":"&#218;","&Ucirc;":"&#219;","&Uuml;":"&#220;","&Yacute;":"&#221;","&THORN;":"&#222;","&szlig;":"&#223;","&agrave;":"&#224;","&aacute;":"&#225;","&acirc;":"&#226;","&atilde;":"&#227;","&auml;":"&#228;","&aring;":"&#229;","&aelig;":"&#230;","&ccedil;":"&#231;","&egrave;":"&#232;","&eacute;":"&#233;","&ecirc;":"&#234;","&euml;":"&#235;","&igrave;":"&#236;","&iacute;":"&#237;","&icirc;":"&#238;","&iuml;":"&#239;","&eth;":"&#240;","&ntilde;":"&#241;","&ograve;":"&#242;","&oacute;":"&#243;","&ocirc;":"&#244;","&otilde;":"&#245;","&ouml;":"&#246;","&divide;":"&#247;","&oslash;":"&#248;","&ugrave;":"&#249;","&uacute;":"&#250;","&ucirc;":"&#251;","&uuml;":"&#252;","&yacute;":"&#253;","&thorn;":"&#254;","&yuml;":"&#255;","&OElig;":"&#338;","&oelig;":"&#339;","&Scaron;":"&#352;","&scaron;":"&#353;","&Yuml;":"&#376;","&fnof;":"&#402;","&circ;":"&#710;","&tilde;":"&#732;","&Alpha;":"&#913;","&Beta;":"&#914;","&Gamma;":"&#915;","&Delta;":"&#916;","&Epsilon;":"&#917;","&Zeta;":"&#918;","&Eta;":"&#919;","&Theta;":"&#920;","&Iota;":"&#921;","&Kappa;":"&#922;","&Lambda;":"&#923;","&Mu;":"&#924;","&Nu;":"&#925;","&Xi;":"&#926;","&Omicron;":"&#927;","&Pi;":"&#928;","&Rho;":"&#929;","&Sigma;":"&#931;","&Tau;":"&#932;","&Upsilon;":"&#933;","&Phi;":"&#934;","&Chi;":"&#935;","&Psi;":"&#936;","&Omega;":"&#937;","&alpha;":"&#945;","&beta;":"&#946;","&gamma;":"&#947;","&delta;":"&#948;","&epsilon;":"&#949;","&zeta;":"&#950;","&eta;":"&#951;","&theta;":"&#952;","&iota;":"&#953;","&kappa;":"&#954;","&lambda;":"&#955;","&mu;":"&#956;","&nu;":"&#957;","&xi;":"&#958;","&omicron;":"&#959;","&pi;":"&#960;","&rho;":"&#961;","&sigmaf;":"&#962;","&sigma;":"&#963;","&tau;":"&#964;","&upsilon;":"&#965;","&phi;":"&#966;","&chi;":"&#967;","&psi;":"&#968;","&omega;":"&#969;","&thetasym;":"&#977;","&upsih;":"&#978;","&piv;":"&#982;","&ensp;":"&#8194;","&emsp;":"&#8195;","&thinsp;":"&#8201;","&zwnj;":"&#8204;","&zwj;":"&#8205;","&lrm;":"&#8206;","&rlm;":"&#8207;","&ndash;":"&#8211;","&mdash;":"&#8212;","&lsquo;":"&#8216;","&rsquo;":"&#8217;","&sbquo;":"&#8218;","&ldquo;":"&#8220;","&rdquo;":"&#8221;","&bdquo;":"&#8222;","&dagger;":"&#8224;","&Dagger;":"&#8225;","&bull;":"&#8226;","&hellip;":"&#8230;","&permil;":"&#8240;","&prime;":"&#8242;","&Prime;":"&#8243;","&lsaquo;":"&#8249;","&rsaquo;":"&#8250;","&oline;":"&#8254;","&frasl;":"&#8260;","&euro;":"&#8364;","&image;":"&#8465;","&weierp;":"&#8472;","&real;":"&#8476;","&trade;":"&#8482;","&alefsym;":"&#8501;","&larr;":"&#8592;","&uarr;":"&#8593;","&rarr;":"&#8594;","&darr;":"&#8595;","&harr;":"&#8596;","&crarr;":"&#8629;","&lArr;":"&#8656;","&uArr;":"&#8657;","&rArr;":"&#8658;","&dArr;":"&#8659;","&hArr;":"&#8660;","&forall;":"&#8704;","&part;":"&#8706;","&exist;":"&#8707;","&empty;":"&#8709;","&nabla;":"&#8711;","&isin;":"&#8712;","&notin;":"&#8713;","&ni;":"&#8715;","&prod;":"&#8719;","&sum;":"&#8721;","&minus;":"&#8722;","&lowast;":"&#8727;","&radic;":"&#8730;","&prop;":"&#8733;","&infin;":"&#8734;","&ang;":"&#8736;","&and;":"&#8743;","&or;":"&#8744;","&cap;":"&#8745;","&cup;":"&#8746;","&int;":"&#8747;","&there4;":"&#8756;","&sim;":"&#8764;","&cong;":"&#8773;","&asymp;":"&#8776;","&ne;":"&#8800;","&equiv;":"&#8801;","&le;":"&#8804;","&ge;":"&#8805;","&sub;":"&#8834;","&sup;":"&#8835;","&nsub;":"&#8836;","&sube;":"&#8838;","&supe;":"&#8839;","&oplus;":"&#8853;","&otimes;":"&#8855;","&perp;":"&#8869;","&sdot;":"&#8901;","&lceil;":"&#8968;","&rceil;":"&#8969;","&lfloor;":"&#8970;","&rfloor;":"&#8971;","&lang;":"&#9001;","&rang;":"&#9002;","&loz;":"&#9674;","&spades;":"&#9824;","&clubs;":"&#9827;","&hearts;":"&#9829;","&diams;":"&#9830;"};this.block_tags=["a","abbr","acronym","address","area","b","base","bdo","big","blockquote","body","button","caption","cite","code","col","colgroup","dd","del","div","dfn","dl","dt","em","fieldset","form","head","h1","h2","h3","h4","h5","h6","html","i","ins","kbd","label","legend","li","map","noscript","object","ol","optgroup","option","p","param","pre","q","samp","script","select","small","span","strong","style","sub","sup","table","tbody","td","textarea","tfoot","th","thead","title","tr","tt","ul","var","extends"];this.inline_tags=["br","hr","img","input"];return this};WYMeditor.XhtmlSaxListener.prototype.shouldCloseTagAutomatically=function(a,c,b){var b=b||false;if(a=="td"){if((b&&c=="tr")||(!b&&c=="td")){return true}}if(a=="option"){if((b&&c=="select")||(!b&&c=="option")){return true}}return false};WYMeditor.XhtmlSaxListener.prototype.beforeParsing=function(a){this.output="";return a};WYMeditor.XhtmlSaxListener.prototype.afterParsing=function(a){a=this.replaceNamedEntities(a);a=this.joinRepeatedEntities(a);a=this.removeEmptyTags(a);a=this.removeBrInPre(a);return a};WYMeditor.XhtmlSaxListener.prototype.replaceNamedEntities=function(b){for(var a in this.entities){b=b.replace(new RegExp(a,"g"),this.entities[a])}return b};WYMeditor.XhtmlSaxListener.prototype.joinRepeatedEntities=function(b){var a="em|strong|sub|sup|acronym|pre|del|address";return b.replace(new RegExp("</("+a+")><\\1>",""),"").replace(new RegExp("(s*<("+a+")>s*){2}(.*)(s*</\\2>s*){2}",""),"<$2>$3<$2>")};WYMeditor.XhtmlSaxListener.prototype.removeEmptyTags=function(a){return a.replace(new RegExp("<("+this.block_tags.join("|").replace(/\|td/,"").replace(/\|th/,"")+")>(<br />|&#160;|&nbsp;|\\s)*</\\1>","g"),"")};WYMeditor.XhtmlSaxListener.prototype.removeBrInPre=function(c){var b=c.match(new RegExp("<pre[^>]*>(.*?)</pre>","gmi"));if(b){for(var a=0;a<b.length;a++){c=c.replace(b[a],b[a].replace(new RegExp("<br />","g"),String.fromCharCode(13,10)))}}return c};WYMeditor.XhtmlSaxListener.prototype.getResult=function(){return this.output};WYMeditor.XhtmlSaxListener.prototype.getTagReplacements=function(){return{b:"strong",i:"em"}};WYMeditor.XhtmlSaxListener.prototype.addContent=function(a){this.output+=a};WYMeditor.XhtmlSaxListener.prototype.addComment=function(a){if(this.remove_comments){this.output+=a}};WYMeditor.XhtmlSaxListener.prototype.addScript=function(a){if(!this.remove_scripts){this.output+=a}};WYMeditor.XhtmlSaxListener.prototype.addCss=function(a){if(!this.remove_embeded_styles){this.output+=a}};WYMeditor.XhtmlSaxListener.prototype.openBlockTag=function(a,b){this.output+=this.helper.tag(a,this.validator.getValidTagAttributes(a,b),true)};WYMeditor.XhtmlSaxListener.prototype.inlineTag=function(a,b){this.output+=this.helper.tag(a,this.validator.getValidTagAttributes(a,b))};WYMeditor.XhtmlSaxListener.prototype.openUnknownTag=function(a,b){};WYMeditor.XhtmlSaxListener.prototype.closeBlockTag=function(a){this.output=this.output.replace(/<br \/>$/,"")+this._getClosingTagContent("before",a)+"</"+a+">"+this._getClosingTagContent("after",a)};WYMeditor.XhtmlSaxListener.prototype.closeUnknownTag=function(a){};WYMeditor.XhtmlSaxListener.prototype.closeUnopenedTag=function(a){this.output+="</"+a+">"};WYMeditor.XhtmlSaxListener.prototype.avoidStylingTagsAndAttributes=function(){this.avoided_tags=["div","span"];this.validator.skiped_attributes=["style"];this.validator.skiped_attribute_values=["MsoNormal","main1"];this._avoiding_tags_implicitly=true};WYMeditor.XhtmlSaxListener.prototype.allowStylingTagsAndAttributes=function(){this.avoided_tags=[];this.validator.skiped_attributes=[];this.validator.skiped_attribute_values=[];this._avoiding_tags_implicitly=false};WYMeditor.XhtmlSaxListener.prototype.isBlockTag=function(a){return !WYMeditor.Helper.contains(this.avoided_tags,a)&&WYMeditor.Helper.contains(this.block_tags,a)};WYMeditor.XhtmlSaxListener.prototype.isInlineTag=function(a){return !WYMeditor.Helper.contains(this.avoided_tags,a)&&WYMeditor.Helper.contains(this.inline_tags,a)};WYMeditor.XhtmlSaxListener.prototype.insertContentAfterClosingTag=function(a,b){this._insertContentWhenClosingTag("after",a,b)};WYMeditor.XhtmlSaxListener.prototype.insertContentBeforeClosingTag=function(a,b){this._insertContentWhenClosingTag("before",a,b)};WYMeditor.XhtmlSaxListener.prototype.fixNestingBeforeOpeningBlockTag=function(a,b){if(a!="li"&&(a=="ul"||a=="ol")&&this.last_tag&&!this.last_tag_opened&&this.last_tag=="li"){this.output=this.output.replace(/<\/li>$/,"");this.insertContentAfterClosingTag(a,"</li>")}};WYMeditor.XhtmlSaxListener.prototype._insertContentWhenClosingTag=function(b,a,c){if(!this["_insert_"+b+"_closing"]){this["_insert_"+b+"_closing"]=[]}if(!this["_insert_"+b+"_closing"][a]){this["_insert_"+b+"_closing"][a]=[]}this["_insert_"+b+"_closing"][a].push(c)};WYMeditor.XhtmlSaxListener.prototype._getClosingTagContent=function(b,a){if(this["_insert_"+b+"_closing"]&&this["_insert_"+b+"_closing"][a]&&this["_insert_"+b+"_closing"][a].length>0){return this["_insert_"+b+"_closing"][a].pop()}return""};WYMeditor.WymCssLexer=function(b,a){var a=(typeof a=="undefined"?true:a);jQuery.extend(this,new WYMeditor.Lexer(b,(a?"Ignore":"WymCss")));this.mapHandler("WymCss","Ignore");if(a==true){this.addEntryPattern("/\\\x2a[<\\s]*WYMeditor[>\\s]*\\\x2a/","Ignore","WymCss");this.addExitPattern("/\\\x2a[</\\s]*WYMeditor[>\\s]*\\\x2a/","WymCss")}this.addSpecialPattern("[\\sa-z1-6]*\\\x2e[a-z-_0-9]+","WymCss","WymCssStyleDeclaration");this.addEntryPattern("/\\\x2a","WymCss","WymCssComment");this.addExitPattern("\\\x2a/","WymCssComment");this.addEntryPattern("\x7b","WymCss","WymCssStyle");this.addExitPattern("\x7d","WymCssStyle");this.addEntryPattern("/\\\x2a","WymCssStyle","WymCssFeedbackStyle");this.addExitPattern("\\\x2a/","WymCssFeedbackStyle");return this};WYMeditor.WymCssParser=function(){this._in_style=false;this._has_title=false;this.only_wym_blocks=true;this.css_settings={classesItems:[],editorStyles:[],dialogStyles:[]};return this};WYMeditor.WymCssParser.prototype.parse=function(a,b){var b=(typeof b=="undefined"?this.only_wym_blocks:b);this._Lexer=new WYMeditor.WymCssLexer(this,b);this._Lexer.parse(a)};WYMeditor.WymCssParser.prototype.Ignore=function(a,b){return true};WYMeditor.WymCssParser.prototype.WymCssComment=function(b,a){if(b.match(/end[a-z0-9\s]*wym[a-z0-9\s]*/mi)){return false}if(a==WYMeditor.LEXER_UNMATCHED){if(!this._in_style){this._has_title=true;this._current_item={title:WYMeditor.Helper.trim(b)}}else{if(this._current_item[this._current_element]){if(!this._current_item[this._current_element].expressions){this._current_item[this._current_element].expressions=[b]}else{this._current_item[this._current_element].expressions.push(b)}}}this._in_style=true}return true};WYMeditor.WymCssParser.prototype.WymCssStyle=function(b,a){if(a==WYMeditor.LEXER_UNMATCHED){b=WYMeditor.Helper.trim(b);if(b!=""){this._current_item[this._current_element].style=b}}else{if(a==WYMeditor.LEXER_EXIT){this._in_style=false;this._has_title=false;this.addStyleSetting(this._current_item)}}return true};WYMeditor.WymCssParser.prototype.WymCssFeedbackStyle=function(b,a){if(a==WYMeditor.LEXER_UNMATCHED){this._current_item[this._current_element].feedback_style=b.replace(/^([\s\/\*]*)|([\s\/\*]*)$/gm,"")}return true};WYMeditor.WymCssParser.prototype.WymCssStyleDeclaration=function(b){b=b.replace(/^([\s\.]*)|([\s\.*]*)$/gm,"");var a="";if(b.indexOf(".")>0){var c=b.split(".");this._current_element=c[1];var a=c[0]}else{this._current_element=b}if(!this._has_title){this._current_item={title:(!a?"":a.toUpperCase()+": ")+this._current_element};this._has_title=true}if(!this._current_item[this._current_element]){this._current_item[this._current_element]={name:this._current_element}}if(a){if(!this._current_item[this._current_element].tags){this._current_item[this._current_element].tags=[a]}else{this._current_item[this._current_element].tags.push(a)}}return true};WYMeditor.WymCssParser.prototype.addStyleSetting=function(a){for(var b in a){var c=a[b];if(typeof c=="object"&&b!="title"){this.css_settings.classesItems.push({name:WYMeditor.Helper.trim(c.name),title:a.title,expr:WYMeditor.Helper.trim((c.expressions||c.tags).join(", "))});if(c.feedback_style){this.css_settings.editorStyles.push({name:"."+WYMeditor.Helper.trim(c.name),css:c.feedback_style})}if(c.style){this.css_settings.dialogStyles.push({name:"."+WYMeditor.Helper.trim(c.name),css:c.style})}}}};jQuery.fn.isPhantomNode=function(){if(this[0].nodeType==3){return !(/[^\t\n\r ]/.test(this[0].data))}return false};WYMeditor.isPhantomNode=function(a){if(a.nodeType==3){return !(/[^\t\n\r ]/.test(a.data))}return false};WYMeditor.isPhantomString=function(a){return !(/[^\t\n\r ]/.test(a))};jQuery.fn.parentsOrSelf=function(b){var a=this;if(a[0].nodeType==3){a=a.parents().slice(0,1)}if(a.filter(b).size()==1){return a}else{return a.parents(b).slice(0,1)}};WYMeditor.Helper={replaceAll:function(d,a,c){var b=new RegExp(a,"g");return(d.replace(b,c))},insertAt:function(b,a,c){return(b.substr(0,c)+a+b.substring(c))},trim:function(a){return a.replace(/^(\s*)|(\s*)$/gm,"")},contains:function(a,c){for(var b=0;b<a.length;b++){if(a[b]===c){return true}}return false},indexOf:function(a,d){var b=-1;for(var c=0;c<a.length;c++){if(a[c]==d){b=c;break}}return(b)},findByName:function(a,b){for(var c=0;c<a.length;c++){var d=a[c];if(d.name==b){return(d)}}return(null)}};WYMeditor.WymClassExplorer=function(a){this._wym=a;this._class="className";this._newLine="\r\n"};WYMeditor.WymClassExplorer.prototype.initIframe=function(iframe){this._iframe=iframe;this._doc=iframe.contentWindow.document;var styles=this._doc.styleSheets[0];var aCss=eval(this._options.editorStyles);this.addCssRules(this._doc,aCss);this._doc.title=this._wym._index;jQuery("html",this._doc).attr("dir",this._options.direction);jQuery(this._doc.body).html(this._wym._html);var wym=this;this._doc.body.onfocus=function(){wym._doc.designMode="on";wym._doc=iframe.contentWindow.document};this._doc.onbeforedeactivate=function(){wym.saveCaret()};this._doc.onkeyup=function(){wym.saveCaret();wym.keyup()};this._doc.onclick=function(){wym.saveCaret()};this._doc.body.onbeforepaste=function(){wym._iframe.contentWindow.event.returnValue=false};this._doc.body.onpaste=function(){wym._iframe.contentWindow.event.returnValue=false;wym.paste(window.clipboardData.getData("Text"))};if(this._initialized){if(jQuery.isFunction(this._options.preBind)){this._options.preBind(this)}this._wym.bindEvents();if(jQuery.isFunction(this._options.postInit)){this._options.postInit(this)}this.listen()}this._initialized=true;this._doc.designMode="on";try{this._doc=iframe.contentWindow.document}catch(e){}};WYMeditor.WymClassExplorer.prototype._exec=function(c,d){switch(c){case WYMeditor.INDENT:case WYMeditor.OUTDENT:var a=this.findUp(this.container(),WYMeditor.LI);if(a){var b=a.parentNode.parentNode;if(a.parentNode.childNodes.length>1||b.tagName.toLowerCase()==WYMeditor.OL||b.tagName.toLowerCase()==WYMeditor.UL){this._doc.execCommand(c)}}break;default:if(d){this._doc.execCommand(c,false,d)}else{this._doc.execCommand(c)}break}};WYMeditor.WymClassExplorer.prototype.selected=function(){var a=this._iframe.contentWindow.document.caretPos;if(a!=null){if(a.parentElement!=undefined){return(a.parentElement())}}};WYMeditor.WymClassExplorer.prototype.saveCaret=function(){this._doc.caretPos=this._doc.selection.createRange()};WYMeditor.WymClassExplorer.prototype.addCssRule=function(a,b){a.addRule(b.name,b.css)};WYMeditor.WymClassExplorer.prototype.insert=function(b){var a=this._doc.selection.createRange();if(jQuery(a.parentElement()).parents(this._options.iframeBodySelector).is("*")){try{a.pasteHTML(b)}catch(c){}}else{this.paste(b)}};WYMeditor.WymClassExplorer.prototype.wrap=function(d,b){var a=this._doc.selection.createRange();if(jQuery(a.parentElement()).parents(this._options.iframeBodySelector).is("*")){try{a.pasteHTML(d+a.text+b)}catch(c){}}};WYMeditor.WymClassExplorer.prototype.unwrap=function(){var a=this._doc.selection.createRange();if(jQuery(a.parentElement()).parents(this._options.iframeBodySelector).is("*")){try{var c=a.text;this._exec("Cut");a.pasteHTML(c)}catch(b){}}};WYMeditor.WymClassExplorer.prototype.keyup=function(){this._selected_image=null};WYMeditor.WymClassExplorer.prototype.setFocusToNode=function(c,b){var a=this._doc.selection.createRange();b=b?true:false;a.moveToElementText(c);a.collapse(b);a.select();c.focus()};WYMeditor.WymClassMozilla=function(a){this._wym=a;this._class="class";this._newLine="\n"};WYMeditor.WymClassMozilla.prototype.initIframe=function(iframe){var wym=this;this._iframe=iframe;this._doc=iframe.contentDocument;var styles=this._doc.styleSheets[0];var aCss=eval(this._options.editorStyles);this.addCssRules(this._doc,aCss);this._doc.title=this._wym._index;jQuery("html",this._doc).attr("dir",this._options.direction);this.html(this._wym._html);this.enableDesignMode();if(jQuery.isFunction(this._options.preBind)){this._options.preBind(this)}this._wym.bindEvents();jQuery(this._doc).bind("keydown",this.keydown);jQuery(this._doc).bind("keyup",this.keyup);jQuery(this._doc).bind("focus",function(){wym.enableDesignMode.call(wym)});if(jQuery.isFunction(this._options.postInit)){this._options.postInit(this)}this.listen()};WYMeditor.WymClassMozilla.prototype.html=function(a){if(typeof a==="string"){try{this._doc.designMode="off"}catch(b){}a=a.replace(/<em(\b[^>]*)>/gi,"<i$1>").replace(/<\/em>/gi,"</i>").replace(/<strong(\b[^>]*)>/gi,"<b$1>").replace(/<\/strong>/gi,"</b>");jQuery(this._doc.body).html(a);this.enableDesignMode()}else{return(jQuery(this._doc.body).html())}};WYMeditor.WymClassMozilla.prototype._exec=function(e,g){if(!this.selected()){return(false)}switch(e){case WYMeditor.INDENT:case WYMeditor.OUTDENT:var f=this.selected();var d=this._iframe.contentWindow.getSelection();var b=d.anchorNode;if(b.nodeName=="#text"){b=b.parentNode}f=this.findUp(f,WYMeditor.BLOCKS);b=this.findUp(b,WYMeditor.BLOCKS);if(f&&f==b&&f.tagName.toLowerCase()==WYMeditor.LI){var c=f.parentNode.parentNode;if(f.parentNode.childNodes.length>1||c.tagName.toLowerCase()==WYMeditor.OL||c.tagName.toLowerCase()==WYMeditor.UL){this._doc.execCommand(e,"",null)}}break;default:if(g){this._doc.execCommand(e,"",g)}else{this._doc.execCommand(e,"",null)}}var a=this.selected();if(a.tagName.toLowerCase()==WYMeditor.BODY){this._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}};WYMeditor.WymClassMozilla.prototype.selected=function(){var b=this._iframe.contentWindow.getSelection();var a=b.focusNode;if(a){if(a.nodeName=="#text"){return(a.parentNode)}else{return(a)}}else{return(null)}};WYMeditor.WymClassMozilla.prototype.addCssRule=function(a,b){a.insertRule(b.name+" {"+b.css+"}",a.cssRules.length)};WYMeditor.WymClassMozilla.prototype.keydown=function(b){var c=WYMeditor.INSTANCES[this.title];var a=null;if(b.ctrlKey){if(b.keyCode==66){c._exec(WYMeditor.BOLD);return false}if(b.keyCode==73){c._exec(WYMeditor.ITALIC);return false}}else{if(b.keyCode==13){if(!b.shiftKey){a=c.selected();if(a&&a.tagName.toLowerCase()==WYMeditor.PRE){b.preventDefault();c.insert("<p></p>")}}}}};WYMeditor.WymClassMozilla.prototype.keyup=function(b){var d=WYMeditor.INSTANCES[this.title];d._selected_image=null;var a=null;if(b.keyCode==13&&!b.shiftKey){jQuery(d._doc.body).children(WYMeditor.BR).remove()}if(b.keyCode!=8&&b.keyCode!=17&&b.keyCode!=46&&b.keyCode!=224&&!b.metaKey&&!b.ctrlKey){a=d.selected();var c=a.tagName.toLowerCase();if(c=="strong"||c=="b"||c=="em"||c=="i"||c=="sub"||c=="sup"||c=="a"){c=a.parentNode.tagName.toLowerCase()}if(c==WYMeditor.BODY){d._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}}};WYMeditor.WymClassMozilla.prototype.enableDesignMode=function(){if(this._doc.designMode=="off"){try{this._doc.designMode="on";this._doc.execCommand("styleWithCSS","",false)}catch(a){}}};WYMeditor.WymClassMozilla.prototype.openBlockTag=function(a,c){var c=this.validator.getValidTagAttributes(a,c);if(a=="span"&&c.style){var b=this.getTagForStyle(c.style);if(b){this._tag_stack.pop();var a=b;this._tag_stack.push(b);c.style=""}else{return}}this.output+=this.helper.tag(a,c,true)};WYMeditor.WymClassMozilla.prototype.getTagForStyle=function(a){if(/bold/.test(a)){return"strong"}if(/italic/.test(a)){return"em"}if(/sub/.test(a)){return"sub"}if(/super/.test(a)){return"sup"}return false};WYMeditor.WymClassOpera=function(a){this._wym=a;this._class="class";this._newLine="\r\n"};WYMeditor.WymClassOpera.prototype.initIframe=function(iframe){this._iframe=iframe;this._doc=iframe.contentWindow.document;var styles=this._doc.styleSheets[0];var aCss=eval(this._options.editorStyles);this.addCssRules(this._doc,aCss);this._doc.title=this._wym._index;jQuery("html",this._doc).attr("dir",this._options.direction);this._doc.designMode="on";this.html(this._wym._html);if(jQuery.isFunction(this._options.preBind)){this._options.preBind(this)}this._wym.bindEvents();jQuery(this._doc).bind("keydown",this.keydown);jQuery(this._doc).bind("keyup",this.keyup);if(jQuery.isFunction(this._options.postInit)){this._options.postInit(this)}this.listen()};WYMeditor.WymClassOpera.prototype._exec=function(a,b){if(b){this._doc.execCommand(a,false,b)}else{this._doc.execCommand(a)}};WYMeditor.WymClassOpera.prototype.selected=function(){var b=this._iframe.contentWindow.getSelection();var a=b.focusNode;if(a){if(a.nodeName=="#text"){return(a.parentNode)}else{return(a)}}else{return(null)}};WYMeditor.WymClassOpera.prototype.addCssRule=function(a,b){a.insertRule(b.name+" {"+b.css+"}",a.cssRules.length)};WYMeditor.WymClassOpera.prototype.keydown=function(a){var c=WYMeditor.INSTANCES[this.title];var b=c._iframe.contentWindow.getSelection();startNode=b.getRangeAt(0).startContainer;if(!jQuery(startNode).parentsOrSelf(WYMeditor.MAIN_CONTAINERS.join(","))[0]&&!jQuery(startNode).parentsOrSelf("li")&&a.keyCode!=WYMeditor.KEY.ENTER&&a.keyCode!=WYMeditor.KEY.LEFT&&a.keyCode!=WYMeditor.KEY.UP&&a.keyCode!=WYMeditor.KEY.RIGHT&&a.keyCode!=WYMeditor.KEY.DOWN&&a.keyCode!=WYMeditor.KEY.BACKSPACE&&a.keyCode!=WYMeditor.KEY.DELETE){c._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}};WYMeditor.WymClassOpera.prototype.keyup=function(a){var b=WYMeditor.INSTANCES[this.title];b._selected_image=null};WYMeditor.WymClassSafari=function(a){this._wym=a;this._class="class";this._newLine="\n"};WYMeditor.WymClassSafari.prototype.initIframe=function(iframe){this._iframe=iframe;this._doc=iframe.contentDocument;var styles=this._doc.styleSheets[0];var aCss=eval(this._options.editorStyles);this.addCssRules(this._doc,aCss);this._doc.title=this._wym._index;jQuery("html",this._doc).attr("dir",this._options.direction);this._doc.designMode="on";this.html(this._wym._html);if(jQuery.isFunction(this._options.preBind)){this._options.preBind(this)}this._wym.bindEvents();jQuery(this._doc).bind("keydown",this.keydown);jQuery(this._doc).bind("keyup",this.keyup);if(jQuery.isFunction(this._options.postInit)){this._options.postInit(this)}this.listen()};WYMeditor.WymClassSafari.prototype._exec=function(e,g){if(!this.selected()){return(false)}switch(e){case WYMeditor.INDENT:case WYMeditor.OUTDENT:var f=this.selected();var d=this._iframe.contentWindow.getSelection();var b=d.anchorNode;if(b.nodeName=="#text"){b=b.parentNode}f=this.findUp(f,WYMeditor.BLOCKS);b=this.findUp(b,WYMeditor.BLOCKS);if(f&&f==b&&f.tagName.toLowerCase()==WYMeditor.LI){var c=f.parentNode.parentNode;if(f.parentNode.childNodes.length>1||c.tagName.toLowerCase()==WYMeditor.OL||c.tagName.toLowerCase()==WYMeditor.UL){this._doc.execCommand(e,"",null)}}break;case WYMeditor.INSERT_ORDEREDLIST:case WYMeditor.INSERT_UNORDEREDLIST:this._doc.execCommand(e,"",null);var f=this.selected();var a=this.findUp(f,WYMeditor.MAIN_CONTAINERS);if(a){jQuery(a).replaceWith(jQuery(a).html())}break;default:if(g){this._doc.execCommand(e,"",g)}else{this._doc.execCommand(e,"",null)}}var a=this.selected();if(a&&a.tagName.toLowerCase()==WYMeditor.BODY){this._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}};WYMeditor.WymClassSafari.prototype.selected=function(){var b=this._iframe.contentWindow.getSelection();var a=b.focusNode;if(a){if(a.nodeName=="#text"){return(a.parentNode)}else{return(a)}}else{return(null)}};WYMeditor.WymClassSafari.prototype.addCssRule=function(a,b){a.insertRule(b.name+" {"+b.css+"}",a.cssRules.length)};WYMeditor.WymClassSafari.prototype.keydown=function(a){var b=WYMeditor.INSTANCES[this.title];if(a.ctrlKey){if(a.keyCode==66){b._exec(WYMeditor.BOLD);return false}if(a.keyCode==73){b._exec(WYMeditor.ITALIC);return false}}};WYMeditor.WymClassSafari.prototype.keyup=function(b){var d=WYMeditor.INSTANCES[this.title];d._selected_image=null;var a=null;if(b.keyCode==13&&!b.shiftKey){jQuery(d._doc.body).children(WYMeditor.BR).remove();a=d.selected();if(a&&a.tagName.toLowerCase()==WYMeditor.PRE){d._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}}if(b.keyCode==13&&b.shiftKey){d._exec("InsertLineBreak")}if(b.keyCode!=8&&b.keyCode!=17&&b.keyCode!=46&&b.keyCode!=224&&!b.metaKey&&!b.ctrlKey){a=d.selected();var c=a.tagName.toLowerCase();if(c=="strong"||c=="b"||c=="em"||c=="i"||c=="sub"||c=="sup"||c=="a"||c=="span"){c=a.parentNode.tagName.toLowerCase()}if(c==WYMeditor.BODY||c==WYMeditor.DIV){d._exec(WYMeditor.FORMAT_BLOCK,WYMeditor.P)}}};WYMeditor.WymClassSafari.prototype.openBlockTag=function(a,c){var c=this.validator.getValidTagAttributes(a,c);if(a=="span"&&c.style){var b=this.getTagForStyle(c.style);if(b){this._tag_stack.pop();var a=b;this._tag_stack.push(b);c.style="";if(typeof c["class"]=="string"){c["class"]=c["class"].replace(/apple-style-span/gi,"")}}else{return}}this.output+=this.helper.tag(a,c,true)};WYMeditor.WymClassSafari.prototype.getTagForStyle=function(a){if(/bold/.test(a)){return"strong"}if(/italic/.test(a)){return"em"}if(/sub/.test(a)){return"sub"}if(/super/.test(a)){return"sup"}return false}; \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.pack.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.pack.js
new file mode 100644
index 0000000..17b3268
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/jquery.wymeditor.pack.js
@@ -0,0 +1 @@
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('if(!f)l f={};(j(){if(!2l.4O||!4O.rD){l aj=["rC","rB","rA","rz","9w","ry","3z","rx","rw","rv","ru","rt","58","rs","cK","rr"];f.4O={};1h(l i=0;i<aj.Y;++i)f.4O[aj[i]]=j(){}}V f.4O=2l.4O})();D.53(f,{rq:"0.5-rp",2w:[],7U:[],5h:[],7Z:"F",3N:"{ro}",a2:"rn",dE:"{rm}",9s:"{rl}",9r:"{rk}",eX:"dw/",7E:"3a.1b",dm:"3a.js",eW:"3H/",a1:"{rj}",eV:"1K/3R/",9q:"{ri}",9t:"{rh}",a0:"{rg}",9Z:"{rf}",9R:"{rd}",9T:"{rc}",81:"{rb}",9S:"{ra}",9X:"{r9}",9O:"{r8}",80:"{r7}",9P:"{r6}",9Y:"{r5}",9I:"{r4}",9L:"{r3}",9K:"{r2}",9J:"{r1}",82:"{r0}",9W:"{qZ}",9V:"{qY}",9p:"{qX}",9o:"{qW}",dO:"3Q",3t:"1j",an:"N",P:"p",9F:"h1",9E:"h2",9D:"h3",9C:"h4",9B:"h5",9A:"h6",5q:"41",6b:"2J",A:"a",88:"br",du:"6Q",de:"3j",6d:"4F",5l:"5I",6o:"2I",6p:"ol",6r:"li",dP:"I",9c:"1P",7C:"1U",61:"M",7B:"5b",64:"aa",7R:"a9",7Q:"a7",7P:"a5",8a:"eU",89:"eT",9d:"eM",9b:"eL",dU:"eK",7L:"qV",dT:"eJ",6t:"ai",6s:"ah",dS:"eI",4q:"qU",7O:"af",qT:"ag",ar:"eP",as:"eQ",6n:1f 6c("p","h1","h2","h3","h4","h5","h6","41","2J"),5t:1f 6c("6L","2J","N","dl","2U","1M","h1","h2","h3","h4","h5","h6","hr","8E","ol","p","41","3j","2I","dd","dt","li","8D","4F","8C","5I","8B","6P"),3T:{av:8,aA:13,qS:35,qR:36,az:37,ay:38,ax:39,aw:40,qQ:1f 6c(37,38,39,40),au:46},qP:{qO:1,qN:2,qM:3},1g:j(5C,1Q){c.3f=f.2w.1X(c)-1;c.7T=5C;c.B=1Q;c.4R=D(5C).1H();if(c.B.O)c.4R=c.B.O;c.B.4L=c.B.4L||c.dz();c.B.5i=c.B.5i||c.B.4L+f.eX+c.B.3a+\'/\';c.B.7N=c.B.7N||c.dy();c.B.9x=c.B.9x||c.B.4L+f.eW;c.B.83=c.B.83||c.B.4L+f.eV;c.B.7M=c.B.7M||c.dx();c.56()}});D.fn.5k=j(1Q){1Q=D.53({O:"",4L:J,5i:J,7N:J,83:J,7M:J,1D:J,3p:J,3a:"3R",dn:R,7F:R,3H:"en",4S:"92",1u:"<N I=\'eH\'>"+"<N I=\'qL\'>"+f.9Z+"</N>"+"<N I=\'qK\'></N>"+"<N I=\'qJ\'>"+f.9Y+f.9X+"</N>"+"<N I=\'qI\'>"+f.82+f.9W+f.9V+"</N>"+"<N I=\'qH\'>"+f.a0+"</N>"+"</N>",ec:"<a I=\'qG\' "+"1P=\'91://ex.5k.ew/\'>f</a>",4n:"<N I=\'ae 5o\'>"+"<1K "+"1U=\'"+f.a1+"qF.O\' "+"4K=\'c.1B.qE.f.2w["+f.3N+"].5w(c)\'"+"></1K>"+"</N>",3g:[],eb:"<N I=\'ad 5o\'>"+"<h2>{qD}</h2>"+"<2I>"+f.9R+"</2I>"+"</N>",e5:"<li I=\'"+f.9S+"\'><a 1P=\'#\' F=\'"+f.9T+"\' M=\'"+f.81+"\'>"+f.81+"</a></li>",e6:[{\'F\':\'eU\',\'M\':\'qC\',\'1b\':\'qB\'},{\'F\':\'eT\',\'M\':\'qA\',\'1b\':\'qz\'},{\'F\':\'eS\',\'M\':\'eS\',\'1b\':\'qy\'},{\'F\':\'eR\',\'M\':\'eR\',\'1b\':\'qx\'},{\'F\':\'eQ\',\'M\':\'qw\',\'1b\':\'qv\'},{\'F\':\'eP\',\'M\':\'qu\',\'1b\':\'qt\'},{\'F\':\'ai\',\'M\':\'ai\',\'1b\':\'qs\'},{\'F\':\'ah\',\'M\':\'ah\',\'1b\':\'qr\'},{\'F\':\'eO\',\'M\':\'eO\',\'1b\':\'qq\'},{\'F\':\'eN\',\'M\':\'eN\',\'1b\':\'qp\'},{\'F\':\'eM\',\'M\':\'aa\',\'1b\':\'qo\'},{\'F\':\'ag\',\'M\':\'ag\',\'1b\':\'qn\'},{\'F\':\'eL\',\'M\':\'a9\',\'1b\':\'qm\'},{\'F\':\'eK\',\'M\':\'a7\',\'1b\':\'ql\'},{\'F\':\'eJ\',\'M\':\'a5\',\'1b\':\'qk\'},{\'F\':\'eI\',\'M\':\'82\',\'1b\':\'qj\'},{\'F\':\'af\',\'M\':\'af\',\'1b\':\'qi\'}],ea:"<N I=\'ac 5o\'>"+"<h2>{qh}</h2>"+"<2I>"+f.9I+"</2I>"+"</N>",e2:"<li I=\'"+f.9J+"\'>"+"<a 1P=\'#\' F=\'"+f.9L+"\'>"+f.9K+"</a></li>",e3:[{\'F\':\'P\',\'M\':\'qg\',\'1b\':\'qf\'},{\'F\':\'9F\',\'M\':\'qe\',\'1b\':\'qd\'},{\'F\':\'9E\',\'M\':\'qc\',\'1b\':\'qb\'},{\'F\':\'9D\',\'M\':\'qa\',\'1b\':\'q9\'},{\'F\':\'9C\',\'M\':\'q8\',\'1b\':\'q7\'},{\'F\':\'9B\',\'M\':\'q6\',\'1b\':\'q5\'},{\'F\':\'9A\',\'M\':\'q4\',\'1b\':\'q3\'},{\'F\':\'5q\',\'M\':\'q2\',\'1b\':\'q1\'},{\'F\':\'6b\',\'M\':\'q0\',\'1b\':\'pZ\'},{\'F\':\'5l\',\'M\':\'pY\',\'1b\':\'pX\'}],e9:"<N I=\'ab 5o\'>"+"<h2>{pW}</h2><2I>"+f.9O+"</2I></N>",e4:"<li I=\'pV"+f.80+"\'><a 1P=\'#\' F=\'"+f.80+"\'>"+f.9P+"</a></li>",3W:[],e7:"<N I=\'eF 5o\'>"+"<h2>{pU}</h2>"+"</N>",e8:"<N I=\'eG 5o\'>"+"<h2>{pT}</h2>"+"<4G I=\'eE\'></4G>"+"</N>",pS:".eH",pR:".ad",pQ:" 2I",pP:".ac",pO:".ab",9l:".eG",pN:".ae 1K",6w:".ae",dN:".eF",e0:".ad a",dZ:".ac a",dY:".ab a",9v:".eE",9e:".es",7D:".ep",60:".a8",7A:".eo",d6:".ee",dg:".eh",df:".eg",dc:".ej",d9:".ei",5Z:".6h",d2:".6g",d3:"",dk:".6i",di:".et",63:".er",dh:".ek",d7:".ef",d4:".ed",dX:".pM",dW:"4e",7S:"eD=no,eC=no,eB=no,eA=no"+",4J=ez,7h=ey,3o=0,2k=0",dR:"eD=no,eC=no,eB=no,eA=no"+",pL=pK,4J=ez,7h=ey,3o=0,2k=0",1I:"<!pJ O pI \'-//pH//ev pG 1.0 pF//pE\'"+" \'91://ex.pD.ew/pC/eu/ev/eu-pB.pA\'>"+"<O 3z=\'"+f.9t+"\'><2T>"+"<2u 7w=\'3p\' 1e=\'X/1b\' 8Z=\'7f\'"+" 1P=\'"+f.9s+"\' />"+"<M>"+f.9p+"</M>"+"<2h 1e=\'X/90\'"+" 1U=\'"+f.9q+"\'></2h>"+"<2h 1e=\'X/90\'"+" 1U=\'"+f.9r+"\'></2h>"+"</2T>"+f.9o+"</O>",dK:"<1j I=\'6f et\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<2U>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.64+"\' />"+"<3k>{aa}</3k>"+"<N I=\'1O\'>"+"<1p>{eq}</1p>"+"<1y 1e=\'X\' I=\'es\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{el}</1p>"+"<1y 1e=\'X\' I=\'a8\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O 1O-a6\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dJ:"<1j I=\'6f er\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<2U>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.7R+"\' />"+"<3k>{a9}</3k>"+"<N I=\'1O\'>"+"<1p>{eq}</1p>"+"<1y 1e=\'X\' I=\'ep\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{pz}</1p>"+"<1y 1e=\'X\' I=\'eo\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{el}</1p>"+"<1y 1e=\'X\' I=\'a8\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O 1O-a6\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dI:"<1j I=\'6f ek\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<2U>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.7Q+"\' />"+"<3k>{a7}</3k>"+"<N I=\'1O\'>"+"<1p>{py}</1p>"+"<1y 1e=\'X\' I=\'ej\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{px}</1p>"+"<1y 1e=\'X\' I=\'ei\' Q=\'\' 2G=\'40\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{pw}</1p>"+"<1y 1e=\'X\' I=\'eh\' Q=\'3\' 2G=\'3\' />"+"</N>"+"<N I=\'1O\'>"+"<1p>{pv}</1p>"+"<1y 1e=\'X\' I=\'eg\' Q=\'2\' 2G=\'3\' />"+"</N>"+"<N I=\'1O 1O-a6\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dH:"<1j I=\'6f ef\'"+" 4K=\'f.5g("+f.3N+")\'"+">"+"<1M>"+"<1y 1e=\'5V\' I=\'6i\' Q=\'"+f.7P+"\' />"+"<2U>"+"<3k>{a5}</3k>"+"<N I=\'1O\'>"+"<4G I=\'ee\' 7d=\'10\' 7e=\'50\'></4G>"+"</N>"+"<N I=\'1O\'>"+"<1y I=\'6h\' 1e=\'2t\'"+" Q=\'{86}\' />"+"<1y I=\'6g\' 1e=\'2t\'"+"Q=\'{85}\' />"+"</N>"+"</2U>"+"</1M>"+"</1j>",dG:"<1j I=\'6f ed\'"+" 4K=\'f.5g("+f.3N+")\'"+"></1j>",4A:[],69:"{",68:"}",a4:1a,3y:1a,3w:1a,9f:1a,97:1a},1Q);o c.dq(j(){1f f.1g(D(c),1Q)})};D.53({pu:j(i){o(f.2w[i])}});f.1g.u.56=j(){if(D.84.pt){l 4o=1f f.2D(c)}V if(D.84.ps){l 4o=1f f.2C(c)}V if(D.84.pr){l 4o=1f f.3S(c)}V if(D.84.pq){l 4o=1f f.3d(c)}if(4o){if(D.2A(c.B.a4))c.B.a4(c);l a3=1f f.1l();D.53(a3,4o);c.3Z=1f f.1t(a3);if(c.B.1D||c.B.3p){c.dv()}c.4P=1f f.2W();1h(l 6U in 4o){c[6U]=4o[6U]}c.2p=D(c.7T).e1().5G(c.B.1u).5U().do(\'pp\'+c.3f);if(D.2A(D.fn.4z)){D.4z(c.2p.5W(0),f.a2,c.3f);D.4z(c.7T.5W(0),f.a2,c.3f)}l h=f.1L;l 4n=c.B.4n;4n=h.1k(4n,f.3N,c.3f);4n=h.1k(4n,f.a1,c.B.83);l 1u=D(c.2p).O();1u=h.1k(1u,f.a0,c.B.ec);1u=h.1k(1u,f.9Z,c.B.eb);1u=h.1k(1u,f.9Y,c.B.ea);1u=h.1k(1u,f.9X,c.B.e9);1u=h.1k(1u,f.82,c.B.e8);1u=h.1k(1u,f.9W,4n);1u=h.1k(1u,f.9V,c.B.e7);l 9U=2B(c.B.e6);l 9Q="";1h(l i=0;i<9U.Y;i++){l 5n=9U[i];if(5n.F&&5n.M)l 4m=c.B.e5;l 4m=h.1k(4m,f.9T,5n.F);4m=h.1k(4m,f.81,c.B.69+5n.M+c.B.68);4m=h.1k(4m,f.9S,5n.1b);9Q+=4m}1u=h.1k(1u,f.9R,9Q);l 6e=2B(c.B.3W);l 9N="";1h(l i=0;i<6e.Y;i++){l 4k=6e[i];if(4k.F&&4k.M)l 4j=c.B.e4;4j=h.1k(4j,f.80,4k.F);4j=h.1k(4j,f.9P,4k.M);9N+=4j}1u=h.1k(1u,f.9O,9N);l 9M=2B(c.B.e3);l 9H="";1h(l i=0;i<9M.Y;i++){l 5m=9M[i];if(5m.F&&5m.M)l 4l=c.B.e2;4l=h.1k(4l,f.9L,5m.F);4l=h.1k(4l,f.9K,c.B.69+5m.M+c.B.68);4l=h.1k(4l,f.9J,5m.1b);9H+=4l}1u=h.1k(1u,f.9I,9H);1u=c.9n(1u);D(c.2p).O(1u);D(c.2p).4g(c.B.9l).e1();c.7F()}};f.1g.u.5v=j(){l E=c;D(c.2p).4g(c.B.e0).4e(j(){E.1E.1B.4W();E.dV(D(c).1v(f.7Z));o(J)});D(c.2p).4g(c.B.dZ).4e(j(){E.L(D(c).1v(f.7Z));o(J)});D(c.2p).4g(c.B.9v).2x(j(){D(E.H.1j).O(D(c).1H())}).4W(j(){D(c).6a(\'9u\')}).po(j(){D(c).6a(\'9u\')});D(c.2p).4g(c.B.dY).4e(j(){l 6e=2B(E.B.3W);l 9G=D(c).1v(f.7Z);l 4k=f.1L.aL(6e,9G);if(4k){l 4y=4k.aT;E.6a(9G,4y)}E.1E.1B.4W();o(J)});D(c.B.dX).3x(c.B.dW,j(){E.67()})};f.1g.u.pn=j(){o(c.H!=1a)};f.1g.u.ct=j(){o(c.2p)};f.1g.u.O=j(O){if(1q O===\'3Q\')D(c.H.1j).O(O);V o(D(c.H.1j).O())};f.1g.u.1s=j(){o c.3Z.3X(c.O())};f.1g.u.dV=j(1F){3e(1F){1i f.9d:l L=c.L();if(L||c.2j)c.4M(f.64);1n;1i f.9b:c.4M(f.7R);1n;1i f.dU:c.4M(f.7Q);1n;1i f.dT:c.4M(f.7P);1n;1i f.dS:c.67();c.dC();1n;1i f.7O:c.4M(f.7O,c.B.dR);1n;3R:c.1C(1F);1n}};f.1g.u.L=j(3q){if(3q){l L=1a;if(3q.1o()==f.5l){L=c.L();3e(L.1r.1o()){1i f.6d:1i f.5l:1n;3R:l 7Y=1f 6c(f.6d,f.5l);L=c.2N(c.L(),7Y);1n}if(L!=1a){3q=(L.1r.1o()==f.6d)?f.5l:f.6d;c.9y(L,3q);c.67()}}V{l 7Y=1f 6c(f.P,f.9F,f.9E,f.9D,f.9C,f.9B,f.9A,f.5q,f.6b);L=c.2N(c.L(),7Y);if(L){l 3O=1a;if(3q.1o()==f.6b){l 2J=c.2N(c.L(),f.6b);if(2J==1a){3O=c.H.5Y(3q);L.1z.dQ(3O,L);3O.dr(L);c.5y(3O.pm)}V{l 7X=2J.6q;l 9z=7X.Y;l 7W=1a;if(9z>0)7W=7X.4v(0);1h(l x=0;x<9z;x++){2J.1z.dQ(7X.4v(0),2J)}2J.1z.pl(2J);if(7W)c.5y(7W)}}V c.9y(L,3q);c.67()}}}V o(c.1d())};f.1g.u.6a=j(4j,4y){l L=(c.2j?c.2j:D(c.1d()));L=D(L).4V(4y);D(L).6a(4j);if(!D(L).1v(f.dP))D(L).pk(c.5x)};f.1g.u.2N=j(1c,51){if(1c){l 4i=1c.1r.1o();if(1q(51)==f.dO){77(4i!=51&&4i!=f.3t){1c=1c.1z;4i=1c.1r.1o()}}V{l 7V=J;77(!7V&&4i!=f.3t){1h(l i=0;i<51.Y;i++){if(4i==51[i]){7V=R;1n}}if(!7V){1c=1c.1z;4i=1c.1r.1o()}}}if(4i!=f.3t)o(1c);V o(1a)}V o(1a)};f.1g.u.9y=j(1c,3q){l 3O=c.H.5Y(3q);l O=D(1c).O();1c.1z.pj(3O,1c);D(3O).O(O);c.5y(3O)};f.1g.u.9n=j(4N){if(!f.7U[c.B.3H]){4u{2B(D.9j({9i:c.B.9x+c.B.3H+\'.js\',9h:J}).9g)}4t(e){f.4O.9w("f: 9w 77 ph cX cI.");o 4N}}1h(l 1T in f.7U[c.B.3H]){4N=f.1L.1k(4N,c.B.69+1T+c.B.68,f.7U[c.B.3H][1T])};o(4N)};f.1g.u.dD=j(4N){o(c.B.69+4N+c.B.68)};f.1g.u.2n=j(dM){D(c.2p).4g(c.B.dN).O(dM)};f.1g.u.67=j(){l O=c.1s();D(c.7T).1H(O);D(c.2p).4g(c.B.9v).by(\'.9u\').1H(O);};f.1g.u.4M=j(65,7S,dF){l dL=7S||c.1V.B.7S;l 9m=2l.5X(\'\',\'4M\',dL);if(9m){l 4h="";3e(65){1i(f.64):4h=c.B.dK;1n;1i(f.7R):4h=c.B.dJ;1n;1i(f.7Q):4h=c.B.dI;1n;1i(f.7P):4h=c.B.dH;1n;1i(f.7O):4h=c.B.dG;1n;3R:4h=dF}l h=f.1L;l 1I=c.B.1I;1I=h.1k(1I,f.dE,c.B.4L);1I=h.1k(1I,f.9t,c.B.4S);1I=h.1k(1I,f.9s,c.B.5i+f.7E);1I=h.1k(1I,f.9r,c.B.7N);1I=h.1k(1I,f.9q,c.B.7M);1I=h.1k(1I,f.9p,c.dD(65));1I=h.1k(1I,f.9o,4h);1I=h.1k(1I,f.3N,c.3f);1I=c.9n(1I);l 4f=9m.3A;4f.pg(1I);4f.5e()}};f.1g.u.dC=j(){D(c.2p).4g(c.B.9l).pf()};f.1g.u.dj=j(){l dB=1f pe();o("E-"+dB.pd())};f.1g.u.5B=j(dA){l 3M;l L=c.1d();l aP=dA.8m(c.4s+c.4s);l 4x=1f 2O(c.4s,"g");if(L&&L.1r.1o()!=f.3t){1h(x=aP.Y-1;x>=0;x--){3M=aP[x];3M=3M.S(4x,"<br />");D(L).5G("<p>"+3M+"</p>")}}V{1h(x=0;x<aP.Y;x++){3M=aP[x];3M=3M.S(4x,"<br />");D(c.H.1j).d8("<p>"+3M+"</p>")}}};f.1g.u.8e=j(O){if(c.1E.1B.2z().1x!=1a){c.1C(f.7L,O)}V{c.5B(O)}};f.1g.u.aE=j(2k,2E){if(c.1E.1B.2z().1x!=1a){c.1C(f.7L,2k+c.1E.1B.2z().93()+2E)}};f.1g.u.aD=j(){if(c.1E.1B.2z().1x!=1a){c.1C(f.7L,c.1E.1B.2z().93())}};f.1g.u.5y=j(1c,3U){l 1S=c.H.4Y(),3V=c.1E.1B.2z();3U=3U?0:1;1S.pc(1c);3V.pb(1S);3V.aC(1c,3U);c.1E.1B.4W()};f.1g.u.4T=j(4f,2r){l 1D=4f.4U[0];if(1D){1h(l i=0;i<2r.Y;i++){l 1Y=2r[i];if(1Y.F&&1Y.1b)c.5r(1D,1Y)}}};f.1g.u.dz=j(){o D(D.7G(D(\'2h\'),j(s){o(s.1U&&s.1U.K(/7K\\.5k(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/))})).1v(\'1U\').S(/7K\\.5k(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/,\'\')};f.1g.u.dy=j(){o D(D.7G(D(\'2h\'),j(s){o(s.1U&&s.1U.K(/7K\\.5k(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/))})).1v(\'1U\')};f.1g.u.dx=j(){o D(D.7G(D(\'2h\'),j(s){o(s.1U&&s.1U.K(/7K(-(.*)){0,1}(\\.7J|\\.7I|\\.7H)?\\.js(\\?.*)?$/))})).1v(\'1U\')};f.1g.u.pa=j(){o D(D.7G(D(\'2u\'),j(s){o(s.1P&&s.1P.K(/5k\\/dw\\/(.*)7f\\.1b(\\?.*)?$/))})).1v(\'1P\')};f.1g.u.dv=j(){l 5j=1f f.3D();if(c.B.3p){5j.3X(D.9j({9i:c.B.3p,9h:J}).9g)}V{5j.3X(c.B.1D,J)}if(c.B.3W.Y==0){c.B.3W=5j.4B.3W}if(c.B.3g.Y==0){c.B.3g=5j.4B.3g}if(c.B.4A.Y==0){c.B.4A=5j.4B.4A}};f.1g.u.5u=j(){D(c.H.1j).3x("7z",c.7z)};f.1g.u.7z=j(W){l E=f.2w[c.p9.M];E.2j=(W.ds.1r.1o()==f.du)?W.ds:1a};f.dp=j(1P){l 2u=3A.5Y(\'2u\');2u.7w=\'3p\';2u.1P=1P;l 2T=D(\'2T\').5W(0);2T.dr(2u)};f.1g.u.7F=j(){if(c.B.7F&&!f.5h[c.B.3a]){l 9k=J;l 4x=1f 2O(c.B.3a+\'\\/\'+f.7E+\'$\');D(\'2u\').dq(j(){if(c.1P.K(4x))9k=R});if(!9k)f.dp(c.B.5i+f.7E)}D(c.2p).do("p8"+c.B.3a);if(c.B.dn&&!f.5h[c.B.3a]){2B(D.9j({9i:c.B.5i+f.dm,9h:J}).9g)}if(f.5h[c.B.3a]&&f.5h[c.B.3a].56)f.5h[c.B.3a].56(c)};f.5g=j(5a){l E=2l.p7.f.2w[5a];l 4f=2l.3A;l 1d=E.1d();l 65=D(E.B.dk).1H();l 62=E.dj();3e(65){1i f.64:if(1d&&1d.1r&&1d.1r.1o!=f.A)1d=D(1d).4V(f.A);if(!1d&&E.2j)1d=D(E.2j).4V(f.A);1n}if(D.2A(E.B.9f))E.B.9f(E,2l);l 1D=4f.4U[0];l 2r=2B(E.B.4A);E.4T(4f,2r);if(1d){D(E.B.9e).1H(D(1d).1v(f.9c));D(E.B.7D).1H(D(1d).1v(f.7C));D(E.B.60).1H(D(1d).1v(f.61));D(E.B.7A).1H(D(1d).1v(f.7B))}if(E.2j){D(E.B.63+" "+E.B.7D).1H(D(E.2j).1v(f.7C));D(E.B.63+" "+E.B.60).1H(D(E.2j).1v(f.61));D(E.B.63+" "+E.B.7A).1H(D(E.2j).1v(f.7B))}D(E.B.di+" "+E.B.5Z).4e(j(){l 5f=D(E.B.9e).1H();if(5f.Y>0){l 2u;if(1d[0]&&1d[0].1r.1o()==f.A){2u=1d}V{E.1C(f.9d,62);2u=D("a[1P="+62+"]",E.H.1j)}2u.1v(f.9c,5f).1v(f.61,D(E.B.60).1H())}2l.5e()});D(E.B.63+" "+E.B.5Z).4e(j(){l 5f=D(E.B.7D).1H();if(5f.Y>0){E.1C(f.9b,62);D("6Q[1U$="+62+"]",E.H.1j).1v(f.7C,5f).1v(f.61,D(E.B.60).1H()).1v(f.7B,D(E.B.7A).1H())}2l.5e()});D(E.B.dh+" "+E.B.5Z).4e(j(){l 9a=D(E.B.dg).1H();l 99=D(E.B.df).1H();if(9a>0&&99>0){l 3j=E.H.5Y(f.de);l 98=1a;l p6=1a;l da=D(E.B.dc).1H();l db=3j.p5();db.94=da;1h(x=0;x<9a;x++){98=3j.p4(x);1h(y=0;y<99;y++){98.p3(y)}}D(3j).1v(\'cr\',D(E.B.d9).1H());l 1c=D(E.2N(E.L(),f.6n)).5W(0);if(!1c||!1c.1z)D(E.H.1j).d8(3j);V D(1c).5G(3j)}2l.5e()});D(E.B.d7+" "+E.B.5Z).4e(j(){l d5=D(E.B.d6).1H();E.5B(d5);2l.5e()});D(E.B.d4+" "+E.B.d3).O(E.1s());D(E.B.d2).7z(j(){2l.5e()});if(D.2A(E.B.97))E.B.97(E,2l)};f.2W=j(){c.7y=3A.5Y(\'N\');o c};f.2W.u.C=j(F,1Q,5X){1Q=1Q||J;5X=5X||J;o\'<\'+F+(1Q?c.96(1Q):\'\')+(5X?\'>\':\' />\')};f.2W.u.p2=j(F,2b,1Q){1Q=1Q||J;o\'<\'+F+(1Q?c.96(1Q):\'\')+\'>\'+2b+\'</\'+F+\'>\'};f.2W.u.p1=j(2b){o\'<![p0[\'+2b+\']]>\'};f.2W.u.cZ=j(3L){o c.d1(c.cY(3L))};f.2W.u.d1=j(d0){o d0.S(/&oZ;([a-z]+|(#\\d+));/ig,"&$1;")};f.2W.u.96=j(1Q){l 3L=c;3L.95=\'\';1h(l 1T in 1Q){l oY=\'\';l Q=1Q[1T];if(1q Q!=\'j\'&&Q.Y>0){if(ck(1T)==1T&&1q Q==\'4C\'){1T=Q.oX();Q=Q.4Q()}if(1T!=\'\'&&Q!=\'\'){3L.95+=\' \'+1T+\'="\'+3L.cZ(Q)+\'"\'}}}o 3L.95};f.2W.u.cY=j(3Q,7x){c.7y.94=3Q;c.7y.oW=3Q;l 1N=c.7y.94;if(1q 7x==\'2d\'){if(7x!=J)1N=1N.S(\'"\',\'&oV;\');if(7x==R)1N=1N.S(\'"\',\'&#oU;\')}o 1N};f.2W.u.oT=j(5c){l 1N=[];l 2g=5c.8m(/((=\\s*")(")("))|((=\\s*\\\')(\\\')(\\\'))|((=\\s*[^>\\s]*))/g);if(2g.93()!=5c){1h(l k in 2g){l v=2g[k];if(1q v!=\'j\'&&v.Y!=0){l re=1f 2O(\'(\\\\w+)\\\\s*\'+v);if(K=5c.K(re)){l Q=v.S(/^[\\s=]+/,"");l 5d=Q.oS(0);5d=5d==\'"\'?\'"\':(5d=="\'"?"\'":\'\');if(5d!=\'\'){Q=5d==\'"\'?Q.S(/^"|"+$/g,\'\'):Q.S(/^\'|\'+$/g,\'\')}5c=5c.S(K[0],\'\');1N.1X([K[1],Q])}}}}o 1N};f.bz={"8V":{"oR":{"59":["55","2T","O","7i","1R","2h","1m","M"],"G":["I","id","1m","M","cW","cV"]},"cX":{"59":["55","br","hr","1K","1R","2h"],"G":{"3z":["92","cL"],"0":"3H","1":"3L:3H"}},"cU":{"G":{"cW":/^(\\w){1}$/,"cV":/^(\\d)+$/}}},"8W":{"2l":{"7b":["1j"],"G":["4K","oQ"]},"1M":{"7b":["1M","1y","4G","4X","a","1p","2t"],"G":["oP","oO","oN","oM","oL","aK"]},"cU":{"59":["55","6S","br","cu","oK","2T","O","1K","7i","1R","2h","1m","M"],"G":["oJ","oI","aJ"]},"oH":{"59":["55","6S","br","2T","O","7i","1R","2h","1m","M"],"G":["aI","oG","oF","oE","oD","oC","oB"]}},"1J":{"a":{"G":{"0":"7g","1":"cS","2":"1P","3":"cE","4":"F","7w":/^(7v|cT|3p|2L|5U|7n|7r|5a|7p|7q|7s|7m|7l|7u|7o|7t||7k|7j)+$/,"cD":/^(7v|cT|3p|2L|5U|7n|7r|5a|7p|7q|7s|7m|7l|7u|7o|7t||7k|7j)+$/,"cR":/^(cQ|cP|8F|cO|cN|cM)$/,"5":"1e"}},"0":"6T","1":"8y","2":"6L","bv":{"G":{"0":"5b","1":"cS","2":"1P","oA":/^(R|J)$/,"cR":/^(cQ|cP|8F|cO|cN|cM)$/},"2c":["5b"]},"3":"b","55":{"G":["1P"],"2c":["1P"]},"6S":{"G":{"3z":/^(92|cL)$/},"2c":["3z"]},"4":"bu","2J":{"G":["54"]},"5":"1j","6":"br","2t":{"G":{"2Z":/^(2Z)$/,"1e":/^(2t|cH|cG)$/,"0":"Q"},"3K":"1M"},"7":"bt","8":"54","9":"bs","6R":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","3r":/^(\\d)+$/,"49":/^(3o|48|47|45)$/,"2":"4J"},"3K":"5K"},"5K":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","3r":/^(\\d)+$/,"49":/^(3o|48|47|45)$/,"2":"4J"}},"10":"dd","8x":{"G":{"0":"54","cF":/^([0-9]){8}/}},"11":"N","12":"bq","13":"dl","14":"dt","15":"em","2U":{"3K":"1M"},"1M":{"G":{"0":"5N","1":"5Q","2":"5Q-7g","3":"oz","oy":/^(5W|ox)$/},"2c":["5N"]},"2T":{"G":["cK"]},"16":"h1","17":"h2","18":"h3","19":"h4","20":"h5","21":"h6","22":"hr","O":{"G":["ow"]},"23":"i","6Q":{"G":["5b","1U","7h","ov","ou","cB","4J"],"2c":["5b","1U"]},"1y":{"G":{"0":"5Q","1":"5b","cJ":/^(cJ)$/,"2Z":/^(2Z)$/,"ot":/^(\\d)+$/,"2":"F","8X":/^(8X)$/,"2G":/^(\\d)+$/,"3":"1U","1e":/^(2t|os|cI|5V|bx|oq|op|cH|cG|X)$/,"4":"Q"},"3K":"1M"},"bp":{"G":{"0":"54","cF":/^([0-9]){8}/}},"24":"bo","1p":{"G":["1h"],"3K":"1M"},"25":"3k","26":"li","2u":{"G":{"0":"7g","1":"1P","2":"cE","8Z":/^(8Y|cv|cw|cx|7f|oo|,|;|)+$/i,"7w":/^(7v|7u|7t|7s|7r|7q|7p|7o|cC|5a|5U|7n|7m|2L|3p|7l||7k|7j)+$/i,"cD":/^(7v|7u|7t|7s|7r|7q|7p|7o|cC|5a|5U|7n|7m|2L|3p|7l||7k|7j)+$/i,"3":"1e"},"3K":"2T"},"bn":{"G":["id","F"],"2c":["id"]},"7i":{"G":{"0":"2b","91-bw":/^(2b\\-1e|om|ok|oj\\-oi)$/i,"1":"F","2":"oh"},"2c":["2b"]},"27":"8E","4C":{"G":["og","of","oe","od","4z","oc","7h","F","ob","1e","cB","4J"]},"28":"ol","bm":{"G":{"0":"1p","2Z":/^(2Z)$/},"2c":["1p"]},"6O":{"G":{"0":"1p","2Z":/^(2Z)$/,"1d":/^(1d)$/,"1":"Q"},"3K":"4X"},"29":"p","1R":{"G":{"0":"1e","cA":/^(4z|oa|4C)$/,"1":"cA","2":"Q"},"2c":["F"]},"30":"41","q":{"G":["54"]},"31":"bl","2h":{"G":{"1e":/^(X\\/o9|X\\/90|X\\/o8|X\\/o7|X\\/o6|X\\/3L)$/,"0":"7g","cz":/^(cz)$/,"1":"1U"},"2c":["1e"]},"4X":{"G":{"2Z":/^(2Z)$/,"cy":/^(cy)$/,"0":"F","1":"2G"},"3K":"1M"},"32":"bk","33":"3r","34":"3c","1m":{"G":{"0":"1e","8Z":/^(7f|o5|o4|cx|o3|cw|cv|o2|8Y)$/},"2c":["1e"]},"35":"3b","36":"3P","3j":{"G":{"0":"cs","1":"o1","2":"o0","cu":/^(nZ|nY|nX|nW|nV|nU|nT|ct|cs)$/,"nS":/^(nR|nQ|7d|7e|8Y)$/,"3":"cr","4":"4J"}},"8D":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","49":/^(3o|48|47|45)$/}},"4F":{"G":{"0":"6T","4d":/^(2k|2E|4c|4b|2Y)$/,"1":"cq","2":"2Y","3":"4a","cp":/^(\\d)+$/,"4":"co","cn":/^(\\d)+$/,"1G":/^(6R|5K|1O|cm)$/,"49":/^(3o|48|47|45)$/}},"4G":{"G":["7e","7d","2Z","F","8X"],"2c":["7e","7d"],"3K":"1M"},"8C":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","49":/^(3o|48|47)$/,"2":"45"}},"5I":{"G":{"0":"6T","4d":/^(2k|2E|4c|4b|2Y)$/,"1":"cq","2":"2Y","3":"4a","cp":/^(\\d)+$/,"4":"co","cn":/^(\\d)+$/,"1G":/^(6R|5K|1O|cm)$/,"49":/^(3o|48|47|45)$/}},"8B":{"G":{"4d":/^(2E|2k|4c|4b)$/,"0":"2Y","1":"4a","49":/^(3o|48|47|45)$/}},"37":"M","6P":{"G":{"4d":/^(2E|2k|4c|4b|2Y)$/,"0":"2Y","1":"4a","49":/^(3o|48|47|45)$/}},"38":"bj","39":"2I","40":"l"},6G:[],6F:[],5p:j(C,G){l 7c={};l cl=c.cf(C);1h(l 2i in G){l Q=G[2i];l h=f.1L;if(!h.2F(c.6G,2i)&&!h.2F(c.6F,Q)){if(1q Q!=\'j\'&&h.2F(cl,2i)){if(c.ch(C,2i)){if(c.cg(C,2i,Q)){7c[2i]=Q}}V{7c[2i]=Q}}}}o 7c},ce:j(C){l 1N=[];if(c.1J[C]&&c.1J[C][\'G\']){1h(k in c.1J[C][\'G\']){1N.1X(ck(k)==k?c.1J[C][\'G\'][k]:k)}}o 1N},ci:j(){l 1N=[];1h(l 1T in c.8W){1N.1X(c.8W[1T])}1h(l 1T in c.8V){1N.1X(c.8V[1T])}o 1N},cj:j(C){if(c.1J[C]){o R}1h(l 1T in c.1J){if(c.1J[1T]==C){o R}}o J},cd:j(C){l 8T=[];if(c.cj(C)){l 8U=c.ci();1h(l 1T in 8U){l 3J=8U[1T];if(1q 3J==\'4C\'){l h=f.1L;if((3J[\'59\']&&h.2F(3J[\'59\'],C))||(3J[\'7b\']&&!h.2F(3J[\'7b\'],C))){nP}l 7a=3J[\'G\']?3J[\'G\']:3J[\'nO\'];1h(l k in 7a){8T.1X(1q 7a[k]!=\'3Q\'?k:7a[k])}}}}o 8T},ch:j(C,2i){o c.1J[C]&&((c.1J[C][\'G\']&&c.1J[C][\'G\'][2i])||(c.1J[C][\'2c\']&&f.1L.2F(c.1J[C][\'2c\'],2i)))},cg:j(C,2i,Q){if(c.1J[C]&&(c.1J[C][\'G\']&&c.1J[C][\'G\'][2i]&&Q.Y>0&&!Q.K(c.1J[C][\'G\'][2i]))||(c.1J[C]&&c.1J[C][\'2c\']&&f.1L.2F(c.1J[C][\'2c\'],2i)&&Q.Y==0)){o J}o 1q c.1J[C]!=\'2d\'},cf:j(C){if(!c.5T){c.5T={}}if(!c.5T[C]){c.5T[C]=c.ce(C).nN(c.cd(C))}o c.5T[C]}};f.2X=j(78){c.4I=78;c.44=[];c.8S=[];c.5S=1a;o c};f.2X.u.43=j(3n,1p){1p=1p||R;l 58=c.44.Y;c.44[58]=3n;c.8S[58]=1p;c.5S=1a};f.2X.u.K=j(cc){if(c.44.Y==0){o[J,\'\']}l 2g=cc.K(c.cb());if(!2g){o[J,\'\']}l K=2g[0];1h(l i=1;i<2g.Y;i++){if(2g[i]){o[c.8S[i-1],K]}}o[R,2g[0]]};f.2X.u.cb=j(){if(c.5S==1a){1h(l i=0,58=c.44.Y;i<58;i++){c.44[i]=\'(\'+c.c9(c.ca(c.44[i]).S(/([\\/\\(\\)])/g,\'\\\\$1\'))+\')\'}c.5S=1f 2O(c.44.6u("|"),c.c1())}o c.5S};f.2X.u.ca=j(79){o 79.S(/\\(\\?(i|m|s|x|U)\\)/,\'~~~~~~c8\\$1~~~~~~\').S(/\\(\\?(\\-[i|m|s|x|U])\\)/,\'~~~~~~c7\\$1~~~~~~\').S(/\\(\\?\\=(.*)\\)/,\'~~~~~~c6\\$1~~~~~~\').S(/\\(\\?\\!(.*)\\)/,\'~~~~~~c5\\$1~~~~~~\').S(/\\(\\?\\<\\=(.*)\\)/,\'~~~~~~c4\\$1~~~~~~\').S(/\\(\\?\\<\\!(.*)\\)/,\'~~~~~~c3\\$1~~~~~~\').S(/\\(\\?\\:(.*)\\)/,\'~~~~~~c2\\$1~~~~~~\')};f.2X.u.c9=j(79){o 79.S(/~~~~~~c8(.{1})~~~~~~/,"(?\\$1)").S(/~~~~~~c7(.{2})~~~~~~/,"(?\\$1)").S(/~~~~~~c6(.*)~~~~~~/,"(?=\\$1)").S(/~~~~~~c5(.*)~~~~~~/,"(?!\\$1)").S(/~~~~~~c4(.*)~~~~~~/,"(?<=\\$1)").S(/~~~~~~c3(.*)~~~~~~/,"(?<!\\$1)").S(/~~~~~~c2(.*)~~~~~~/,"(?:\\$1)")};f.2X.u.c1=j(){o(c.4I?"m":"mi")};f.5R=j(2L){c.57=[2L];o c};f.5R.u.8O=j(){o c.57[c.57.Y-1]};f.5R.u.8Q=j(2a){c.57.1X(2a)};f.5R.u.8R=j(){if(c.57.Y==1){o J}c.57.4Q();o R};f.71=1;f.bZ=2;f.3E=3;f.5E=4;f.6Y=5;f.2f=j(3Z,2L,78){2L=2L||\'5Q\';c.4I=78||J;c.2o={};c.8P=3Z;c.42=1f f.5R(2L);c.2K={};c.2K[2L]=2L;o c};f.2f.u.43=j(3n,T){l T=T||"5Q";if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n);if(1q c.2K[T]==\'2d\'){c.2K[T]=T}};f.2f.u.2Q=j(3n,T,5P){if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n,5P);if(1q c.2K[5P]==\'2d\'){c.2K[5P]=5P}};f.2f.u.2H=j(3n,T){if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n,"bX");if(1q c.2K[T]==\'2d\'){c.2K[T]=T}};f.2f.u.4E=j(3n,T,5O){if(1q c.2o[T]==\'2d\'){c.2o[T]=1f f.2X(c.4I)}c.2o[T].43(3n,\'bV\'+5O);if(1q c.2K[5O]==\'2d\'){c.2K[5O]=5O}};f.2f.u.8q=j(T,75){c.2K[T]=75};f.2f.u.3X=j(1w){if(1q c.8P==\'2d\'){o J}l Y=1w.Y;l 3I;77(1q(3I=c.bR(1w))==\'4C\'){l 1w=3I[0];l 76=3I[1];l 3m=3I[2];l T=3I[3];if(!c.c0(76,3m,T)){o J}if(1w==\'\'){o R}if(1w.Y==Y){o J}Y=1w.Y}if(!3I){o J}o c.4H(1w,f.3E)};f.2f.u.c0=j(76,3m,T){T=T||J;if(!c.4H(76,f.3E)){o J}if(1q T==\'nM\'){o c.4H(3m,f.bZ)}if(c.bY(T)){if(!c.4H(3m,f.5E)){o J}o c.42.8R()}if(c.bW(T)){c.42.8Q(c.bU(T));if(!c.4H(3m,f.6Y)){o J}o c.42.8R()}c.42.8Q(T);o c.4H(3m,f.71)};f.2f.u.bY=j(T){o(T==="bX")};f.2f.u.bW=j(T){o(T.6y(0,1)=="bV")};f.2f.u.bU=j(T){o T.6y(1)};f.2f.u.4H=j(2b,bS){if(2b===\'\'){o R}l bT=c.42.8O();l 75=c.2K[bT];l 1N;2B(\'1N = c.8P.\'+75+\'(2b, bS);\');o 1N};f.2f.u.bR=j(1w){l 3m=c.2o[c.42.8O()].K(1w);l K=3m[1];l 5N=3m[0];if(5N){l 8N=1w.8h(K);l bQ=1w.aN(0,8N);1w=1w.6y(8N+K.Y);o[1w,bQ,K,5N]}o R};f.3l=j(3Z){D.53(c,1f f.2f(3Z,\'3h\'));c.8q(\'3h\',\'3h\');c.bP();c.56();o c};f.3l.u.56=j(){};f.3l.u.bP=j(){c.bO(\'3h\');c.bN(\'3h\');c.bM(\'3h\');c.bL(\'3h\')};f.3l.u.bO=j(1G){c.2Q("<!--",1G,\'8M\');c.2H("-->",\'8M\')};f.3l.u.bN=j(1G){c.2Q("<2h",1G,\'8L\');c.2H("</2h>",\'8L\')};f.3l.u.bM=j(1G){c.2Q("<1m",1G,\'8K\');c.2H("</1m>",\'8K\')};f.3l.u.bL=j(1G){c.4E("<\\\\s*[a-5F-9:\\-]+\\\\s*>",1G,\'72\');c.2Q("<[a-5F-9:\\-]+"+\'[\\\\\\/ \\\\\\>]+\',1G,\'72\');c.bK(\'72\');c.4E("</\\\\s*[a-5F-9:\\-]+\\\\s*>",1G,\'bG\')};f.3l.u.bK=j(1G){c.4E(\'\\\\s+\',1G,\'52\');c.bJ(1G);c.2H(\'/>\',1G);c.2H(\'>\',1G)};f.3l.u.bJ=j(1G){c.4E("\\\\s*[a-z-8p-9]*:?[a-z-8p-9]+\\\\s*(?=\\=)\\\\s*",1G,\'bB\');c.2Q(\'=\\\\s*"\',1G,\'6X\');c.43("\\\\\\\\\\"",\'6X\');c.2H(\'"\',\'6X\');c.2Q("=\\\\s*\'",1G,\'6W\');c.43("\\\\\\\\\'",\'6W\');c.2H("\'",\'6W\');c.4E(\'=\\\\s*[^>\\\\s]*\',1G,\'bA\')};f.1t=j(bI,T){l T=T||\'3h\';c.6D=1f f.3l(c);c.Z=bI;c.42=T;c.nL=[];c.nK=\'\';c.nJ=\'\';o c};f.1t.u.3X=j(1w){c.6D.3X(c.6N(1w));o c.6M(c.Z.bb())};f.1t.u.6N=j(1w){if(1w.K(/I="b3"/)||1w.K(/ns = "nI:nH-nG-nF/)){c.Z.b4()}o c.Z.6N(1w)};f.1t.u.6M=j(3I){if(c.Z.8w){c.Z.b2()}o c.Z.6M(3I)};f.1t.u.52=j(K,2a){o R};f.1t.u.3h=j(X){c.Z.ba(X);o R};f.1t.u.8M=j(K,2n){o c.74(K,2n,\'6J\')};f.1t.u.8L=j(K,2n){o c.74(K,2n,\'6I\')};f.1t.u.8K=j(K,2n){o c.74(K,2n,\'6H\')};f.1t.u.74=j(K,2a,1e){3e(2a){1i f.71:c.5M=K;1n;1i f.3E:c.5M+=K;1n;1i f.5E:3e(1e){1i\'6J\':c.Z.6J(c.5M+K);1n;1i\'6I\':c.Z.6I(c.5M+K);1n;1i\'6H\':c.Z.6H(c.5M+K);1n}}o R};f.1t.u.72=j(K,2a){3e(2a){1i f.71:c.bH=c.6Z(K);c.5L={};1n;1i f.6Y:c.8J(c.6Z(K));1n;1i f.5E:c.8J(c.bH,c.5L)}o R};f.1t.u.bG=j(K,2a){c.8G(c.6Z(K));o R};f.1t.u.8J=j(C,G){l G=G||{};c.bE(C);if(c.Z.8v(C)){c.Z.4p.1X(C);c.Z.aY(C,G);c.Z.6k(C,G);c.8I(C)}V if(c.Z.b1(C)){c.Z.b9(C,G)}V{c.Z.b8(C,G);c.8I(C)}c.Z.6E=C;c.Z.8t=R;c.Z.nE=G};f.1t.u.8G=j(C){if(c.bF(C)){c.bD(C);if(c.Z.8v(C)){l 70=c.Z.4p.4Q();if(70==J){o}V if(70!=C){C=70}c.Z.b7(C)}V{c.Z.b6(C)}}V{c.Z.b5(C)}c.Z.6E=C;c.Z.8t=J};f.1t.u.8I=j(C){c.Z.2V[C]=c.Z.2V[C]||0;c.Z.2V[C]++};f.1t.u.bF=j(C){if(c.Z.2V[C]){c.Z.2V[C]--;if(c.Z.2V[C]==0){c.Z.2V[C]=2d}o R}o J};f.1t.u.bE=j(2v){c.8H(2v,J)};f.1t.u.bD=j(C){c.8H(C,R)};f.1t.u.8H=j(2v,2S){l 2S=2S||J;if(c.Z.2V){1h(l C in c.Z.2V){l bC=c.Z.2V[C];if(bC>0&&c.Z.bi(C,2v,2S)){c.8G(C,R)}}}};f.1t.u.6K=j(){o c.Z.6K()};f.1t.u.6Z=j(C){C=C.S(/^([\\s<\\/>]*)|([\\s<\\/>]*)$/gm,\'\').1o();l 3i=c.Z.6K();if(3i[C]){o 3i[C]}o C};f.1t.u.bB=j(K,2a){if(f.6Y==2a){c.6V=K}o R};f.1t.u.6X=j(K,2a){if(f.3E==2a){c.5L[c.6V]=K}o R};f.1t.u.6W=j(K,2a){if(f.3E==2a){c.5L[c.6V]=K}o R};f.1t.u.bA=j(K,2a){c.5L[c.6V]=K.S(/^=/,\'\');o R};f.1l=j(){c.1W=\'\';c.4P=1f f.2W();c.2V={};c.3s=f.bz;c.4p=[];c.5H=[];c.8A={\'&bd;\':\'&#be;\',\'&nD;\':\'&#nC;\',\'&nB;\':\'&#nA;\',\'&nz;\':\'&#ny;\',\'&nx;\':\'&#nw;\',\'&nv;\':\'&#nt;\',\'&nr;\':\'&#nq;\',\'&np;\':\'&#nn;\',\'&nm;\':\'&#nl;\',\'&nk;\':\'&#nj;\',\'&nh;\':\'&#ng;\',\'&nf;\':\'&#nd;\',\'&by;\':\'&#nc;\',\'&nb;\':\'&#na;\',\'&n9;\':\'&#n8;\',\'&n7;\':\'&#n6;\',\'&n5;\':\'&#n4;\',\'&n3;\':\'&#n2;\',\'&n1;\':\'&#n0;\',\'&mZ;\':\'&#mY;\',\'&mX;\':\'&#mW;\',\'&mV;\':\'&#mU;\',\'&mT;\':\'&#mS;\',\'&mR;\':\'&#mQ;\',\'&mP;\':\'&#mO;\',\'&mN;\':\'&#mM;\',\'&mL;\':\'&#mK;\',\'&mJ;\':\'&#mI;\',\'&mH;\':\'&#mG;\',\'&mF;\':\'&#mE;\',\'&mD;\':\'&#mC;\',\'&mB;\':\'&#mA;\',\'&mz;\':\'&#my;\',\'&mx;\':\'&#mw;\',\'&mv;\':\'&#mt;\',\'&ms;\':\'&#mr;\',\'&mq;\':\'&#mp;\',\'&mo;\':\'&#mn;\',\'&mm;\':\'&#ml;\',\'&mk;\':\'&#mj;\',\'&mh;\':\'&#mg;\',\'&mf;\':\'&#me;\',\'&md;\':\'&#mc;\',\'&mb;\':\'&#ma;\',\'&m9;\':\'&#m8;\',\'&m7;\':\'&#m6;\',\'&m5;\':\'&#m4;\',\'&m3;\':\'&#m2;\',\'&m1;\':\'&#m0;\',\'&lZ;\':\'&#lY;\',\'&lX;\':\'&#lW;\',\'&lV;\':\'&#lU;\',\'&lT;\':\'&#lS;\',\'&lR;\':\'&#lQ;\',\'&lP;\':\'&#lO;\',\'&lN;\':\'&#lM;\',\'&lL;\':\'&#lK;\',\'&lJ;\':\'&#lI;\',\'&lH;\':\'&#lG;\',\'&lF;\':\'&#lE;\',\'&lD;\':\'&#lC;\',\'&lB;\':\'&#lA;\',\'&lz;\':\'&#ly;\',\'&lx;\':\'&#lw;\',\'&lv;\':\'&#87;\',\'&lu;\':\'&#lt;\',\'&ls;\':\'&#lr;\',\'&lq;\':\'&#lp;\',\'&lo;\':\'&#ln;\',\'&lm;\':\'&#ll;\',\'&lk;\':\'&#lj;\',\'&lh;\':\'&#lg;\',\'&lf;\':\'&#ld;\',\'&lc;\':\'&#lb;\',\'&la;\':\'&#l9;\',\'&l8;\':\'&#l7;\',\'&l6;\':\'&#l5;\',\'&l4;\':\'&#l3;\',\'&l2;\':\'&#l1;\',\'&l0;\':\'&#kZ;\',\'&kY;\':\'&#kX;\',\'&kW;\':\'&#kV;\',\'&kU;\':\'&#kT;\',\'&kS;\':\'&#kR;\',\'&kQ;\':\'&#kP;\',\'&kO;\':\'&#kN;\',\'&kM;\':\'&#kL;\',\'&kK;\':\'&#kJ;\',\'&kI;\':\'&#kH;\',\'&kG;\':\'&#kF;\',\'&kE;\':\'&#kD;\',\'&kC;\':\'&#kB;\',\'&kA;\':\'&#kz;\',\'&ky;\':\'&#kx;\',\'&kw;\':\'&#kv;\',\'&ku;\':\'&#kt;\',\'&ks;\':\'&#kr;\',\'&kq;\':\'&#kp;\',\'&ko;\':\'&#kn;\',\'&km;\':\'&#kl;\',\'&kk;\':\'&#kj;\',\'&ki;\':\'&#kh;\',\'&8F;\':\'&#kg;\',\'&kf;\':\'&#ke;\',\'&kd;\':\'&#kc;\',\'&kb;\':\'&#ka;\',\'&k9;\':\'&#k8;\',\'&k7;\':\'&#k6;\',\'&k5;\':\'&#k4;\',\'&k3;\':\'&#k2;\',\'&k1;\':\'&#k0;\',\'&jZ;\':\'&#jY;\',\'&jX;\':\'&#jW;\',\'&jV;\':\'&#jU;\',\'&jT;\':\'&#jS;\',\'&jR;\':\'&#jQ;\',\'&jP;\':\'&#jO;\',\'&jN;\':\'&#jM;\',\'&jL;\':\'&#jK;\',\'&jJ;\':\'&#jI;\',\'&jH;\':\'&#jG;\',\'&jF;\':\'&#jE;\',\'&jD;\':\'&#jC;\',\'&jB;\':\'&#jA;\',\'&jz;\':\'&#jy;\',\'&jx;\':\'&#jw;\',\'&jv;\':\'&#ju;\',\'&jt;\':\'&#jr;\',\'&jq;\':\'&#jp;\',\'&jo;\':\'&#jn;\',\'&jm;\':\'&#jl;\',\'&jk;\':\'&#jj;\',\'&ji;\':\'&#jh;\',\'&jg;\':\'&#jf;\',\'&je;\':\'&#jd;\',\'&jc;\':\'&#jb;\',\'&ja;\':\'&#j9;\',\'&j8;\':\'&#j7;\',\'&j6;\':\'&#j5;\',\'&mu;\':\'&#j4;\',\'&nu;\':\'&#j3;\',\'&j2;\':\'&#j1;\',\'&j0;\':\'&#iZ;\',\'&pi;\':\'&#iY;\',\'&iX;\':\'&#iW;\',\'&iV;\':\'&#iU;\',\'&iT;\':\'&#iS;\',\'&iR;\':\'&#iQ;\',\'&iP;\':\'&#iO;\',\'&iN;\':\'&#iM;\',\'&iL;\':\'&#iK;\',\'&iJ;\':\'&#iI;\',\'&iH;\':\'&#iG;\',\'&iF;\':\'&#iE;\',\'&iD;\':\'&#iC;\',\'&iB;\':\'&#iA;\',\'&iz;\':\'&#iy;\',\'&ix;\':\'&#iw;\',\'&iv;\':\'&#iu;\',\'&it;\':\'&#ir;\',\'&iq;\':\'&#ip;\',\'&io;\':\'&#im;\',\'&il;\':\'&#ik;\',\'&ij;\':\'&#ii;\',\'&ih;\':\'&#ie;\',\'&ic;\':\'&#ib;\',\'&ia;\':\'&#i9;\',\'&i8;\':\'&#i7;\',\'&i6;\':\'&#i5;\',\'&i4;\':\'&#i3;\',\'&i2;\':\'&#i1;\',\'&i0;\':\'&#hZ;\',\'&hY;\':\'&#hX;\',\'&hW;\':\'&#hV;\',\'&hU;\':\'&#hT;\',\'&hS;\':\'&#hR;\',\'&hQ;\':\'&#hP;\',\'&hO;\':\'&#hN;\',\'&hM;\':\'&#hL;\',\'&hK;\':\'&#hJ;\',\'&hI;\':\'&#hH;\',\'&hG;\':\'&#hF;\',\'&hE;\':\'&#hD;\',\'&bx;\':\'&#hC;\',\'&hB;\':\'&#hA;\',\'&hz;\':\'&#hy;\',\'&hx;\':\'&#hw;\',\'&hv;\':\'&#hu;\',\'&ht;\':\'&#hs;\',\'&hq;\':\'&#hp;\',\'&ho;\':\'&#hn;\',\'&hm;\':\'&#hl;\',\'&hk;\':\'&#hj;\',\'&hi;\':\'&#hh;\',\'&hg;\':\'&#hf;\',\'&he;\':\'&#hd;\',\'&hc;\':\'&#hb;\',\'&ha;\':\'&#h9;\',\'&h8;\':\'&#h7;\',\'&h0;\':\'&#gZ;\',\'&gY;\':\'&#gX;\',\'&gW;\':\'&#gV;\',\'&gU;\':\'&#gT;\',\'&gS;\':\'&#gR;\',\'&gQ;\':\'&#gP;\',\'&gO;\':\'&#gN;\',\'&ni;\':\'&#gM;\',\'&gL;\':\'&#gK;\',\'&gJ;\':\'&#gI;\',\'&gH;\':\'&#gG;\',\'&gF;\':\'&#gE;\',\'&gD;\':\'&#gC;\',\'&6U;\':\'&#gB;\',\'&gA;\':\'&#gz;\',\'&gy;\':\'&#gx;\',\'&gw;\':\'&#gv;\',\'&or;\':\'&#gu;\',\'&gt;\':\'&#gs;\',\'&gr;\':\'&#gq;\',\'&gp;\':\'&#go;\',\'&gn;\':\'&#gl;\',\'&gk;\':\'&#gj;\',\'&gh;\':\'&#gg;\',\'&gf;\':\'&#gd;\',\'&ne;\':\'&#gc;\',\'&bw;\':\'&#gb;\',\'&le;\':\'&#ga;\',\'&ge;\':\'&#g9;\',\'&3b;\':\'&#g8;\',\'&3P;\':\'&#g7;\',\'&g6;\':\'&#g5;\',\'&g4;\':\'&#g3;\',\'&g2;\':\'&#g1;\',\'&g0;\':\'&#fZ;\',\'&fY;\':\'&#fX;\',\'&fW;\':\'&#fV;\',\'&fU;\':\'&#fT;\',\'&fS;\':\'&#fR;\',\'&fQ;\':\'&#fP;\',\'&fO;\':\'&#fN;\',\'&fM;\':\'&#fL;\',\'&3H;\':\'&#fK;\',\'&fJ;\':\'&#fI;\',\'&fH;\':\'&#fG;\',\'&fF;\':\'&#fE;\',\'&fD;\':\'&#fC;\',\'&fB;\':\'&#fA;\',\'&fz;\':\'&#fy;\'};c.8u=["a","6T","8y","6L","bv","b","55","6S","bu","2J","1j","2t","bt","54","bs","6R","5K","dd","8x","N","bq","dl","dt","em","2U","1M","2T","h1","h2","h3","h4","h5","h6","O","i","bp","bo","1p","3k","li","bn","8E","4C","ol","bm","6O","p","1R","41","q","bl","2h","4X","bk","3r","3c","1m","3b","3P","3j","8D","4F","4G","8C","5I","8B","M","6P","bj","2I","l","fx"];c.b0=["br","hr","6Q","1y"];o c};f.1l.u.bi=j(C,5J,2S){l 2S=2S||J;if(C==\'4F\'){if((2S&&5J==\'6P\')||(!2S&&5J==\'4F\')){o R}}if(C==\'6O\'){if((2S&&5J==\'4X\')||(!2S&&5J==\'6O\')){o R}}o J};f.1l.u.6N=j(1w){c.1W=\'\';o 1w};f.1l.u.6M=j(1s){1s=c.bh(1s);1s=c.bg(1s);1s=c.bf(1s);1s=c.bc(1s);o 1s};f.1l.u.bh=j(1s){1h(l 8z in c.8A){1s=1s.S(1f 2O(8z,\'g\'),c.8A[8z])}o 1s};f.1l.u.bg=j(1s){l 3i=\'em|3c|3b|3P|8y|41|8x|6L\';o 1s.S(1f 2O(\'<\\/(\'+3i+\')><\\\\1>\',\'\'),\'\').S(1f 2O(\'(\\s*<(\'+3i+\')>\\s*){2}(.*)(\\s*<\\/\\\\2>\\s*){2}\',\'\'),\'<\\$2>\\$3<\\$2>\')};f.1l.u.bf=j(1s){o 1s.S(1f 2O(\'<(\'+c.8u.6u("|").S(/\\|4F/,\'\').S(/\\|5I/,\'\')+\')>(<br \\/>|&#be;|&bd;|\\\\s)*<\\/\\\\1>\',\'g\'),\'\')};f.1l.u.bc=j(1s){l 2g=1s.K(1f 2O(\'<41[^>]*>(.*?)<\\/41>\',\'fw\'));if(2g){1h(l i=0;i<2g.Y;i++){1s=1s.S(2g[i],2g[i].S(1f 2O(\'<br \\/>\',\'g\'),fv.fu(13,10)))}}o 1s};f.1l.u.bb=j(){o c.1W};f.1l.u.6K=j(){o{\'b\':\'3c\',\'i\':\'em\'}};f.1l.u.ba=j(X){c.1W+=X};f.1l.u.6J=j(X){if(c.ft){c.1W+=X}};f.1l.u.6I=j(X){if(!c.fs){c.1W+=X}};f.1l.u.6H=j(X){if(!c.fr){c.1W+=X}};f.1l.u.6k=j(C,G){c.1W+=c.4P.C(C,c.3s.5p(C,G),R)};f.1l.u.b9=j(C,G){c.1W+=c.4P.C(C,c.3s.5p(C,G))};f.1l.u.b8=j(C,G){};f.1l.u.b7=j(C){c.1W=c.1W.S(/<br \\/>$/,\'\')+c.8r(\'aZ\',C)+"</"+C+">"+c.8r(\'5G\',C)};f.1l.u.b6=j(C){};f.1l.u.b5=j(C){c.1W+="</"+C+">"};f.1l.u.b4=j(){c.5H=[\'N\',\'3r\'];c.3s.6G=[\'1m\'];c.3s.6F=[\'b3\',\'fq\'];c.8w=R};f.1l.u.b2=j(){c.5H=[];c.3s.6G=[];c.3s.6F=[];c.8w=J};f.1l.u.8v=j(C){o!f.1L.2F(c.5H,C)&&f.1L.2F(c.8u,C)};f.1l.u.b1=j(C){o!f.1L.2F(c.5H,C)&&f.1L.2F(c.b0,C)};f.1l.u.aX=j(C,2b){c.8s(\'5G\',C,2b)};f.1l.u.fp=j(C,2b){c.8s(\'aZ\',C,2b)};f.1l.u.aY=j(C,G){if(C!=\'li\'&&(C==\'2I\'||C==\'ol\')&&c.6E&&!c.8t&&c.6E==\'li\'){c.1W=c.1W.S(/<\\/li>$/,\'\');c.aX(C,\'</li>\')}};f.1l.u.8s=j(2R,C,2b){if(!c[\'3G\'+2R+\'3F\']){c[\'3G\'+2R+\'3F\']=[]}if(!c[\'3G\'+2R+\'3F\'][C]){c[\'3G\'+2R+\'3F\'][C]=[]}c[\'3G\'+2R+\'3F\'][C].1X(2b)};f.1l.u.8r=j(2R,C){if(c[\'3G\'+2R+\'3F\']&&c[\'3G\'+2R+\'3F\'][C]&&c[\'3G\'+2R+\'3F\'][C].Y>0){o c[\'3G\'+2R+\'3F\'][C].4Q()}o\'\'};f.aW=j(3Z,2s){l 2s=(1q 2s==\'2d\'?R:2s);D.53(c,1f f.2f(3Z,(2s?\'52\':\'4D\')));c.8q(\'4D\',\'52\');if(2s==R){c.2Q("/\\\\\\3Y[<\\\\s]*f[>\\\\s]*\\\\\\3Y/",\'52\',\'4D\');c.2H("/\\\\\\3Y[<\\/\\\\s]*f[>\\\\s]*\\\\\\3Y/",\'4D\')}c.4E("[\\\\fo-fm-6]*\\\\\\fl[a-z-8p-9]+",\'4D\',\'aV\');c.2Q("/\\\\\\3Y",\'4D\',\'8o\');c.2H("\\\\\\3Y/",\'8o\');c.2Q("\\fk",\'4D\',\'6C\');c.2H("\\fj",\'6C\');c.2Q("/\\\\\\3Y",\'6C\',\'8n\');c.2H("\\\\\\3Y/",\'8n\');o c};f.3D=j(){c.6B=J;c.5D=J;c.2s=R;c.4B={\'3W\':[],\'3g\':[],\'4A\':[]};o c};f.3D.u.3X=j(1w,2s){l 2s=(1q 2s==\'2d\'?c.2s:2s);c.6D=1f f.aW(c,2s);c.6D.3X(1w)};f.3D.u.52=j(K,2a){o R};f.3D.u.8o=j(X,2n){if(X.K(/fi[a-5F-9\\s]*E[a-5F-9\\s]*/mi)){o J}if(2n==f.3E){if(!c.6B){c.5D=R;c.2m={\'M\':f.1L.4w(X)}}V{if(c.2m[c.2e]){if(!c.2m[c.2e].6z){c.2m[c.2e].6z=[X]}V{c.2m[c.2e].6z.1X(X)}}}c.6B=R}o R};f.3D.u.6C=j(K,2n){if(2n==f.3E){K=f.1L.4w(K);if(K!=\'\'){c.2m[c.2e].1m=K}}V if(2n==f.5E){c.6B=J;c.5D=J;c.aU(c.2m)}o R};f.3D.u.8n=j(K,2n){if(2n==f.3E){c.2m[c.2e].8k=K.S(/^([\\s\\/\\*]*)|([\\s\\/\\*]*)$/gm,\'\')}o R};f.3D.u.aV=j(K){K=K.S(/^([\\s\\.]*)|([\\s\\.*]*)$/gm,\'\');l C=\'\';if(K.8h(\'.\')>0){l 8l=K.8m(\'.\');c.2e=8l[1];l C=8l[0]}V{c.2e=K}if(!c.5D){c.2m={\'M\':(!C?\'\':C.fh()+\': \')+c.2e};c.5D=R}if(!c.2m[c.2e]){c.2m[c.2e]={\'F\':c.2e}}if(C){if(!c.2m[c.2e].3i){c.2m[c.2e].3i=[C]}V{c.2m[c.2e].3i.1X(C)}}o R};f.3D.u.aU=j(6A){1h(l F in 6A){l 2P=6A[F];if(1q 2P==\'4C\'&&F!=\'M\'){c.4B.3W.1X({\'F\':f.1L.4w(2P.F),\'M\':6A.M,\'aT\':f.1L.4w((2P.6z||2P.3i).6u(\', \'))});if(2P.8k){c.4B.3g.1X({\'F\':\'.\'+f.1L.4w(2P.F),\'1b\':2P.8k})}if(2P.1m){c.4B.4A.1X({\'F\':\'.\'+f.1L.4w(2P.F),\'1b\':2P.1m})}}}};D.fn.aS=j(){if(c[0].8j==3)o!(/[^\\t\\n\\r ]/.2M(c[0].4z));o J};f.aS=j(n){if(n.8j==3)o!(/[^\\t\\n\\r ]/.2M(n.4z));o J};f.fg=j(3C){o!(/[^\\t\\n\\r ]/.2M(3C))};D.fn.4V=j(4y){l n=c;if(n[0].8j==3)n=n.5z().aR(0,1);if(n.51(4y).2G()==1)o n;V o n.5z(4y).aR(0,1)};f.1L={1k:j(3C,aQ,aO){l 4x=1f 2O(aQ,"g");o(3C.S(4x,aO))},ff:j(3C,aM,8i){o(3C.aN(0,8i)+aM+3C.6y(8i))},4w:j(3C){o 3C.S(/^(\\s*)|(\\s*)$/gm,\'\')},2F:j(3B,5C){1h(l i=0;i<3B.Y;i++){if(3B[i]===5C)o R}o J},8h:j(3B,4v){l 8g=-1;1h(l i=0;i<3B.Y;i++){if(3B[i]==4v){8g=i;1n}}o(8g)},aL:j(3B,F){1h(l i=0;i<3B.Y;i++){l 4v=3B[i];if(4v.F==F)o(4v)}o(1a)}};f.2D=j(E){c.1V=E;c.5x="fe";c.4s="\\r\\n"};f.2D.u.5w=j(1K){c.1E=1K;c.H=1K.1B.3A;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);D(c.H.1j).O(c.1V.4R);l E=c;c.H.1j.aK=j(){E.H.4r="on";E.H=1K.1B.3A};c.H.fd=j(){E.6x()};c.H.aJ=j(){E.6x();E.2x()};c.H.aI=j(){E.6x()};c.H.1j.fc=j(){E.1E.1B.aH.aG=J};c.H.1j.fb=j(){E.1E.1B.aH.aG=J;E.5B(2l.fa.f9("3h"))};if(c.aF){if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();if(D.2A(c.B.3w))c.B.3w(c);c.5u()}c.aF=R;c.H.4r="on";4u{c.H=1K.1B.3A}4t(e){}};f.2D.u.1C=j(1F,1R){3e(1F){1i f.6t:1i f.6s:l L=c.2N(c.L(),f.6r);if(L){l 3v=L.1z.1z;if(L.1z.6q.Y>1||3v.1r.1o()==f.6p||3v.1r.1o()==f.6o)c.H.2q(1F)}1n;3R:if(1R)c.H.2q(1F,J,1R);V c.H.2q(1F);1n}};f.2D.u.1d=j(){l 4Z=c.1E.1B.3A.4Z;if(4Z!=1a){if(4Z.5A!=2d)o(4Z.5A())}};f.2D.u.6x=j(){c.H.4Z=c.H.3V.4Y()};f.2D.u.5r=j(1D,1Y){1D.f8(1Y.F,1Y.1b)};f.2D.u.8e=j(O){l 1S=c.H.3V.4Y();if(D(1S.5A()).5z(c.B.6w).is(\'*\')){4u{1S.8f(O)}4t(e){}}V{c.5B(O)}};f.2D.u.aE=j(2k,2E){l 1S=c.H.3V.4Y();if(D(1S.5A()).5z(c.B.6w).is(\'*\')){4u{1S.8f(2k+1S.X+2E)}4t(e){}}};f.2D.u.aD=j(){l 1S=c.H.3V.4Y();if(D(1S.5A()).5z(c.B.6w).is(\'*\')){4u{l X=1S.X;c.1C(\'f7\');1S.8f(X)}4t(e){}}};f.2D.u.2x=j(){c.2j=1a};f.2D.u.5y=j(1c,3U){l 1S=c.H.3V.4Y();3U=3U?R:J;1S.f6(1c);1S.aC(3U);1S.4X();1c.4W()};f.2C=j(E){c.1V=E;c.5x="I";c.4s="\\n"};f.2C.u.5w=j(1K){l E=c;c.1E=1K;c.H=1K.at;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);c.O(c.1V.4R);c.6v();if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();D(c.H).3x("3u",c.3u);D(c.H).3x("2x",c.2x);D(c.H).3x("4W",j(){E.6v.f5(E)});if(D.2A(c.B.3w))c.B.3w(c);c.5u()};f.2C.u.O=j(O){if(1q O===\'3Q\'){4u{c.H.4r="aB"}4t(e){};O=O.S(/<em(\\b[^>]*)>/gi,"<i$1>").S(/<\\/em>/gi,"</i>").S(/<3c(\\b[^>]*)>/gi,"<b$1>").S(/<\\/3c>/gi,"</b>");D(c.H.1j).O(O);c.6v()}V o(D(c.H.1j).O())};f.2C.u.1C=j(1F,1R){if(!c.1d())o(J);3e(1F){1i f.6t:1i f.6s:l 1x=c.1d();l 2y=c.1E.1B.2z();l 1Z=2y.1Z;if(1Z.5s=="#X")1Z=1Z.1z;1x=c.2N(1x,f.5t);1Z=c.2N(1Z,f.5t);if(1x&&1x==1Z&&1x.1r.1o()==f.6r){l 3v=1x.1z.1z;if(1x.1z.6q.Y>1||3v.1r.1o()==f.6p||3v.1r.1o()==f.6o)c.H.2q(1F,\'\',1a)}1n;3R:if(1R)c.H.2q(1F,\'\',1R);V c.H.2q(1F,\'\',1a)}l L=c.1d();if(L.1r.1o()==f.3t)c.1C(f.4q,f.P)};f.2C.u.1d=j(){l 2y=c.1E.1B.2z();l 1c=2y.1x;if(1c){if(1c.5s=="#X")o(1c.1z);V o(1c)}V o(1a)};f.2C.u.5r=j(1D,1Y){1D.8c(1Y.F+" {"+1Y.1b+"}",1D.8b.Y)};f.2C.u.3u=j(W){l E=f.2w[c.M];l L=1a;if(W.6l){if(W.1A==66){E.1C(f.8a);o J}if(W.1A==73){E.1C(f.89);o J}}V if(W.1A==13){if(!W.6m){L=E.1d();if(L&&L.1r.1o()==f.5q){W.f4();E.8e(\'<p></p>\')}}}};f.2C.u.2x=j(W){l E=f.2w[c.M];E.2j=1a;l L=1a;if(W.1A==13&&!W.6m){D(E.H.1j).aq(f.88).ap()}if(W.1A!=8&&W.1A!=17&&W.1A!=46&&W.1A!=87&&!W.ao&&!W.6l){L=E.1d();l F=L.1r.1o();if(F=="3c"||F=="b"||F=="em"||F=="i"||F=="3b"||F=="3P"||F=="a")F=L.1z.1r.1o();if(F==f.3t)E.1C(f.4q,f.P)}};f.2C.u.6v=j(){if(c.H.4r=="aB"){4u{c.H.4r="on";c.H.2q("f3",\'\',J)}4t(e){}}};f.2C.u.6k=j(C,G){l G=c.3s.5p(C,G);if(C==\'3r\'&&G.1m){l 2v=c.6j(G.1m);if(2v){c.4p.4Q();l C=2v;c.4p.1X(2v);G.1m=\'\'}V{o}}c.1W+=c.4P.C(C,G,R)};f.2C.u.6j=j(1m){if(/am/.2M(1m))o\'3c\';if(/al/.2M(1m))o\'em\';if(/3b/.2M(1m))o\'3b\';if(/ak/.2M(1m))o\'3P\';o J};f.3S=j(E){c.1V=E;c.5x="I";c.4s="\\r\\n"};f.3S.u.5w=j(1K){c.1E=1K;c.H=1K.1B.3A;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);c.H.4r="on";c.O(c.1V.4R);if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();D(c.H).3x("3u",c.3u);D(c.H).3x("2x",c.2x);if(D.2A(c.B.3w))c.B.3w(c);c.5u()};f.3S.u.1C=j(1F,1R){if(1R)c.H.2q(1F,J,1R);V c.H.2q(1F)};f.3S.u.1d=j(){l 2y=c.1E.1B.2z();l 1c=2y.1x;if(1c){if(1c.5s=="#X")o(1c.1z);V o(1c)}V o(1a)};f.3S.u.5r=j(1D,1Y){1D.8c(1Y.F+" {"+1Y.1b+"}",1D.8b.Y)};f.3S.u.3u=j(W){l E=f.2w[c.M];l 2y=E.1E.1B.2z();8d=2y.f2(0).f1;if(!D(8d).4V(f.6n.6u(","))[0]&&!D(8d).4V(\'li\')&&W.1A!=f.3T.aA&&W.1A!=f.3T.az&&W.1A!=f.3T.ay&&W.1A!=f.3T.ax&&W.1A!=f.3T.aw&&W.1A!=f.3T.av&&W.1A!=f.3T.au)E.1C(f.4q,f.P)};f.3S.u.2x=j(W){l E=f.2w[c.M];E.2j=1a};f.3d=j(E){c.1V=E;c.5x="I";c.4s="\\n"};f.3d.u.5w=j(1K){c.1E=1K;c.H=1K.at;l 1D=c.H.4U[0];l 2r=2B(c.B.3g);c.4T(c.H,2r);c.H.M=c.1V.3f;D(\'O\',c.H).1v(\'3z\',c.B.4S);c.H.4r="on";c.O(c.1V.4R);if(D.2A(c.B.3y))c.B.3y(c);c.1V.5v();D(c.H).3x("3u",c.3u);D(c.H).3x("2x",c.2x);if(D.2A(c.B.3w))c.B.3w(c);c.5u()};f.3d.u.1C=j(1F,1R){if(!c.1d())o(J);3e(1F){1i f.6t:1i f.6s:l 1x=c.1d();l 2y=c.1E.1B.2z();l 1Z=2y.1Z;if(1Z.5s=="#X")1Z=1Z.1z;1x=c.2N(1x,f.5t);1Z=c.2N(1Z,f.5t);if(1x&&1x==1Z&&1x.1r.1o()==f.6r){l 3v=1x.1z.1z;if(1x.1z.6q.Y>1||3v.1r.1o()==f.6p||3v.1r.1o()==f.6o)c.H.2q(1F,\'\',1a)}1n;1i f.as:1i f.ar:c.H.2q(1F,\'\',1a);l 1x=c.1d();l L=c.2N(1x,f.6n);if(L)D(L).f0(D(L).O());1n;3R:if(1R)c.H.2q(1F,\'\',1R);V c.H.2q(1F,\'\',1a)}l L=c.1d();if(L&&L.1r.1o()==f.3t)c.1C(f.4q,f.P)};f.3d.u.1d=j(){l 2y=c.1E.1B.2z();l 1c=2y.1x;if(1c){if(1c.5s=="#X")o(1c.1z);V o(1c)}V o(1a)};f.3d.u.5r=j(1D,1Y){1D.8c(1Y.F+" {"+1Y.1b+"}",1D.8b.Y)};f.3d.u.3u=j(W){l E=f.2w[c.M];if(W.6l){if(W.1A==66){E.1C(f.8a);o J}if(W.1A==73){E.1C(f.89);o J}}};f.3d.u.2x=j(W){l E=f.2w[c.M];E.2j=1a;l L=1a;if(W.1A==13&&!W.6m){D(E.H.1j).aq(f.88).ap();L=E.1d();if(L&&L.1r.1o()==f.5q)E.1C(f.4q,f.P);}if(W.1A==13&&W.6m){E.1C(\'eZ\')}if(W.1A!=8&&W.1A!=17&&W.1A!=46&&W.1A!=87&&!W.ao&&!W.6l){L=E.1d();l F=L.1r.1o();if(F=="3c"||F=="b"||F=="em"||F=="i"||F=="3b"||F=="3P"||F=="a"||F=="3r")F=L.1z.1r.1o();if(F==f.3t||F==f.an)E.1C(f.4q,f.P);}};f.3d.u.6k=j(C,G){l G=c.3s.5p(C,G);if(C==\'3r\'&&G.1m){l 2v=c.6j(G.1m);if(2v){c.4p.4Q();l C=2v;c.4p.1X(2v);G.1m=\'\';if(1q G[\'I\']==\'3Q\')G[\'I\']=G[\'I\'].S(/eY-1m-3r/gi,\'\')}V{o}}c.1W+=c.4P.C(C,G,R)};f.3d.u.6j=j(1m){if(/am/.2M(1m))o\'3c\';if(/al/.2M(1m))o\'em\';if(/3b/.2M(1m))o\'3b\';if(/ak/.2M(1m))o\'3P\';o J};',62,1714,'||||||||||||this|||WYMeditor||||function||var|||return||||||prototype|||||||_options|tag|jQuery|wym|name|attributes|_doc|class|false|match|container|title|div|html||value|true|replace|mode||else|evt|text|length|_Listener|||||||||||null|css|node|selected|type|new|editor|for|case|body|replaceAll|XhtmlSaxListener|style|break|toLowerCase|label|typeof|tagName|xhtml|XhtmlParser|boxHtml|attr|raw|focusNode|input|parentNode|keyCode|contentWindow|_exec|styles|_iframe|cmd|scope|val|dialogHtml|_tags|iframe|Helper|form|result|row|href|options|param|range|key|src|_wym|output|push|oCss|anchorNode|||||||||||state|content|required|undefined|_current_element|Lexer|matches|script|attribute|_selected_image|left|window|_current_item|status|_regexes|_box|execCommand|aCss|only_wym_blocks|button|link|new_tag|INSTANCES|keyup|sel|getSelection|isFunction|eval|WymClassMozilla|WymClassExplorer|right|contains|size|addExitPattern|ul|blockquote|_mode_handlers|start|test|findUp|RegExp|details|addEntryPattern|position|closing|head|fieldset|_open_tags|XmlHelper|ParallelRegex|char|disabled|||||||||||skin|sub|strong|WymClassSafari|switch|_index|editorStyles|Text|tags|table|legend|XhtmlLexer|matched|pattern|top|stylesheet|sType|span|validator|BODY|keydown|ancestor|postInit|bind|preBind|dir|document|arr|str|WymCssParser|LEXER_UNMATCHED|_closing|_insert_|lang|parsed|defaults|inside|xml|sTmp|INDEX|newNode|sup|string|default|WymClassOpera|KEY|toStart|selection|classesItems|parse|x2a|parser||pre|_mode|addPattern|_patterns|baseline||bottom|middle|valign|charoff|justify|center|align|click|doc|find|sBodyHtml|tagname|sClass|oClass|sContainer|sTool|iframeHtml|WymClass|_tag_stack|FORMAT_BLOCK|designMode|_newLine|catch|try|item|trim|rExp|jqexpr|data|dialogStyles|css_settings|object|WymCss|addSpecialPattern|td|textarea|_invokeParser|_case|width|onload|basePath|dialog|sVal|console|helper|pop|_html|direction|addCssRules|styleSheets|parentsOrSelf|focus|select|createRange|caretPos||filter|Ignore|extend|cite|base|init|_stack|count|except|index|alt|tag_attributes|delimiter|close|sUrl|INIT_DIALOG|SKINS|skinPath|CssParser|wymeditor|TH|oContainer|oTool|wym_section|getValidTagAttributes|PRE|addCssRule|nodeName|BLOCKS|listen|bindEvents|initIframe|_class|setFocusToNode|parents|parentElement|paste|elem|_has_title|LEXER_EXIT|z0|after|avoided_tags|th|now_on_tag|colgroup|_tag_attributes|_non_tag|action|special|new_mode|accept|StateStack|_regex|_possible_tag_attributes|next|hidden|get|open|createElement|submitSelector|titleSelector|TITLE|sStamp|dialogImageSelector|DIALOG_LINK|dialogType||update|stringDelimiterRight|stringDelimiterLeft|toggleClass|BLOCKQUOTE|Array|TD|aClasses|wym_dialog|wym_cancel|wym_submit|wym_dialog_type|getTagForStyle|openBlockTag|ctrlKey|shiftKey|MAIN_CONTAINERS|UL|OL|childNodes|LI|OUTDENT|INDENT|join|enableDesignMode|iframeBodySelector|saveCaret|substring|expressions|style_details|_in_style|WymCssStyle|_Lexer|last_tag|skiped_attribute_values|skiped_attributes|addCss|addScript|addComment|getTagReplacements|address|afterParsing|beforeParsing|option|tr|img|col|bdo|abbr|prop|_current_attribute|SingleQuotedAttribute|DoubleQuotedAttribute|LEXER_SPECIAL|normalizeTag|expected_tag|LEXER_ENTER|OpeningTag||_addNonTagBlock|handler|unmatched|while|case_sensitive|regex|tag_defaults|only|valid_attributes|rows|cols|screen|charset|height|meta|icon|shortcut|subsection|section|prev|help|glossary|copyright|contents|chapter|bookmark|appendix|alternate|rel|escape_quotes|_entitiesDiv|mousedown|altSelector|ALT|SRC|srcSelector|SKINS_DEFAULT_CSS|loadSkin|grep|packed|min|pack|jquery|INSERT_HTML|jQueryPath|wymPath|PREVIEW|DIALOG_PASTE|DIALOG_TABLE|DIALOG_IMAGE|dialogFeatures|_element|STRINGS|bFound|firstNode|nodes|aTypes|NAME|CLASS_NAME|TOOL_TITLE|HTML|iframeBasePath|browser|Cancel|Submit|224|BR|ITALIC|BOLD|cssRules|insertRule|startNode|insert|pasteHTML|ret|indexOf|pos|nodeType|feedback_style|parts|split|WymCssFeedbackStyle|WymCssComment|_0|mapHandler|_getClosingTagContent|_insertContentWhenClosingTag|last_tag_opened|block_tags|isBlockTag|_avoiding_tags_implicitly|del|acronym|entity|entities|thead|tfoot|tbody|noscript|circ|_callCloseTagListener|_autoCloseUnclosed|_increaseOpenTagCounter|_callOpenTagListener|Css|Script|Comment|unparsed_character_count|getCurrent|_parser|enter|leave|_labels|default_attributes|default_attributes_and_events|_attributes|_events|readonly|all|media|javascript|http|ltr|toString|innerHTML|_formated_options|tagOptions|postInitDialog|newRow|iCols|iRows|INSERT_IMAGE|HREF|CREATE_LINK|hrefSelector|preInitDialog|responseText|async|url|ajax|found|htmlSelector|wDialog|replaceStrings|DIALOG_BODY|DIALOG_TITLE|JQUERY_PATH|WYM_PATH|CSS_PATH|DIRECTION|hasfocus|htmlValSelector|error|langPath|switchTo|lgt|H6|H5|H4|H3|H2|H1|sName|sContainers|CONTAINERS_ITEMS|CONTAINER_CLASS|CONTAINER_TITLE|CONTAINER_NAME|aContainers|sClasses|CLASSES_ITEMS|CLASS_TITLE|sTools|TOOLS_ITEMS|TOOL_CLASS|TOOL_NAME|aTools|STATUS|IFRAME|CLASSES|CONTAINERS|TOOLS|LOGO|IFRAME_BASE_PATH|WYM_INDEX|SaxListener|preInit|Paste_From_Word|indent|Table|wym_title|Image|Link|wym_classes|wym_containers|wym_tools|wym_iframe|Preview|Unlink|Outdent|Indent|names|super|italic|bold|DIV|metaKey|remove|children|INSERT_UNORDEREDLIST|INSERT_ORDEREDLIST|contentDocument|DELETE|BACKSPACE|DOWN|RIGHT|UP|LEFT|ENTER|off|collapse|unwrap|wrap|_initialized|returnValue|event|onclick|onkeyup|onfocus|findByName|inserted|substr|rep||old|slice|isPhantomNode|expr|addStyleSetting|WymCssStyleDeclaration|WymCssLexer|insertContentAfterClosingTag|fixNestingBeforeOpeningBlockTag|before|inline_tags|isInlineTag|allowStylingTagsAndAttributes|MsoNormal|avoidStylingTagsAndAttributes|closeUnopenedTag|closeUnknownTag|closeBlockTag|openUnknownTag|inlineTag|addContent|getResult|removeBrInPre|nbsp|160|removeEmptyTags|joinRepeatedEntities|replaceNamedEntities|shouldCloseTagAutomatically|tt|small|samp|optgroup|map|kbd|ins|dfn||code|caption|big|area|equiv|image|not|XhtmlValidator|UnquotedAttribute|TagAttributes|counter|autoCloseUnclosedBeforeTagClosing|autoCloseUnclosedBeforeNewOpening|_decreaseOpenTagCounter|ClosingTag|_tag|Listener|addAttributeTokens|addInTagDeclarationTokens|addTagTokens|addCssTokens|addScriptTokens|addCommentTokens|addTokens|unparsed|_reduce|is_match|current|_decodeSpecial|_|_isSpecialMode|__exit|_isModeEnd|LEXER_MATCHED|_dispatchTokens|_getPerlMatchingFlags|Tk7|Tk6|Tk5|Tk4|Tk3|Tk2|Tk1|_untokenizeRegex|_tokenizeRegex|_getCompoundedRegex|subject|getDefaultAttributesAndEventsForTag|getUniqueAttributesAndEventsForTag|getPossibleTagAttributes|validateAttribute|doesAttributeNeedsValidation|getDefaultAttributesAndEventsForTags|isValidTag|parseInt|possible_attributes|rowgroup|rowspan|headers|colspan|axis|summary|border|box|frame|braille|print|projection|multiple|defer|valuetype|usemap|home|rev|hreflang|datetime|submit|reset|file|checked|profile|rtl|polygon|poly|circle|rectangle|rect|shape|coords|designates|keyboard|tabindex|accesskey|language|escapeEntities|escapeOnce|escaped|_fixDoubleEscape|cancelSelector|previewSelector|dialogPreviewSelector|sText|textSelector|dialogPasteSelector|append|summarySelector|sCaption|newCaption|captionSelector||TABLE|colsSelector|rowsSelector|dialogTableSelector|dialogLinkSelector|uniqueStamp|dialogTypeSelector||SKINS_DEFAULT_JS|initSkin|addClass|loadCss|each|appendChild|target||IMG|configureEditorUsingRawCss|skins|computeJqueryPath|computeWymPath|computeBasePath|sData|now|toggleHtml|encloseString|BASE_PATH|bodyHtml|dialogPreviewHtml|dialogPasteHtml|dialogTableHtml|dialogImageHtml|dialogLinkHtml|features|sMessage|statusSelector|STRING|CLASS|insertBefore|dialogFeaturesPreview|TOGGLE_HTML|PASTE|INSERT_TABLE|exec|updateEvent|updateSelector|classSelector|containerSelector|toolSelector|hide|containersItemHtml|containersItems|classesItemHtml|toolsItemHtml|toolsItems|statusHtml|htmlHtml|classesHtml|containersHtml|toolsHtml|logoHtml|wym_dialog_preview|wym_text|wym_dialog_paste|wym_cols|wym_rows|wym_summary|wym_caption|wym_dialog_table|Title|||wym_alt|wym_src|URL|wym_dialog_image|wym_href|wym_dialog_link|xhtml1|DTD|org|www|300|560|resizable|toolbar|titlebar|menubar|wym_html_val|wym_status|wym_html|wym_box|ToggleHtml|Paste|InsertTable|InsertImage|CreateLink|Redo|Undo|InsertUnorderedList|InsertOrderedList|Subscript|Superscript|Italic|Bold|IFRAME_DEFAULT|LANG_DEFAULT_PATH|SKINS_DEFAULT_PATH|apple|InsertLineBreak|replaceWith|startContainer|getRangeAt|styleWithCSS|preventDefault|call|moveToElementText|Cut|addRule|getData|clipboardData|onpaste|onbeforepaste|onbeforedeactivate|className|insertAt|isPhantomString|toUpperCase|end|x7d|x7b|x2e|z1||sa|insertContentBeforeClosingTag|main1|remove_embeded_styles|remove_scripts|remove_comments|fromCharCode|String|gmi|extends|9830|diams|9829|hearts|9827|clubs|9824|spades|9674|loz|9002|rang|9001|8971|rfloor|8970|lfloor|8969|rceil|8968|lceil|8901|sdot|8869|perp|8855|otimes|8853|oplus|8839|supe|8838|sube|8836|nsub|8835|8834|8805|8804|8801|8800|8776||asymp|8773|cong||8764|sim|8756||there4|8747|int|8746|cup|8745|cap|8744|8743|and|8736|ang|8734|infin|8733|8730|radic|8727|lowast|8722|minus|8721|sum|8719|prod|8715|8713|notin|8712|isin|8711|nabla|8709|empty|8707|exist|8706|part|8704|forall|||||||8660|hArr|8659|dArr|8658|rArr|8657|uArr|8656|lArr|8629|crarr|8596|harr|8595|darr|8594|rarr|8593|uarr||8592|larr|8501|alefsym|8482|trade|8476|real|8472|weierp|8465|8364|euro|8260|frasl|8254|oline|8250|rsaquo|8249|lsaquo|8243|Prime|8242|prime|8240|permil|8230|hellip|8226|bull|8225|Dagger|8224|dagger|8222|bdquo|8221|rdquo|8220|ldquo|8218|sbquo|8217|rsquo|8216|lsquo||8212|||mdash|8211|ndash|8207|rlm|8206||lrm|8205|zwj|8204||zwnj|8201|thinsp|8195|emsp|8194|ensp|982|piv|978|upsih|977|thetasym|969|omega|968|psi|967|chi|966|phi|965|upsilon|964|tau|963|sigma|962|sigmaf|961|rho|960|959|omicron|958|xi|957|956|955|lambda|954|kappa|953|iota|952|theta|951|eta|950|zeta|949|epsilon|948|delta|947|gamma|946|beta|945|alpha|937||Omega|936|Psi|935|Chi|934|Phi|933|Upsilon|932|Tau|931|Sigma|929|Rho|928|Pi|927|Omicron|926|Xi|925|Nu|924|Mu|923|Lambda|922|Kappa|921|Iota|920|Theta|919|Eta|918|Zeta|917|Epsilon|916|Delta|915|Gamma|914|Beta|913|Alpha|732|tilde|710|402|fnof|376|Yuml|353|scaron|352|Scaron|339|oelig|338|OElig|255|yuml|254|thorn|253|yacute|252|uuml|251|ucirc|250|uacute|249|ugrave|248|oslash|247|divide|246|ouml|245|otilde|244|ocirc|243|oacute|242|ograve|241|ntilde|240|eth|239|iuml|238|icirc|237|iacute|236|igrave|235|euml|234|ecirc|233|eacute|232||egrave|231|ccedil||230|aelig|229|aring|228|auml|227|atilde|226|acirc|225|aacute|agrave|223|szlig|222|THORN|221|Yacute|220|Uuml|219|Ucirc|218|Uacute|217|Ugrave|216|Oslash|215|times|214|Ouml|213|Otilde|212|Ocirc|211|Oacute|210|Ograve|209|Ntilde|208|ETH|207|Iuml|206|Icirc|205|Iacute|204|Igrave|203|Euml|202|Ecirc|201|Eacute|200|Egrave||199|Ccedil|198|AElig|197|Aring|196|Auml|195|Atilde|194||Acirc|193|Aacute|192|Agrave|191|iquest|190|frac34|189|frac12|188|frac14|187|raquo|186|ordm|185|sup1|184|cedil|183|middot|182|para|181|micro|180|acute|179|sup3|178|sup2|177|plusmn|176|deg|175|macr|174|reg|173|shy|172|171||laquo|170|ordf||169|copy|168|uml|167||sect|166|brvbar||165||yen|164|curren|163|pound|162|cent|161|iexcl|last_tag_attributes|com|microsoft|schemas|urn|_current_match|_last_match|_matches|boolean|concat|events|continue|groups|none|rules|vsides|rhs|lhs|hsides|below|above|void|cellspacing|cellpadding|aural|handheld|tv|tty|vbs|vbscript|jscript|ecmascript|ref|standby|declare|codetype|codebase|classid|archive|scheme|cookie|set|refresh||expires||speech|radio|password||checkbox|maxlength|longdesc|ismap|xmlns|post|method|enctype|nohref|onmouseup|onmouseout|onmouseover|onmousemove|onmousedown|ondblclick|mouse|onkeypress|onkeydown|frameset|onblur|onselect|onreset|onsubmit|onchange|onunload|core|charAt|parseAttributes|039|quot|textContent|shift|formated_options|amp|CDATA|cdataSection|contentTag|insertCell|insertRow|createCaption|newCol|opener|wym_skin_|ownerDocument|computeCssPath|addRange|selectNodeContents|getTime|Date|toggle|write|parsing||replaceChild|removeAttr|removeChild|firstChild|ready|blur|wym_box_|safari|opera|mozilla|msie|wymeditors|Number_Of_Cols|Number_Of_Rows|Summary|Caption|Alternative_Text|dtd|strict|TR|w3|EN|Strict|XHTML|W3C|PUBLIC|DOCTYPE|yes|scrollbars|wymupdate|iframeSelector|classesSelector|containersSelector|toolsListSelector|toolsSelector|boxSelector|Source_Code|Status|wym_classes_|Classes|wym_containers_th|Table_Header|wym_containers_blockquote|Blockquote|wym_containers_pre|Preformatted|wym_containers_h6|Heading_6|wym_containers_h5|Heading_5|wym_containers_h4|Heading_4|wym_containers_h3|Heading_3|wym_containers_h2|Heading_2|wym_containers_h1|Heading_1|wym_containers_p|Paragraph|Containers|wym_tools_preview|wym_tools_html|wym_tools_paste|wym_tools_table|wym_tools_image|wym_tools_unlink|wym_tools_link|wym_tools_redo|wym_tools_undo|wym_tools_outdent|wym_tools_indent|wym_tools_unordered_list|Unordered_List|wym_tools_ordered_list|Ordered_List|wym_tools_subscript|wym_tools_superscript|wym_tools_emphasis|Emphasis|wym_tools_strong|Strong|Tools|parent|wymiframe|wym_wymeditor_link|wym_area_bottom|wym_area_main|wym_area_right|wym_area_left|wym_area_top|TEXT|ATTRIBUTE|ELEMENT|NODE|CURSOR|HOME|END|UNLINK|FormatBlock|InsertHTML|Wym_Dialog_Body|Wym_Dialog_Title|Wym_Status|Wym_Iframe|Wym_Html|Wym_Container_Class|Wym_Containers_Title|Wym_Container_Name|Wym_Containers_Items|Wym_Containers|Wym_Class_Title|Wym_Class_Name|Wym_Classes_Items|Wym_Classes|Wym_Tool_Class|Wym_Tool_Title|Wym_Tool_Name|Wym_Tools_Items||Wym_Tools|Wym_Logo|Wym_Direction|Wym_Jquery_Path|Wym_Iframe_Base_Path|Wym_Wym_Path|Wym_Css_Path|Wym_Base_Path|wym_index|Wym_Index|rc1|VERSION|profileEnd|trace|timeEnd|time|groupEnd|group|dirxml|assert|warn|info|debug|log|firebug'.split('|'),0,{}))
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/bg.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/bg.js
new file mode 100644
index 0000000..576bca5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/bg.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['bg'] = {
+ Strong: 'Получер',
+ Emphasis: 'Курсив',
+ Superscript: 'Горен индекс',
+ Subscript: 'Долен индекс',
+ Ordered_List: 'Подреден списък',
+ Unordered_List: 'Неподреден списък',
+ Indent: 'Блок навътре',
+ Outdent: 'Блок навън',
+ Undo: 'Стъпка назад',
+ Redo: 'Стъпка напред',
+ Link: 'Създай хипервръзка',
+ Unlink: 'Премахни хипервръзката',
+ Image: 'Изображение',
+ Table: 'Таблица',
+ HTML: 'HTML',
+ Paragraph: 'Абзац',
+ Heading_1: 'Заглавие 1',
+ Heading_2: 'Заглавие 2',
+ Heading_3: 'Заглавие 3',
+ Heading_4: 'Заглавие 4',
+ Heading_5: 'Заглавие 5',
+ Heading_6: 'Заглавие 6',
+ Preformatted: 'Преформатиран',
+ Blockquote: 'Цитат',
+ Table_Header: 'Заглавие на таблицата',
+ URL: 'URL',
+ Title: 'Заглавие',
+ Alternative_Text: 'Алтернативен текст',
+ Caption: 'Етикет',
+ Summary: 'Общо',
+ Number_Of_Rows: 'Брой редове',
+ Number_Of_Cols: 'Брой колони',
+ Submit: 'Изпрати',
+ Cancel: 'Отмени',
+ Choose: 'Затвори',
+ Preview: 'Предварителен преглед',
+ Paste_From_Word: 'Вмъкни от MS WORD',
+ Tools: 'Инструменти',
+ Containers: 'Контейнери',
+ Classes: 'Класове',
+ Status: 'Статус',
+ Source_Code: 'Източник, код'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/ca.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/ca.js
new file mode 100644
index 0000000..c342406
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/ca.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['ca'] = {
+ Strong: 'Ressaltar',
+ Emphasis: 'Emfatitzar',
+ Superscript: 'Superindex',
+ Subscript: 'Subindex',
+ Ordered_List: 'Llistat ordenat',
+ Unordered_List: 'Llistat sense ordenar',
+ Indent: 'Indentat',
+ Outdent: 'Sense indentar',
+ Undo: 'Desfer',
+ Redo: 'Refer',
+ Link: 'Enllaçar',
+ Unlink: 'Eliminar enllaç',
+ Image: 'Imatge',
+ Table: 'Taula',
+ HTML: 'HTML',
+ Paragraph: 'Paràgraf',
+ Heading_1: 'Capçalera 1',
+ Heading_2: 'Capçalera 2',
+ Heading_3: 'Capçalera 3',
+ Heading_4: 'Capçalera 4',
+ Heading_5: 'Capçalera 5',
+ Heading_6: 'Capçalera 6',
+ Preformatted: 'Pre-formatejat',
+ Blockquote: 'Cita',
+ Table_Header: 'Capçalera de la taula',
+ URL: 'URL',
+ Title: 'Títol',
+ Alternative_Text: 'Text alternatiu',
+ Caption: 'Llegenda',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Nombre de files',
+ Number_Of_Cols: 'Nombre de columnes',
+ Submit: 'Enviar',
+ Cancel: 'Cancel·lar',
+ Choose: 'Triar',
+ Preview: 'Vista prèvia',
+ Paste_From_Word: 'Pegar des de Word',
+ Tools: 'Eines',
+ Containers: 'Contenidors',
+ Classes: 'Classes',
+ Status: 'Estat',
+ Source_Code: 'Codi font'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/cs.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/cs.js
new file mode 100644
index 0000000..3939d71
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/cs.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['cs'] = {
+ Strong: 'Tučné',
+ Emphasis: 'Kurzíva',
+ Superscript: 'Horní index',
+ Subscript: 'Dolní index',
+ Ordered_List: 'Číslovaný seznam',
+ Unordered_List: 'Nečíslovaný seznam',
+ Indent: 'Zvětšit odsazení',
+ Outdent: 'Zmenšit odsazení',
+ Undo: 'Zpět',
+ Redo: 'Znovu',
+ Link: 'Vytvořit odkaz',
+ Unlink: 'Zrušit odkaz',
+ Image: 'Obrázek',
+ Table: 'Tabulka',
+ HTML: 'HTML',
+ Paragraph: 'Odstavec',
+ Heading_1: 'Nadpis 1. úrovně',
+ Heading_2: 'Nadpis 2. úrovně',
+ Heading_3: 'Nadpis 3. úrovně',
+ Heading_4: 'Nadpis 4. úrovně',
+ Heading_5: 'Nadpis 5. úrovně',
+ Heading_6: 'Nadpis 6. úrovně',
+ Preformatted: 'Předformátovaný text',
+ Blockquote: 'Citace',
+ Table_Header: 'Hlavičková buňka tabulky',
+ URL: 'Adresa',
+ Title: 'Text po najetí myší',
+ Alternative_Text: 'Text pro případ nezobrazení obrázku',
+ Caption: 'Titulek tabulky',
+ Summary: 'Shrnutí obsahu',
+ Number_Of_Rows: 'Počet řádek',
+ Number_Of_Cols: 'Počet sloupců',
+ Submit: 'Vytvořit',
+ Cancel: 'Zrušit',
+ Choose: 'Vybrat',
+ Preview: 'Náhled',
+ Paste_From_Word: 'Vložit z Wordu',
+ Tools: 'Nástroje',
+ Containers: 'Typy obsahu',
+ Classes: 'Třídy',
+ Status: 'Stav',
+ Source_Code: 'Zdrojový kód'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/cy.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/cy.js
new file mode 100644
index 0000000..7d15b79
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/cy.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['cy'] = {
+ Strong: 'Bras',
+ Emphasis: 'Italig',
+ Superscript: 'Uwchsgript',
+ Subscript: 'Is-sgript',
+ Ordered_List: 'Rhestr mewn Trefn',
+ Unordered_List: 'Pwyntiau Bwled',
+ Indent: 'Mewnoli',
+ Outdent: 'Alloli',
+ Undo: 'Dadwneud',
+ Redo: 'Ailwneud',
+ Link: 'Cysylltu',
+ Unlink: 'Datgysylltu',
+ Image: 'Delwedd',
+ Table: 'Tabl',
+ HTML: 'HTML',
+ Paragraph: 'Paragraff',
+ Heading_1: 'Pennawd 1',
+ Heading_2: 'Pennawd 2',
+ Heading_3: 'Pennawd 3',
+ Heading_4: 'Pennawd 4',
+ Heading_5: 'Pennawd 5',
+ Heading_6: 'Pennawd 6',
+ Preformatted: 'Rhagfformat',
+ Blockquote: 'Bloc Dyfyniad',
+ Table_Header: 'Pennyn Tabl',
+ URL: 'URL',
+ Title: 'Teitl',
+ Alternative_Text: 'Testun Amgen',
+ Caption: 'Pennawd',
+ Summary: 'Crynodeb',
+ Number_Of_Rows: 'Nifer y rhesi',
+ Number_Of_Cols: 'Nifer y colofnau',
+ Submit: 'Anfon',
+ Cancel: 'Diddymu',
+ Choose: 'Dewis',
+ Preview: 'Rhagolwg',
+ Paste_From_Word: 'Gludo o Word',
+ Tools: 'Offer',
+ Containers: 'Cynhwysyddion',
+ Classes: 'Dosbarthiadau',
+ Status: 'Statws',
+ Source_Code: 'Cod ffynhonnell'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/de.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/de.js
new file mode 100644
index 0000000..a1e01e1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/de.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['de'] = {
+ Strong: 'Fett',
+ Emphasis: 'Kursiv',
+ Superscript: 'Text hochstellen',
+ Subscript: 'Text tiefstellen',
+ Ordered_List: 'Geordnete Liste einfügen',
+ Unordered_List: 'Ungeordnete Liste einfügen',
+ Indent: 'Einzug erhöhen',
+ Outdent: 'Einzug vermindern',
+ Undo: 'Befehle rückgängig machen',
+ Redo: 'Befehle wiederherstellen',
+ Link: 'Hyperlink einfügen',
+ Unlink: 'Hyperlink entfernen',
+ Image: 'Bild einfügen',
+ Table: 'Tabelle einfügen',
+ HTML: 'HTML anzeigen/verstecken',
+ Paragraph: 'Absatz',
+ Heading_1: 'Überschrift 1',
+ Heading_2: 'Überschrift 2',
+ Heading_3: 'Überschrift 3',
+ Heading_4: 'Überschrift 4',
+ Heading_5: 'Überschrift 5',
+ Heading_6: 'Überschrift 6',
+ Preformatted: 'Vorformatiert',
+ Blockquote: 'Zitat',
+ Table_Header: 'Tabellenüberschrift',
+ URL: 'URL',
+ Title: 'Titel',
+ Alternative_Text: 'Alternativer Text',
+ Caption: 'Tabellenüberschrift',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Anzahl Zeilen',
+ Number_Of_Cols: 'Anzahl Spalten',
+ Submit: 'Absenden',
+ Cancel: 'Abbrechen',
+ Choose: 'Auswählen',
+ Preview: 'Vorschau',
+ Paste_From_Word: 'Aus Word einfügen',
+ Tools: 'Werkzeuge',
+ Containers: 'Inhaltstyp',
+ Classes: 'Klassen',
+ Status: 'Status',
+ Source_Code: 'Quellcode'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/en.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/en.js
new file mode 100644
index 0000000..1e351e5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/en.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['en'] = {
+ Strong: 'Strong',
+ Emphasis: 'Emphasis',
+ Superscript: 'Superscript',
+ Subscript: 'Subscript',
+ Ordered_List: 'Ordered List',
+ Unordered_List: 'Unordered List',
+ Indent: 'Indent',
+ Outdent: 'Outdent',
+ Undo: 'Undo',
+ Redo: 'Redo',
+ Link: 'Link',
+ Unlink: 'Unlink',
+ Image: 'Image',
+ Table: 'Table',
+ HTML: 'HTML',
+ Paragraph: 'Paragraph',
+ Heading_1: 'Heading 1',
+ Heading_2: 'Heading 2',
+ Heading_3: 'Heading 3',
+ Heading_4: 'Heading 4',
+ Heading_5: 'Heading 5',
+ Heading_6: 'Heading 6',
+ Preformatted: 'Preformatted',
+ Blockquote: 'Blockquote',
+ Table_Header: 'Table Header',
+ URL: 'URL',
+ Title: 'Title',
+ Alternative_Text: 'Alternative text',
+ Caption: 'Caption',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Number of rows',
+ Number_Of_Cols: 'Number of cols',
+ Submit: 'Submit',
+ Cancel: 'Cancel',
+ Choose: 'Choose',
+ Preview: 'Preview',
+ Paste_From_Word: 'Paste from Word',
+ Tools: 'Tools',
+ Containers: 'Containers',
+ Classes: 'Classes',
+ Status: 'Status',
+ Source_Code: 'Source code'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/es.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/es.js
new file mode 100644
index 0000000..cdb03c1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/es.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['es'] = {
+ Strong: 'Resaltar',
+ Emphasis: 'Enfatizar',
+ Superscript: 'Superindice',
+ Subscript: 'Subindice',
+ Ordered_List: 'Lista ordenada',
+ Unordered_List: 'Lista sin ordenar',
+ Indent: 'Indentado',
+ Outdent: 'Sin indentar',
+ Undo: 'Deshacer',
+ Redo: 'Rehacer',
+ Link: 'Enlazar',
+ Unlink: 'Eliminar enlace',
+ Image: 'Imagen',
+ Table: 'Tabla',
+ HTML: 'HTML',
+ Paragraph: 'Párrafo',
+ Heading_1: 'Cabecera 1',
+ Heading_2: 'Cabecera 2',
+ Heading_3: 'Cabecera 3',
+ Heading_4: 'Cabecera 4',
+ Heading_5: 'Cabecera 5',
+ Heading_6: 'Cabecera 6',
+ Preformatted: 'Preformateado',
+ Blockquote: 'Cita',
+ Table_Header: 'Cabecera de la tabla',
+ URL: 'URL',
+ Title: 'Título',
+ Alternative_Text: 'Texto alternativo',
+ Caption: 'Leyenda',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Número de filas',
+ Number_Of_Cols: 'Número de columnas',
+ Submit: 'Enviar',
+ Cancel: 'Cancelar',
+ Choose: 'Seleccionar',
+ Preview: 'Vista previa',
+ Paste_From_Word: 'Pegar desde Word',
+ Tools: 'Herramientas',
+ Containers: 'Contenedores',
+ Classes: 'Clases',
+ Status: 'Estado',
+ Source_Code: 'Código fuente'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fa.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fa.js
new file mode 100644
index 0000000..9d70fcb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fa.js
@@ -0,0 +1,46 @@
+//Translation To Persian: Ghassem Tofighi (http://ght.ir)
+WYMeditor.STRINGS['fa'] = {
+ Strong: 'پررنگ',//Strong
+ Emphasis: 'ایتالیک',//Emphasis
+ Superscript: 'بالانويس‌ ',//Superscript
+ Subscript: 'زيرنويس‌',//Subscript
+ Ordered_List: 'لیست مرتب',//Ordered List
+ Unordered_List: 'لیست نامرتب',//Unordered List
+ Indent: 'افزودن دندانه',//Indent
+ Outdent: 'کاهش دندانه',//Outdent
+ Undo: 'واگردانی',//Undo
+ Redo: 'تکرار',//Redo
+ Link: 'ساختن پیوند',//Link
+ Unlink: 'برداشتن پیوند',//Unlink
+ Image: 'تصویر',//Image
+ Table: 'جدول',//Table
+ HTML: 'HTML',//HTML
+ Paragraph: 'پاراگراف',//Paragraph
+ Heading_1: 'سرتیتر ۱',//Heading 1
+ Heading_2: 'سرتیتر ۲',//Heading 2
+ Heading_3: 'سرتیتر ۳',//Heading 3
+ Heading_4: 'سرتیتر ۴',//Heading 4
+ Heading_5: 'سرتیتر ۵',//Heading 5
+ Heading_6: 'سرتیتر ۶',//Heading 6
+ Preformatted: 'قالب آماده',//Preformatted
+ Blockquote: 'نقل قول',//Blockquote
+ Table_Header: 'سرجدول',//Table Header
+ URL: 'آدرس اینترنتی',//URL
+ Title: 'عنوان',//Title
+ Alternative_Text: 'متن جایگزین',//Alternative text
+ Caption: 'عنوان',//Caption
+ Summary: 'Summary',
+ Number_Of_Rows: 'تعداد سطرها',//Number of rows
+ Number_Of_Cols: 'تعداد ستون‌ها',//Number of cols
+ Submit: 'فرستادن',//Submit
+ Cancel: 'لغو',//Cancel
+ Choose: 'انتخاب',//Choose
+ Preview: 'پیش‌نمایش',//Preview
+ Paste_From_Word: 'انتقال از ورد',//Paste from Word
+ Tools: 'ابزار',//Tools
+ Containers: '‌قالب‌ها',//Containers
+ Classes: 'کلاس‌ها',//Classes
+ Status: 'وضعیت',//Status
+ Source_Code: 'کد مبدأ'//Source code
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fi.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fi.js
new file mode 100644
index 0000000..fe1eab4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fi.js
@@ -0,0 +1,44 @@
+WYMeditor.STRINGS['fi'] = {
+ Strong: 'Lihavoitu',
+ Emphasis: 'Korostus',
+ Superscript: 'Yläindeksi',
+ Subscript: 'Alaindeksi',
+ Ordered_List: 'Numeroitu lista',
+ Unordered_List: 'Luettelomerkit',
+ Indent: 'Suurenna sisennystä',
+ Outdent: 'Pienennä sisennystä',
+ Undo: 'Kumoa',
+ Redo: 'Toista',
+ Link: 'Linkitä',
+ Unlink: 'Poista linkitys',
+ Image: 'Kuva',
+ Table: 'Taulukko',
+ HTML: 'HTML',
+ Paragraph: 'Kappale',
+ Heading_1: 'Otsikko 1',
+ Heading_2: 'Otsikko 2',
+ Heading_3: 'Otsikko 3',
+ Heading_4: 'Otsikko 4',
+ Heading_5: 'Otsikko 5',
+ Heading_6: 'Otsikko 6',
+ Preformatted: 'Esimuotoilu',
+ Blockquote: 'Sitaatti',
+ Table_Header: 'Taulukon otsikko',
+ URL: 'URL',
+ Title: 'Otsikko',
+ Alternative_Text: 'Vaihtoehtoinen teksti',
+ Caption: 'Kuvateksti',
+ Summary: 'Yhteenveto',
+ Number_Of_Rows: 'Rivien määrä',
+ Number_Of_Cols: 'Palstojen määrä',
+ Submit: 'Lähetä',
+ Cancel: 'Peruuta',
+ Choose: 'Valitse',
+ Preview: 'Esikatsele',
+ Paste_From_Word: 'Tuo Wordista',
+ Tools: 'Työkalut',
+ Containers: 'Muotoilut',
+ Classes: 'Luokat',
+ Status: 'Tila',
+ Source_Code: 'Lähdekoodi'
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fr.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fr.js
new file mode 100644
index 0000000..9b6deb9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/fr.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['fr'] = {
+ Strong: 'Mise en évidence',
+ Emphasis: 'Emphase',
+ Superscript: 'Exposant',
+ Subscript: 'Indice',
+ Ordered_List: 'Liste Ordonnée',
+ Unordered_List: 'Liste Non-Ordonnée',
+ Indent: 'Imbriqué',
+ Outdent: 'Non-imbriqué',
+ Undo: 'Annuler',
+ Redo: 'Rétablir',
+ Link: 'Lien',
+ Unlink: 'Supprimer le Lien',
+ Image: 'Image',
+ Table: 'Tableau',
+ HTML: 'HTML',
+ Paragraph: 'Paragraphe',
+ Heading_1: 'Titre 1',
+ Heading_2: 'Titre 2',
+ Heading_3: 'Titre 3',
+ Heading_4: 'Titre 4',
+ Heading_5: 'Titre 5',
+ Heading_6: 'Titre 6',
+ Preformatted: 'Pré-formatté',
+ Blockquote: 'Citation',
+ Table_Header: 'Cellule de titre',
+ URL: 'URL',
+ Title: 'Titre',
+ Alternative_Text: 'Texte alternatif',
+ Caption: 'Légende',
+ Summary: 'Résumé',
+ Number_Of_Rows: 'Nombre de lignes',
+ Number_Of_Cols: 'Nombre de colonnes',
+ Submit: 'Envoyer',
+ Cancel: 'Annuler',
+ Choose: 'Choisir',
+ Preview: 'Prévisualisation',
+ Paste_From_Word: 'Copier depuis Word',
+ Tools: 'Outils',
+ Containers: 'Type de texte',
+ Classes: 'Type de contenu',
+ Status: 'Infos',
+ Source_Code: 'Code source'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/gl.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/gl.js
new file mode 100644
index 0000000..d4786b8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/gl.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['gl'] = {
+ Strong: 'Moita énfase',
+ Emphasis: 'Énfase',
+ Superscript: 'Superíndice',
+ Subscript: 'Subíndice',
+ Ordered_List: 'Lista ordenada',
+ Unordered_List: 'Lista sen ordenar',
+ Indent: 'Aniñar',
+ Outdent: 'Desaniñar',
+ Undo: 'Desfacer',
+ Redo: 'Refacer',
+ Link: 'Ligazón',
+ Unlink: 'Desligar',
+ Image: 'Imaxe',
+ Table: 'Táboa',
+ HTML: 'HTML',
+ Paragraph: 'Parágrafo',
+ Heading_1: 'Título 1',
+ Heading_2: 'Título 2',
+ Heading_3: 'Título 3',
+ Heading_4: 'Título 4',
+ Heading_5: 'Título 5',
+ Heading_6: 'Título 6',
+ Preformatted: 'Preformatado',
+ Blockquote: 'Cita en parágrafo',
+ Table_Header: 'Cabeceira da táboa',
+ URL: 'URL',
+ Title: 'Título',
+ Alternative_Text: 'Texto alternativo',
+ Caption: 'Título',
+ Summary: 'Resumo',
+ Number_Of_Rows: 'Número de filas',
+ Number_Of_Cols: 'Número de columnas',
+ Submit: 'Enviar',
+ Cancel: 'Cancelar',
+ Choose: 'Escoller',
+ Preview: 'Previsualizar',
+ Paste_From_Word: 'Colar dende Word',
+ Tools: 'Ferramentas',
+ Containers: 'Contenedores',
+ Classes: 'Clases',
+ Status: 'Estado',
+ Source_Code: 'Código fonte'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/he.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/he.js
new file mode 100644
index 0000000..97c9675
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/he.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['he'] = {
+ Strong: 'חזק',
+ Emphasis: 'מובלט',
+ Superscript: 'כתב עילי',
+ Subscript: 'כתב תחתי',
+ Ordered_List: 'רשימה ממוספרת',
+ Unordered_List: 'רשימה לא ממוספרת',
+ Indent: 'הזחה פנימה',
+ Outdent: 'הזחה החוצה',
+ Undo: 'בטל פעולה',
+ Redo: 'בצע מחדש פעולה',
+ Link: 'קישור',
+ Unlink: 'בטל קישור',
+ Image: 'תמונה',
+ Table: 'טבלה',
+ HTML: 'קוד HTML',
+ Paragraph: 'פסקה',
+ Heading_1: 'כותרת 1 ; תג &lt;h1&gt;',
+ Heading_2: 'כותרת 2 ; תג &lt;h2&gt;',
+ Heading_3: 'כותרת 3 ; תג &lt;h3&gt;',
+ Heading_4: 'כותרת 4 ; תג &lt;h4&gt;',
+ Heading_5: 'כותרת 5 ; תג &lt;h5&gt;',
+ Heading_6: 'כותרת 6 ; תג &lt;h6&gt;',
+ Preformatted: 'משמר רווחים',
+ Blockquote: 'ציטוט',
+ Table_Header: 'כותרת טבלה',
+ URL: 'קישור (URL)',
+ Title: 'כותרת',
+ Alternative_Text: 'טקסט חלופי',
+ Caption: 'כותרת',
+ Summary: 'סיכום',
+ Number_Of_Rows: 'מספר שורות',
+ Number_Of_Cols: 'מספר טורים',
+ Submit: 'שלח',
+ Cancel: 'בטל',
+ Choose: 'בחר',
+ Preview: 'תצוגה מקדימה',
+ Paste_From_Word: 'העתק מ-Word',
+ Tools: 'כלים',
+ Containers: 'מיכלים',
+ Classes: 'מחלקות',
+ Status: 'מצב',
+ Source_Code: 'קוד מקור'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/hr.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/hr.js
new file mode 100644
index 0000000..193e31a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/hr.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['hr'] = {
+ Strong: 'Podebljano',
+ Emphasis: 'Naglašeno',
+ Superscript: 'Iznad',
+ Subscript: 'Ispod',
+ Ordered_List: 'Pobrojana lista',
+ Unordered_List: 'Nepobrojana lista',
+ Indent: 'Uvuci',
+ Outdent: 'Izvuci',
+ Undo: 'Poništi promjenu',
+ Redo: 'Ponovno promjeni',
+ Link: 'Hiperveza',
+ Unlink: 'Ukloni hipervezu',
+ Image: 'Slika',
+ Table: 'Tablica',
+ HTML: 'HTML',
+ Paragraph: 'Paragraf',
+ Heading_1: 'Naslov 1',
+ Heading_2: 'Naslov 2',
+ Heading_3: 'Naslov 3',
+ Heading_4: 'Naslov 4',
+ Heading_5: 'Naslov 5',
+ Heading_6: 'Naslov 6',
+ Preformatted: 'Unaprijed formatirano',
+ Blockquote: 'Citat',
+ Table_Header: 'Zaglavlje tablice',
+ URL: 'URL',
+ Title: 'Naslov',
+ Alternative_Text: 'Alternativni tekst',
+ Caption: 'Zaglavlje',
+ Summary: 'Sažetak',
+ Number_Of_Rows: 'Broj redova',
+ Number_Of_Cols: 'Broj kolona',
+ Submit: 'Snimi',
+ Cancel: 'Odustani',
+ Choose: 'Izaberi',
+ Preview: 'Pregled',
+ Paste_From_Word: 'Zalijepi iz Word-a',
+ Tools: 'Alati',
+ Containers: 'Kontejneri',
+ Classes: 'Klase',
+ Status: 'Status',
+ Source_Code: 'Izvorni kod'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/hu.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/hu.js
new file mode 100644
index 0000000..a8cdbc6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/hu.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['hu'] = {
+ Strong: 'Félkövér',
+ Emphasis: 'Kiemelt',
+ Superscript: 'Felső index',
+ Subscript: 'Alsó index',
+ Ordered_List: 'Rendezett lista',
+ Unordered_List: 'Rendezetlen lista',
+ Indent: 'Bekezdés',
+ Outdent: 'Bekezdés törlése',
+ Undo: 'Visszavon',
+ Redo: 'Visszaállít',
+ Link: 'Link',
+ Unlink: 'Link törlése',
+ Image: 'Kép',
+ Table: 'Tábla',
+ HTML: 'HTML',
+ Paragraph: 'Bekezdés',
+ Heading_1: 'Címsor 1',
+ Heading_2: 'Címsor 2',
+ Heading_3: 'Címsor 3',
+ Heading_4: 'Címsor 4',
+ Heading_5: 'Címsor 5',
+ Heading_6: 'Címsor 6',
+ Preformatted: 'Előformázott',
+ Blockquote: 'Idézet',
+ Table_Header: 'Tábla Fejléc',
+ URL: 'Webcím',
+ Title: 'Megnevezés',
+ Alternative_Text: 'Alternatív szöveg',
+ Caption: 'Fejléc',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Sorok száma',
+ Number_Of_Cols: 'Oszlopok száma',
+ Submit: 'Elküld',
+ Cancel: 'Mégsem',
+ Choose: 'Választ',
+ Preview: 'Előnézet',
+ Paste_From_Word: 'Másolás Word-ból',
+ Tools: 'Eszközök',
+ Containers: 'Tartalmak',
+ Classes: 'Osztályok',
+ Status: 'Állapot',
+ Source_Code: 'Forráskód'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/it.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/it.js
new file mode 100644
index 0000000..ca632a9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/it.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['it'] = {
+ Strong: 'Grassetto',
+ Emphasis: 'Corsetto',
+ Superscript: 'Apice',
+ Subscript: 'Pedice',
+ Ordered_List: 'Lista Ordinata',
+ Unordered_List: 'Lista Puntata',
+ Indent: 'Indenta',
+ Outdent: 'Caccia',
+ Undo: 'Indietro',
+ Redo: 'Avanti',
+ Link: 'Inserisci Link',
+ Unlink: 'Togli Link',
+ Image: 'Inserisci Immagine',
+ Table: 'Inserisci Tabella',
+ HTML: 'HTML',
+ Paragraph: 'Paragrafo',
+ Heading_1: 'Heading 1',
+ Heading_2: 'Heading 2',
+ Heading_3: 'Heading 3',
+ Heading_4: 'Heading 4',
+ Heading_5: 'Heading 5',
+ Heading_6: 'Heading 6',
+ Preformatted: 'Preformattato',
+ Blockquote: 'Blockquote',
+ Table_Header: 'Header Tabella',
+ URL: 'Indirizzo',
+ Title: 'Titolo',
+ Alternative_Text: 'Testo Alternativo',
+ Caption: 'Caption',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Numero di Righe',
+ Number_Of_Cols: 'Numero di Colonne',
+ Submit: 'Invia',
+ Cancel: 'Cancella',
+ Choose: 'Scegli',
+ Preview: 'Anteprima',
+ Paste_From_Word: 'Incolla',
+ Tools: 'Tools',
+ Containers: 'Contenitori',
+ Classes: 'Classi',
+ Status: 'Stato',
+ Source_Code: 'Codice Sorgente'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nb.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nb.js
new file mode 100644
index 0000000..7573b78
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nb.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['nb'] = {
+ Strong: 'Fet',
+ Emphasis: 'Uthevet',
+ Superscript: 'Opphøyet',
+ Subscript: 'Nedsenket',
+ Ordered_List: 'Nummerert liste',
+ Unordered_List: 'Punktliste',
+ Indent: 'Rykk inn',
+ Outdent: 'Rykk ut',
+ Undo: 'Angre',
+ Redo: 'Gjenta',
+ Link: 'Lenke',
+ Unlink: 'Ta bort lenken',
+ Image: 'Bilde',
+ Table: 'Tabell',
+ HTML: 'HTML',
+ Paragraph: 'Avsnitt',
+ Heading_1: 'Overskrift 1',
+ Heading_2: 'Overskrift 2',
+ Heading_3: 'Overskrift 3',
+ Heading_4: 'Overskrift 4',
+ Heading_5: 'Overskrift 5',
+ Heading_6: 'Overskrift 6',
+ Preformatted: 'Preformatert',
+ Blockquote: 'Sitat',
+ Table_Header: 'Tabelloverskrift',
+ URL: 'URL',
+ Title: 'Tittel',
+ Alternative_Text: 'Alternativ tekst',
+ Caption: 'Overskrift',
+ Summary: 'Sammendrag',
+ Number_Of_Rows: 'Antall rader',
+ Number_Of_Cols: 'Antall kolonner',
+ Submit: 'Ok',
+ Cancel: 'Avbryt',
+ Choose: 'Velg',
+ Preview: 'Forhåndsvis',
+ Paste_From_Word: 'Lim inn fra Word',
+ Tools: 'Verktøy',
+ Containers: 'Formatering',
+ Classes: 'Klasser',
+ Status: 'Status',
+ Source_Code: 'Kildekode'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nl.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nl.js
new file mode 100644
index 0000000..cdfa21c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nl.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['nl'] = {
+ Strong: 'Sterk benadrukken',
+ Emphasis: 'Benadrukken',
+ Superscript: 'Bovenschrift',
+ Subscript: 'Onderschrift',
+ Ordered_List: 'Geordende lijst',
+ Unordered_List: 'Ongeordende lijst',
+ Indent: 'Inspringen',
+ Outdent: 'Terugspringen',
+ Undo: 'Ongedaan maken',
+ Redo: 'Opnieuw uitvoeren',
+ Link: 'Linken',
+ Unlink: 'Ontlinken',
+ Image: 'Afbeelding',
+ Table: 'Tabel',
+ HTML: 'HTML',
+ Paragraph: 'Paragraaf',
+ Heading_1: 'Kop 1',
+ Heading_2: 'Kop 2',
+ Heading_3: 'Kop 3',
+ Heading_4: 'Kop 4',
+ Heading_5: 'Kop 5',
+ Heading_6: 'Kop 6',
+ Preformatted: 'Voorgeformatteerd',
+ Blockquote: 'Citaat',
+ Table_Header: 'Tabel-kop',
+ URL: 'URL',
+ Title: 'Titel',
+ Alternative_Text: 'Alternatieve tekst',
+ Caption: 'Bijschrift',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Aantal rijen',
+ Number_Of_Cols: 'Aantal kolommen',
+ Submit: 'Versturen',
+ Cancel: 'Annuleren',
+ Choose: 'Kiezen',
+ Preview: 'Voorbeeld bekijken',
+ Paste_From_Word: 'Plakken uit Word',
+ Tools: 'Hulpmiddelen',
+ Containers: 'Teksttypes',
+ Classes: 'Klassen',
+ Status: 'Status',
+ Source_Code: 'Broncode'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nn.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nn.js
new file mode 100644
index 0000000..51cec2b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/nn.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['nn'] = {
+ Strong: 'Feit',
+ Emphasis: 'Utheva',
+ Superscript: 'Opphøgd',
+ Subscript: 'Nedsenka',
+ Ordered_List: 'Nummerert liste',
+ Unordered_List: 'Punktliste',
+ Indent: 'Rykk inn',
+ Outdent: 'Rykk ut',
+ Undo: 'Angre',
+ Redo: 'Gjentaka',
+ Link: 'Lenkje',
+ Unlink: 'Ta bort lenkja',
+ Image: 'Bilete',
+ Table: 'Tabell',
+ HTML: 'HTML',
+ Paragraph: 'Avsnitt',
+ Heading_1: 'Overskrift 1',
+ Heading_2: 'Overskrift 2',
+ Heading_3: 'Overskrift 3',
+ Heading_4: 'Overskrift 4',
+ Heading_5: 'Overskrift 5',
+ Heading_6: 'Overskrift 6',
+ Preformatted: 'Preformatert',
+ Blockquote: 'Sitat',
+ Table_Header: 'Tabelloverskrift',
+ URL: 'URL',
+ Title: 'Tittel',
+ Alternative_Text: 'Alternativ tekst',
+ Caption: 'Overskrift',
+ Summary: 'Samandrag',
+ Number_Of_Rows: 'Tal på rader',
+ Number_Of_Cols: 'Tal på kolonnar',
+ Submit: 'Ok',
+ Cancel: 'Avbryt',
+ Choose: 'Vel',
+ Preview: 'Førehandsvis',
+ Paste_From_Word: 'Lim inn frå Word',
+ Tools: 'Verkty',
+ Containers: 'Formatering',
+ Classes: 'Klassar',
+ Status: 'Status',
+ Source_Code: 'Kjeldekode'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pl.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pl.js
new file mode 100644
index 0000000..d6c0471
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pl.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['pl'] = {
+ Strong: 'Nacisk',
+ Emphasis: 'Emfaza',
+ Superscript: 'Indeks górny',
+ Subscript: 'Indeks dolny',
+ Ordered_List: 'Lista numerowana',
+ Unordered_List: 'Lista wypunktowana',
+ Indent: 'Zwiększ wcięcie',
+ Outdent: 'Zmniejsz wcięcie',
+ Undo: 'Cofnij',
+ Redo: 'Ponów',
+ Link: 'Wstaw link',
+ Unlink: 'Usuń link',
+ Image: 'Obraz',
+ Table: 'Tabela',
+ HTML: 'Źródło HTML',
+ Paragraph: 'Akapit',
+ Heading_1: 'Nagłówek 1',
+ Heading_2: 'Nagłówek 2',
+ Heading_3: 'Nagłówek 3',
+ Heading_4: 'Nagłówek 4',
+ Heading_5: 'Nagłówek 5',
+ Heading_6: 'Nagłówek 6',
+ Preformatted: 'Preformatowany',
+ Blockquote: 'Cytat blokowy',
+ Table_Header: 'Nagłówek tabeli',
+ URL: 'URL',
+ Title: 'Tytuł',
+ Alternative_Text: 'Tekst alternatywny',
+ Caption: 'Tytuł tabeli',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Liczba wierszy',
+ Number_Of_Cols: 'Liczba kolumn',
+ Submit: 'Wyślij',
+ Cancel: 'Anuluj',
+ Choose: 'Wybierz',
+ Preview: 'Podgląd',
+ Paste_From_Word: 'Wklej z Worda',
+ Tools: 'Narzędzia',
+ Containers: 'Format',
+ Classes: 'Styl',
+ Status: 'Status',
+ Source_Code: 'Kod źródłowy'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pt-br.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pt-br.js
new file mode 100644
index 0000000..2ec18fe
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pt-br.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['pt-br'] = {
+ Strong: 'Resaltar',
+ Emphasis: 'Enfatizar',
+ Superscript: 'Sobre escrito',
+ Subscript: 'Sub escrito ',
+ Ordered_List: 'Lista ordenada',
+ Unordered_List: 'Lista desordenada',
+ Indent: 'Indentado',
+ Outdent: 'Desidentar',
+ Undo: 'Desfazer',
+ Redo: 'Refazer',
+ Link: 'Link',
+ Unlink: 'Remover Link',
+ Image: 'Imagem',
+ Table: 'Tabela',
+ HTML: 'HTML',
+ Paragraph: 'Parágrafo',
+ Heading_1: 'Título 1',
+ Heading_2: 'Título 2',
+ Heading_3: 'Título 3',
+ Heading_4: 'Título 4',
+ Heading_5: 'Título 5',
+ Heading_6: 'Título 6',
+ Preformatted: 'Preformatado',
+ Blockquote: 'Citação',
+ Table_Header: 'Título de tabela',
+ URL: 'URL',
+ Title: 'Título',
+ Alternative_Text: 'Texto alternativo',
+ Caption: 'Legenda',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Número de linhas',
+ Number_Of_Cols: 'Número de colunas',
+ Submit: 'Enviar',
+ Cancel: 'Cancelar',
+ Choose: 'Selecionar',
+ Preview: 'Previsualizar',
+ Paste_From_Word: 'Copiar do Word',
+ Tools: 'Ferramentas',
+ Containers: 'Conteneiners',
+ Classes: 'Classes',
+ Status: 'Estado',
+ Source_Code: 'Código fonte'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pt.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pt.js
new file mode 100644
index 0000000..a3d1a17
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/pt.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['pt'] = {
+ Strong: 'Negrito',
+ Emphasis: 'Itálico',
+ Superscript: 'Sobrescrito',
+ Subscript: 'Subsescrito',
+ Ordered_List: 'Lista Numerada',
+ Unordered_List: 'Lista Marcada',
+ Indent: 'Aumentar Indentaçã',
+ Outdent: 'Diminuir Indentaçã',
+ Undo: 'Desfazer',
+ Redo: 'Restaurar',
+ Link: 'Link',
+ Unlink: 'Tirar link',
+ Image: 'Imagem',
+ Table: 'Tabela',
+ HTML: 'HTML',
+ Paragraph: 'Parágrafo',
+ Heading_1: 'Título 1',
+ Heading_2: 'Título 2',
+ Heading_3: 'Título 3',
+ Heading_4: 'Título 4',
+ Heading_5: 'Título 5',
+ Heading_6: 'Título 6',
+ Preformatted: 'Pré-formatado',
+ Blockquote: 'Citação',
+ Table_Header: 'Cabeçalho Tabela',
+ URL: 'URL',
+ Title: 'Título',
+ Alternative_Text: 'Texto Alterativo',
+ Caption: 'Título Tabela',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Número de Linhas',
+ Number_Of_Cols: 'Número de Colunas',
+ Submit: 'Enviar',
+ Cancel: 'Cancelar',
+ Choose: 'Escolha',
+ Preview: 'Prever',
+ Paste_From_Word: 'Colar do Word',
+ Tools: 'Ferramentas',
+ Containers: 'Containers',
+ Classes: 'Classes',
+ Status: 'Status',
+ Source_Code: 'Código Fonte'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/ru.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/ru.js
new file mode 100644
index 0000000..7895f8d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/ru.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['ru'] = {
+ Strong: 'Жирный',
+ Emphasis: 'Наклонный',
+ Superscript: 'Надстрочный',
+ Subscript: 'Подстрочный',
+ Ordered_List: 'Нумерованый список',
+ Unordered_List: 'Ненумерованый список',
+ Indent: 'Увеличить отступ',
+ Outdent: 'Уменьшить отступ',
+ Undo: 'Отменить',
+ Redo: 'Повторить',
+ Link: 'Ссылка',
+ Unlink: 'Удалить ссылку',
+ Image: 'Изображение',
+ Table: 'Таблица',
+ HTML: 'Править HTML',
+ Paragraph: 'Параграф',
+ Heading_1: 'Заголовок 1',
+ Heading_2: 'Заголовок 2',
+ Heading_3: 'Заголовок 3',
+ Heading_4: 'Заголовок 4',
+ Heading_5: 'Заголовок 5',
+ Heading_6: 'Заголовок 6',
+ Preformatted: 'Preformatted',
+ Blockquote: 'Цитата',
+ Table_Header: 'Заголовок таблицы',
+ URL: 'URL',
+ Title: 'Заголовок',
+ Alternative_Text: 'Альтернативный текст',
+ Caption: 'Надпись',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Кол-во строк',
+ Number_Of_Cols: 'Кол-во столбцов',
+ Submit: 'Отправить',
+ Cancel: 'Отмена',
+ Choose: 'Выбор',
+ Preview: 'Просмотр',
+ Paste_From_Word: 'Вставить из Word',
+ Tools: 'Инструменты',
+ Containers: 'Контейнеры',
+ Classes: 'Классы',
+ Status: 'Статус',
+ Source_Code: 'Исходный код'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/sv.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/sv.js
new file mode 100644
index 0000000..bc5485c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/sv.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['sv'] = {
+ Strong: 'Viktigt',
+ Emphasis: 'Betoning',
+ Superscript: 'Upphöjt',
+ Subscript: 'Nedsänkt',
+ Ordered_List: 'Nummerlista',
+ Unordered_List: 'Punktlista',
+ Indent: 'Indrag',
+ Outdent: 'Utdrag',
+ Undo: 'Ångra',
+ Redo: 'Gör om',
+ Link: 'Länk',
+ Unlink: 'Ta bort länk',
+ Image: 'Bild',
+ Table: 'Tabell',
+ HTML: 'HTML',
+ Paragraph: 'Paragraf',
+ Heading_1: 'Rubrik 1',
+ Heading_2: 'Rubrik 2',
+ Heading_3: 'Rubrik 3',
+ Heading_4: 'Rubrik 4',
+ Heading_5: 'Rubrik 5',
+ Heading_6: 'Rubrik 6',
+ Preformatted: 'Förformaterad',
+ Blockquote: 'Blockcitat',
+ Table_Header: 'Tabellrubrik',
+ URL: 'URL',
+ Title: 'Titel',
+ Alternative_Text: 'Alternativ text',
+ Caption: 'Överskrift',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Antal rader',
+ Number_Of_Cols: 'Antal kolumner',
+ Submit: 'Skicka',
+ Cancel: 'Avbryt',
+ Choose: 'Välj',
+ Preview: 'Förhandsgranska',
+ Paste_From_Word: 'Klistra in från Word',
+ Tools: 'Verktyg',
+ Containers: 'Formatering',
+ Classes: 'Klasser',
+ Status: 'Status',
+ Source_Code: 'Källkod'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/tr.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/tr.js
new file mode 100644
index 0000000..d26f0ff
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/tr.js
@@ -0,0 +1,45 @@
+WYMeditor.STRINGS['tr'] = {
+ Strong: 'Kalın',
+ Emphasis: 'Vurgu',
+ Superscript: 'Superscript',
+ Subscript: 'Subscript',
+ Ordered_List: 'Sıralı List',
+ Unordered_List: 'Sırasız List',
+ Indent: 'İçerlek',
+ Outdent: 'Çıkıntılı',
+ Undo: 'Geri Al',
+ Redo: 'Yinele',
+ Link: 'Bağlantı',
+ Unlink: 'Bağlantıyı Kaldır',
+ Image: 'İmaj',
+ Table: 'Tablo',
+ HTML: 'HTML',
+ Paragraph: 'Parağraf',
+ Heading_1: 'Başlık 1',
+ Heading_2: 'Başlık 2',
+ Heading_3: 'Başlık 3',
+ Heading_4: 'Başlık 4',
+ Heading_5: 'Başlık 5',
+ Heading_6: 'Başlık 6',
+ Preformatted: 'Önceden Formatlı',
+ Blockquote: 'Alıntı',
+ Table_Header: 'Tablo Başlığı',
+ URL: 'URL',
+ Title: 'Başlık',
+ Alternative_Text: 'Alternatif Metin',
+ Caption: 'Etiket',
+ Summary: 'Summary',
+ Number_Of_Rows: 'Satır sayısı',
+ Number_Of_Cols: 'Sütun sayısı',
+ Submit: 'Gönder',
+ Cancel: 'İptal',
+ Choose: 'Seç',
+ Preview: 'Önizleme',
+ Paste_From_Word: 'Wordden yapıştır',
+ Tools: 'Araçlar',
+ Containers: 'Kapsayıcılar',
+ Classes: 'Sınıflar',
+ Status: 'Durum',
+ Source_Code: 'Kaynak Kodu'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/zh_cn.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/zh_cn.js
new file mode 100644
index 0000000..72f5aaf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/lang/zh_cn.js
@@ -0,0 +1,47 @@
+WYMeditor.STRINGS['zh_cn'] = {
+ Strong: '加粗',
+ Emphasis: '斜体',
+ Superscript: '上标',
+ Subscript: '下标',
+ Ordered_List: '有序列表',
+ Unordered_List: '无序列表',
+ Indent: '增加缩进',
+ Outdent: '减少缩进',
+ Undo: '撤消',
+ Redo: '重做',
+ Link: '链接',
+ Unlink: '取消链接',
+ Image: '图片',
+ Table: '表格',
+ HTML: 'HTML源代码',
+ Paragraph: '段落',
+ Heading_1: '标题 1',
+ Heading_2: '标题 2',
+ Heading_3: '标题 3',
+ Heading_4: '标题 4',
+ Heading_5: '标题 5',
+ Heading_6: '标题 6',
+ Preformatted: '原始文本',
+ Blockquote: '引语',
+ Table_Header: '表头',
+ URL: '地址',
+ Title: '提示文字',
+ Alternative_Text: '失效文字',
+ Caption: '标题',
+ Summary: 'Summary',
+ Number_Of_Rows: '行数',
+ Number_Of_Cols: '列数',
+ Submit: '提交',
+ Cancel: '放弃',
+ Choose: '选择',
+ Preview: '预览',
+ Paste_From_Word: '从Word粘贴纯文本',
+ Tools: '工具',
+ Containers: '容器',
+ Classes: '预定义样式',
+ Status: '状态',
+ Source_Code: '源代码',
+ Attachment: '附件',
+ NewParagraph: '新段落'
+};
+
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/embed/jquery.wymeditor.embed.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/embed/jquery.wymeditor.embed.js
new file mode 100644
index 0000000..e553c3e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/embed/jquery.wymeditor.embed.js
@@ -0,0 +1,52 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.embed.js
+ * Experimental embed plugin
+ *
+ * File Authors:
+ * Jonatan Lundin (jonatan.lundin a-t gmail dotcom)
+ */
+
+/*
+ * ISSUES:
+ * - The closing object tag seems to be stripped out...
+ */
+(function() {
+ if (WYMeditor && WYMeditor.XhtmlValidator['_tags']['param']['attributes']) {
+
+ WYMeditor.XhtmlValidator['_tags']["embed"] = {
+ "attributes":[
+ "allowscriptaccess",
+ "allowfullscreen",
+ "height",
+ "src",
+ "type",
+ "width"
+ ]
+ };
+
+ WYMeditor.XhtmlValidator['_tags']['param']['attributes'] = {
+ '0':'name',
+ '1':'type',
+ 'valuetype':/^(data|ref|object)$/,
+ '2':'valuetype',
+ '3':'value'
+ };
+
+ var XhtmlSaxListener = WYMeditor.XhtmlSaxListener;
+ WYMeditor.XhtmlSaxListener = function () {
+ var listener = XhtmlSaxListener.call(this);
+ listener.block_tags.push('embed');
+ return listener;
+ };
+ WYMeditor.XhtmlSaxListener.prototype = XhtmlSaxListener.prototype;
+ }
+})();
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/fullscreen/icon_fullscreen.gif b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/fullscreen/icon_fullscreen.gif
new file mode 100644
index 0000000..d2a8b0a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/fullscreen/icon_fullscreen.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js
new file mode 100644
index 0000000..275c816
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js
@@ -0,0 +1,127 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.fullscreen.js
+ * Fullscreen plugin for WYMeditor
+ *
+ * File Authors:
+ * Luis Santos (luis.santos a-t openquest dotpt)
+ * Jonatan Lundin (jonatan.lundin a-t gmail dotcom)
+ * Gerd Riesselmann (gerd a-t gyro-php dot org) : Fixed issue with new skin layout
+ */
+
+//Extend WYMeditor
+WYMeditor.editor.prototype.fullscreen = function() {
+ var wym = this,
+ $box = jQuery(this._box),
+ $iframe = jQuery(this._iframe),
+ $overlay = null,
+ $window = jQuery(window),
+
+ editorMargin = 15; // Margin from window (without padding)
+
+
+ //construct the button's html
+ var html = "<li class='wym_tools_fullscreen'>"
+ + "<a name='Fullscreen' href='#'"
+ + " style='background-image:"
+ + " url(" + wym._options.basePath +"plugins/fullscreen/icon_fullscreen.gif)'>"
+ + "Fullscreen"
+ + "</a></li>";
+
+ //add the button to the tools box
+ $box.find(wym._options.toolsSelector + wym._options.toolsListSelector)
+ .append(html);
+
+ function resize () {
+ // Calculate margins
+ var uiHeight = $box.outerHeight(true)
+ - $iframe.outerHeight(true),
+ editorPadding = $box.outerWidth() - $box.width(),
+
+ // Calculate heights
+ screenHeight = $window.height(),
+ iframeHeight = (screenHeight
+ - uiHeight
+ - (editorMargin * 2)) + 'px',
+
+ // Calculate witdths
+ screenWidth = $window.width(),
+ boxWidth = (screenWidth
+ - editorPadding
+ - (editorMargin * 2)) + 'px';
+
+ $box.css('width', boxWidth);
+ $iframe.css('height', iframeHeight);
+ $overlay.css({
+ 'height': screenHeight + 'px',
+ 'width': screenWidth + 'px'
+ });
+ };
+
+ //handle click event
+ $box.find('li.wym_tools_fullscreen a').click(function() {
+ if ($box.css('position') != 'fixed') {
+ // Store previous inline styles
+ $box.data('wym-inline-css', $box.attr('style'));
+ $iframe.data('wym-inline-css', $iframe.attr('style'));
+
+ // Create overlay
+ $overlay = jQuery('<div id="wym-fullscreen-overlay"></div>')
+ .appendTo('body').css({
+ 'position': 'fixed',
+ 'background-color': 'rgb(0, 0, 0)',
+ 'opacity': '0.75',
+ 'z-index': '98',
+ 'top': '0px',
+ 'left': '0px'
+ });
+
+ // Possition the editor
+ $box.css({
+ 'position': 'fixed',
+ 'z-index': '99',
+ 'top': editorMargin + 'px',
+ 'left': editorMargin + 'px'
+ });
+
+ // Bind event listeners
+ $window.bind('resize', resize);
+ $box.find('li.wym_tools_html a').bind('click', resize);
+
+ // Force resize
+ resize();
+ } else {
+ // Unbind event listeners
+ $window.unbind('resize', resize);
+ $box.find('li.wym_tools_html a').unbind('click', resize);
+
+ // Remove inline styles
+ $box.css({
+ 'position': 'static',
+ 'z-index': '',
+ 'width': '',
+ 'top': '',
+ 'left': ''
+ });
+ $iframe.css('height', '');
+
+ // Remove overlay
+ $overlay.remove();
+ $overlay = null;
+
+ // Retore previous inline styles
+ $box.attr('style', $box.data('wym-inline-css'));
+ $iframe.attr('style', $iframe.data('wym-inline-css'));
+ }
+
+ return false;
+ });
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js
new file mode 100644
index 0000000..2c71ba5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js
@@ -0,0 +1,57 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.hovertools.js
+ * hovertools plugin for WYMeditor
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ */
+
+//Extend WYMeditor
+WYMeditor.editor.prototype.hovertools = function() {
+
+ var wym = this;
+
+ //bind events on buttons
+ jQuery(this._box).find(this._options.toolSelector).hover(
+ function() {
+ wym.status(jQuery(this).html());
+ },
+ function() {
+ wym.status('&nbsp;');
+ }
+ );
+
+ //classes: add/remove a style attr to matching elems
+ //while mouseover/mouseout
+ jQuery(this._box).find(this._options.classSelector).hover(
+ function() {
+ var aClasses = eval(wym._options.classesItems);
+ var sName = jQuery(this).attr(WYMeditor.NAME);
+ var oClass = WYMeditor.Helper.findByName(aClasses, sName);
+
+ if(oClass){
+ jqexpr = oClass.expr;
+ //don't use jQuery.find() on the iframe body
+ //because of MSIE + jQuery + expando issue (#JQ1143)
+ if(!jQuery.browser.msie)
+ jQuery(wym._doc).find(jqexpr).css('background-color','#cfc');
+ }
+ },
+ function() {
+ //don't use jQuery.find() on the iframe body
+ //because of MSIE + jQuery + expando issue (#JQ1143)
+ if(!jQuery.browser.msie)
+ jQuery(wym._doc).find('*').removeAttr('style');
+ }
+ );
+
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js
new file mode 100644
index 0000000..1ba2d2e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js
@@ -0,0 +1,91 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.resizable.js
+ * resize plugin for WYMeditor
+ *
+ * File Authors:
+ * Peter Eschler (peschler _at_ gmail.com)
+ * Jean-Francois Hovinne - http://www.hovinne.com/
+ *
+ * Version:
+ * 0.4
+ *
+ * Changelog:
+ *
+ * 0.4
+ * - Removed UI and UI.resizable scripts loading - see #167 (jfh).
+ *
+ * 0.3
+ * - Added 'iframeOriginalSize' and removed 'ui.instance' calls (jfh).
+ *
+ * 0.2
+ * - Added full support for all jQueryUI resizable plugin options.
+ * - Refactored and documented code.
+ * 0.1
+ * - Initial release.
+ */
+
+/**
+ * The resizable plugin makes the wymeditor box vertically resizable.
+ * It it based on the ui.resizable.js plugin of the jQuery UI library.
+ *
+ * The WYMeditor resizable plugin supports all parameters of the jQueryUI
+ * resizable plugin. The parameters are passed like this:
+ *
+ * wym.resizable({ handles: "s,e",
+ * maxHeight: 600 });
+ *
+ * DEPENDENCIES: jQuery UI, jQuery UI resizable
+ *
+ * @param options options for the plugin
+ */
+WYMeditor.editor.prototype.resizable = function(options) {
+
+ var wym = this;
+ var iframe = jQuery(wym._box).find('iframe');
+ var iframeOriginalSize = {};
+
+ // Define some default options
+ var default_options = {
+ start: function(e, ui) {
+ iframeOriginalSize = {
+ width: jQuery(iframe).width(),
+ height: jQuery(iframe).height()
+ }
+ },
+
+ // resize is called by the jQuery resizable plugin whenever the
+ // client area was resized.
+ resize: function(e, ui) {
+ var diff = ui.size.height - ui.originalSize.height;
+ jQuery(iframe).height( iframeOriginalSize.height + diff );
+
+ // If the plugin has horizontal resizing disabled we need to
+ // adjust the "width" attribute of the area css, because the
+ // resizing will set a fixed width (which breaks liquid layout
+ // of the wymeditor area).
+ if( !ui.options.handles['w'] && !ui.options.handles['e'] ) {
+ ui.size.width = "inherit";
+ }
+ },
+ handles: "s,e,se",
+ minHeight: 250,
+ maxHeight: 600
+ };
+
+ // Merge given options with default options. Given options override
+ // default ones.
+ var final_options = jQuery.extend(default_options, options);
+
+ if(jQuery.isFunction( jQuery.fn.resizable )) jQuery(wym._box).resizable(final_options);
+ else WYMeditor.console.error('Oops, jQuery UI.resizable unavailable.');
+
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/resizable/readme.txt b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/resizable/readme.txt
new file mode 100644
index 0000000..2a0444e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/resizable/readme.txt
@@ -0,0 +1,124 @@
+
+
+resizable plugin for WYMeditor
+##############################
+
+The ``resizable`` plugin for WYMeditor_ enables vertical resizing of the
+editor area. The plugin is based on the jQuery UI library.
+
+Requirements
+============
+The following packages are required for using the WYMeditor ``resizable``
+plugin:
+
+* jQuery (tested with jQuery ``jquery-1.2.4a.js`` from ``jquery.ui`` package)
+* WYMeditor SVN trunk (Revision: 482)
+* jQuery-UI (tested with ``jquery.ui-1.5b2``)
+
+It should be possible to use this plugin with ``WYMeditor-0.4`` but I have not
+tried.
+
+Download
+========
+You can download the WYMeditor ``resizable`` plugin here:
+
+* wymeditor-resizable-plugin-0.2.tgz_
+* wymeditor-resizable-plugin-0.1.tgz_
+
+See the Changelog_ for more infos about the releases.
+
+.. _wymeditor-resizable-plugin-0.2.tgz: http://pyjax.net/download/wymeditor-resizable-plugin-0.2.tgz
+.. _wymeditor-resizable-plugin-0.1.tgz: http://pyjax.net/download/wymeditor-resizable-plugin-0.1.tgz
+
+Installation
+============
+Just extract the downloaded archive into your WYMeditor's ``plugin``
+directory.
+
+Usage
+=====
+For general instructions on WYMeditor plugins please refer to the `WYMeditor
+plugin page`_.
+
+To use the ``resizable`` plugin simply include the plugin's JavaScript file in
+your code. You **do not** need to include the jQuery UI files - this is done
+automatically by the plugin (see `Internals`_)::
+
+ <script type="text/javascript"
+ src="/js/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js">
+ </script>
+
+Make sure to adjust the ``src`` attribute to your needs, then initialize the
+plugin in WYMeditor's ``postInit`` function::
+
+ wymeditor({postInit: function(wym) {
+ wym.hovertools(); // other plugins...
+ wym.resizable({handles: "s,e",
+ maxHeight: 600});
+ }
+ })
+
+The ``resizable`` plugin takes exactly one parameter, which is an object literal
+containing the options of the plugin. The WYMeditor ``resizable`` plugin
+supports all options of the jQuery UI ``resizable`` plugin. These are the
+default values used by the plugin::
+
+ handles: "s,e,se",
+ minHeight: 250,
+ maxHeight: 600
+
+See the `jQuery UI resizable plugin docs`_ for a list of all options.
+
+That's it! You are now able to resize the WYMeditor vertically, horizontally or
+both, depending on your options.
+
+.. _jQuery UI resizable plugin docs: http://docs.jquery.com/UI/Resizables
+
+Internals
+=========
+The plugin takes care of loading the necessary jQuery UI files (``base`` and
+``resizable``) from the same path the jQuery library was loaded. Here's how
+it's done::
+
+ // Get the jQuery path from the editor, stripping away the jQuery file.
+ // see http://www.oreilly.com/catalog/regex/chapter/ch04.html
+ // The match result array contains the path and the filename.
+ var jQueryPath = wym.computeJqueryPath().match(/^(.*)\/(.*)$/)[1];
+
+ // Make an array of the external JavaScript files required by the plugin.
+ var jQueryPlugins = [jQueryPath + '/ui.base.js',
+ jQueryPath + '/ui.resizable.js'];
+
+ // First get the jQuery UI base file
+ $.getScript(jQueryPlugins[0]);
+
+ // Get the jQuery UI resizeable plugin and then init the wymeditor resizable
+ // plugin. It is import to do the initialisation after loading the
+ // necessary jQuery UI files has finished, otherwise the "resizable" method
+ // would not be available.
+ $.getScript(jQueryPlugins[1], function() {
+ jQuery(wym._box).resizable(final_options);
+ });
+
+An alternative approach would be to use an AJAX queue when getting the script
+files to ensure that all jQuery files are loaded before the initialisation code
+of the plugin is executed. There is an `jQuery AJAX queue plugin`_ which does
+that.
+
+.. _jQuery AJAX queue plugin: http://plugins.jquery.com/project/ajaxqueue
+
+Changelog
+=========
+
+0.2
+---
+- Added full support for all jQuery UI resizable plugin options.
+- Refactored and documented code.
+- Now contains a packed version (775 bytes).
+
+0.1
+---
+- Initial release.
+
+.. _WYMeditor: http://www.wymeditor.org/
+.. _WYMeditor plugin page: http://trac.wymeditor.org/trac/wiki/0.4/Plugins
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/README b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/README
new file mode 100644
index 0000000..acc7ffd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/README
@@ -0,0 +1,19 @@
+WYMeditor : what you see is What You Mean web-based editor
+Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+Dual licensed under the MIT (MIT-license.txt)
+and GPL (GPL-license.txt) licenses.
+
+For further information visit:
+ http://www.wymeditor.org/
+
+File Name:
+ README - HTML Tidy plugin for WYMeditor
+
+File Authors:
+ Jean-François Hovinne (jf.hovinne a-t wymeditor dotorg)
+
+Credits:
+ 'HTML Tidy' by Dave Ragget - http://tidy.sourceforge.net/
+ Icon 'wand' by Mark James - http://famfamfam.com/
+
+WYMeditor documentation is available online at http://www.wymeditor.org/
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js
new file mode 100644
index 0000000..bf30c4c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js
@@ -0,0 +1,82 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * jquery.wymeditor.tidy.js
+ * HTML Tidy plugin for WYMeditor
+ *
+ * File Authors:
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+ */
+
+//Extend WYMeditor
+WYMeditor.editor.prototype.tidy = function(options) {
+ var tidy = new WymTidy(options, this);
+ return(tidy);
+};
+
+//WymTidy constructor
+function WymTidy(options, wym) {
+
+ options = jQuery.extend({
+
+ sUrl: wym._options.basePath + "plugins/tidy/tidy.php",
+ sButtonHtml: "<li class='wym_tools_tidy'>"
+ + "<a name='CleanUp' href='#'"
+ + " style='background-image:"
+ + " url(" + wym._options.basePath + "plugins/tidy/wand.png)'>"
+ + "Clean up HTML"
+ + "</a></li>",
+
+ sButtonSelector: "li.wym_tools_tidy a"
+
+ }, options);
+
+ this._options = options;
+ this._wym = wym;
+
+};
+
+//WymTidy initialization
+WymTidy.prototype.init = function() {
+
+ var tidy = this;
+
+ jQuery(this._wym._box).find(
+ this._wym._options.toolsSelector + this._wym._options.toolsListSelector)
+ .append(this._options.sButtonHtml);
+
+ //handle click event
+ jQuery(this._wym._box).find(this._options.sButtonSelector).click(function() {
+ tidy.cleanup();
+ return(false);
+ });
+
+};
+
+//WymTidy cleanup
+WymTidy.prototype.cleanup = function() {
+
+ var wym = this._wym;
+ var html = "<html><body>" + wym.xhtml() + "</body></html>";
+
+ jQuery.post(this._options.sUrl, { html: html}, function(data) {
+
+ if(data.length > 0 && data != '0') {
+ if(data.indexOf("<?php") == 0) {
+ wym.status("Ooops... Is PHP installed?");
+ } else {
+ wym.html(data);
+ wym.status("HTML has been cleaned up.");
+ }
+ } else {
+ wym.status("An error occurred.");
+ }
+ });
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/tidy.php b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/tidy.php
new file mode 100644
index 0000000..23b9bec
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/tidy.php
@@ -0,0 +1,36 @@
+<?php
+
+if (get_magic_quotes_gpc()) $html = stripslashes($_REQUEST['html']);
+else $html = $_REQUEST['html'];
+
+if(strlen($html) > 0) {
+
+ // Specify configuration
+ $config = array(
+ 'bare' => true,
+ 'clean' => true,
+ 'doctype' => 'strict',
+ 'drop-empty-paras' => true,
+ 'drop-font-tags' => true,
+ 'drop-proprietary-attributes' => true,
+ 'enclose-block-text' => true,
+ 'indent' => false,
+ 'join-classes' => true,
+ 'join-styles' => true,
+ 'logical-emphasis' => true,
+ 'output-xhtml' => true,
+ 'show-body-only' => true,
+ 'wrap' => 0);
+
+ // Tidy
+ $tidy = new tidy;
+ $tidy->parseString($html, $config, 'utf8');
+ $tidy->cleanRepair();
+
+ // Output
+ echo $tidy;
+} else {
+
+echo ('0');
+}
+?>
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/wand.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/wand.png
new file mode 100644
index 0000000..bb55eea
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/plugins/tidy/wand.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/icons.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/icons.png
new file mode 100644
index 0000000..c6eb463
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/icons.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/skin.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/skin.css
new file mode 100644
index 0000000..4a6a0c6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/skin.css
@@ -0,0 +1,134 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * screen.css
+ * main stylesheet for the WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+ * Jean-Francois Hovinne (jf.hovinne a-t wymeditor dotorg)
+*/
+
+/*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/
+ .wym_skin_compact p, .wym_skin_compact h2, .wym_skin_compact h3,
+ .wym_skin_compact ul, .wym_skin_compact li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; }
+
+
+/*HIDDEN BY DEFAULT*/
+ .wym_skin_compact .wym_area_left { display: none; }
+ .wym_skin_compact .wym_area_right { display: none; }
+
+
+/*TYPO*/
+ .wym_skin_compact { font-size: 10px; font-family: Verdana, Arial, sans-serif; }
+ .wym_skin_compact h2 { font-size: 110%; /* = 11px */}
+ .wym_skin_compact h3 { font-size: 100%; /* = 10px */}
+ .wym_skin_compact li { font-size: 100%; /* = 10px */}
+
+
+/*WYM_BOX*/
+ .wym_skin_compact { border: 1px solid gray; padding: 5px}
+
+ /*auto-clear the wym_box*/
+ .wym_skin_compact:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_compact { height: 1%;}
+
+
+/*WYM_HTML*/
+ .wym_skin_compact .wym_html { width: 98%;}
+ .wym_skin_compact .wym_html textarea { font-size: 120%; width: 100%; height: 200px; border: 1px solid gray; background: white; }
+
+
+/*WYM_IFRAME*/
+ .wym_skin_compact .wym_iframe { width: 98%;}
+ .wym_skin_compact .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white }
+
+
+/*AREAS*/
+ .wym_skin_compact .wym_area_left { width: 100px; float: left;}
+ .wym_skin_compact .wym_area_right { width: 150px; float: right;}
+ .wym_skin_compact .wym_area_bottom { height: 1%; clear: both;}
+ * html .wym_skin_compact .wym_area_main { height: 1%;}
+ * html .wym_skin_compact .wym_area_top { height: 1%;}
+ *+html .wym_skin_compact .wym_area_top { height: 1%;}
+
+/*SECTIONS SYSTEM*/
+
+ /*common defaults for all sections*/
+ .wym_skin_compact .wym_section { margin-bottom: 5px; }
+ .wym_skin_compact .wym_section h2,
+ .wym_skin_compact .wym_section h3 { padding: 1px 3px; margin: 0; }
+ .wym_skin_compact .wym_section a { padding: 0 3px; display: block; text-decoration: none; color: black; }
+ .wym_skin_compact .wym_section a:hover { background-color: yellow; }
+ /*hide section titles by default*/
+ .wym_skin_compact .wym_section h2 { display: none; }
+ /*disable any margin-collapse*/
+ .wym_skin_compact .wym_section { padding-top: 1px; padding-bottom: 1px; }
+ /*auto-clear sections*/
+ .wym_skin_compact .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_compact .wym_section ul { height: 1%;}
+
+ /*option: add this class to a section to make it render as a panel*/
+ .wym_skin_compact .wym_panel { }
+ .wym_skin_compact .wym_panel h2 { display: block; }
+
+ /*option: add this class to a section to make it render as a dropdown menu*/
+ .wym_skin_compact .wym_dropdown h2 { display: block; }
+ .wym_skin_compact .wym_dropdown ul { display: none; position: absolute; background: white; }
+ .wym_skin_compact .wym_dropdown:hover ul,
+ .wym_skin_compact .wym_dropdown.hover ul { display: block; }
+
+ /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/
+ .wym_skin_compact .wym_buttons li { float:left;}
+ .wym_skin_compact .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px }
+ /*image replacements*/
+ .wym_skin_compact .wym_buttons li a { background: url(icons.png) no-repeat; text-indent: -9999px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_strong a { background-position: 0 -382px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_emphasis a { background-position: 0 -22px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_superscript a { background-position: 0 -430px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_subscript a { background-position: 0 -454px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_indent a { background-position: 0 -574px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_outdent a { background-position: 0 -598px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_undo a { background-position: 0 -502px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_redo a { background-position: 0 -526px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_link a { background-position: 0 -96px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_image a { background-position: 0 -121px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_table a { background-position: 0 -144px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_html a { background-position: 0 -193px;}
+ .wym_skin_compact .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;}
+
+/*DECORATION*/
+ .wym_skin_compact .wym_section h2 { background: #f0f0f0; border: solid gray; border-width: 0 0 1px;}
+ .wym_skin_compact .wym_section h2 span { color: gray;}
+ .wym_skin_compact .wym_panel { padding: 0; border: solid gray; border-width: 1px; background: white;}
+ .wym_skin_compact .wym_panel ul { margin: 2px 0 5px; }
+ .wym_skin_compact .wym_dropdown { padding: 0; border: solid gray; border-width: 1px 1px 0 1px; }
+ .wym_skin_compact .wym_dropdown ul { border: solid gray; border-width: 0 1px 1px 1px; margin-left: -1px; padding: 5px 10px 5px 3px;}
+
+/*DIALOGS*/
+ .wym_dialog div.row { margin-bottom: 5px;}
+ .wym_dialog div.row input { margin-right: 5px;}
+ .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; }
+ .wym_dialog div.row-indent { padding-left: 160px; }
+ /*autoclearing*/
+ .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ .wym_dialog div.row { display: inline-block; }
+ /* Hides from IE-mac \*/
+ * html .wym_dialog div.row { height: 1%; }
+ .wym_dialog div.row { display: block; }
+ /* End hide from IE-mac */
+
+/*WYMEDITOR_LINK*/
+ a.wym_wymeditor_link { text-indent: -9999px; float: right; display: block; width: 50px; height: 15px; background: url(../wymeditor_icon.png); overflow: hidden; text-decoration: none; }
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/skin.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/skin.js
new file mode 100644
index 0000000..cfb7cc1
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/compact/skin.js
@@ -0,0 +1,35 @@
+WYMeditor.SKINS['compact'] = {
+
+ init: function(wym) {
+
+ //move the containers panel to the top area
+ jQuery(wym._options.containersSelector + ', '
+ + wym._options.classesSelector, wym._box)
+ .appendTo( jQuery("div.wym_area_top", wym._box) )
+ .addClass("wym_dropdown")
+ .css({"margin-right": "10px", "width": "120px", "float": "left"});
+
+ //render following sections as buttons
+ jQuery(wym._options.toolsSelector, wym._box)
+ .addClass("wym_buttons")
+ .css({"margin-right": "10px", "float": "left"});
+
+ //make hover work under IE < 7
+ jQuery(".wym_section", wym._box).hover(function(){
+ jQuery(this).addClass("hover");
+ },function(){
+ jQuery(this).removeClass("hover");
+ });
+
+ var postInit = wym._options.postInit;
+ wym._options.postInit = function(wym) {
+
+ if(postInit) postInit.call(wym, wym);
+ var rule = {
+ name: 'body',
+ css: 'background-color: #f0f0f0;'
+ };
+ wym.addCssRule( wym._doc.styleSheets[0], rule);
+ };
+ }
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/icons.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/icons.png
new file mode 100644
index 0000000..c6eb463
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/icons.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/skin.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/skin.css
new file mode 100644
index 0000000..eb4680f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/skin.css
@@ -0,0 +1,133 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * skin.css
+ * main stylesheet for the default WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+*/
+
+/*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/
+ .wym_skin_default p, .wym_skin_default h2, .wym_skin_default h3,
+ .wym_skin_default ul, .wym_skin_default li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; }
+
+
+/*HIDDEN BY DEFAULT*/
+ .wym_skin_default .wym_area_left { display: none; }
+ .wym_skin_default .wym_area_right { display: block; }
+
+
+/*TYPO*/
+ .wym_skin_default { font-size: 62.5%; font-family: Verdana, Arial, sans-serif; }
+ .wym_skin_default h2 { font-size: 110%; /* = 11px */}
+ .wym_skin_default h3 { font-size: 100%; /* = 10px */}
+ .wym_skin_default li { font-size: 100%; /* = 10px */}
+
+
+/*WYM_BOX*/
+ .wym_skin_default { border: 1px solid gray; background: #f2f2f2; padding: 5px}
+
+ /*auto-clear the wym_box*/
+ .wym_skin_default:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_default { height: 1%;}
+
+
+/*WYM_HTML*/
+ .wym_skin_default .wym_html { width: 98%;}
+ .wym_skin_default .wym_html textarea { width: 100%; height: 200px; border: 1px solid gray; background: white; }
+
+
+/*WYM_IFRAME*/
+ .wym_skin_default .wym_iframe { width: 98%;}
+ .wym_skin_default .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white }
+
+
+/*AREAS*/
+ .wym_skin_default .wym_area_left { width: 150px; float: left;}
+ .wym_skin_default .wym_area_right { width: 150px; float: right;}
+ .wym_skin_default .wym_area_bottom { height: 1%; clear: both;}
+ * html .wym_skin_default .wym_area_main { height: 1%;}
+ * html .wym_skin_default .wym_area_top { height: 1%;}
+ *+html .wym_skin_default .wym_area_top { height: 1%;}
+
+/*SECTIONS SYSTEM*/
+
+ /*common defaults for all sections*/
+ .wym_skin_default .wym_section { margin-bottom: 5px; }
+ .wym_skin_default .wym_section h2,
+ .wym_skin_default .wym_section h3 { padding: 1px 3px; margin: 0; }
+ .wym_skin_default .wym_section a { padding: 0 3px; display: block; text-decoration: none; color: black; }
+ .wym_skin_default .wym_section a:hover { background-color: yellow; }
+ /*hide section titles by default*/
+ .wym_skin_default .wym_section h2 { display: none; }
+ /*disable any margin-collapse*/
+ .wym_skin_default .wym_section { padding-top: 1px; padding-bottom: 1px; }
+ /*auto-clear sections*/
+ .wym_skin_default .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_default .wym_section ul { height: 1%;}
+
+ /*option: add this class to a section to make it render as a panel*/
+ .wym_skin_default .wym_panel { }
+ .wym_skin_default .wym_panel h2 { display: block; }
+
+ /*option: add this class to a section to make it render as a dropdown menu*/
+ .wym_skin_default .wym_dropdown h2 { display: block; }
+ .wym_skin_default .wym_dropdown ul { display: none; position: absolute; background: white; }
+ .wym_skin_default .wym_dropdown:hover ul,
+ .wym_skin_default .wym_dropdown.hover ul { display: block; }
+
+ /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/
+ .wym_skin_default .wym_buttons li { float:left;}
+ .wym_skin_default .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px }
+ /*image replacements*/
+ .wym_skin_default .wym_buttons li a { background: url(icons.png) no-repeat; text-indent: -9999px;}
+ .wym_skin_default .wym_buttons li.wym_tools_strong a { background-position: 0 -382px;}
+ .wym_skin_default .wym_buttons li.wym_tools_emphasis a { background-position: 0 -22px;}
+ .wym_skin_default .wym_buttons li.wym_tools_superscript a { background-position: 0 -430px;}
+ .wym_skin_default .wym_buttons li.wym_tools_subscript a { background-position: 0 -454px;}
+ .wym_skin_default .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;}
+ .wym_skin_default .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;}
+ .wym_skin_default .wym_buttons li.wym_tools_indent a { background-position: 0 -574px;}
+ .wym_skin_default .wym_buttons li.wym_tools_outdent a { background-position: 0 -598px;}
+ .wym_skin_default .wym_buttons li.wym_tools_undo a { background-position: 0 -502px;}
+ .wym_skin_default .wym_buttons li.wym_tools_redo a { background-position: 0 -526px;}
+ .wym_skin_default .wym_buttons li.wym_tools_link a { background-position: 0 -96px;}
+ .wym_skin_default .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;}
+ .wym_skin_default .wym_buttons li.wym_tools_image a { background-position: 0 -121px;}
+ .wym_skin_default .wym_buttons li.wym_tools_table a { background-position: 0 -144px;}
+ .wym_skin_default .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;}
+ .wym_skin_default .wym_buttons li.wym_tools_html a { background-position: 0 -193px;}
+ .wym_skin_default .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;}
+
+/*DECORATION*/
+ .wym_skin_default .wym_section h2 { background: #ddd; border: solid gray; border-width: 0 0 1px;}
+ .wym_skin_default .wym_section h2 span { color: gray;}
+ .wym_skin_default .wym_panel { padding: 0; border: solid gray; border-width: 1px; background: white;}
+ .wym_skin_default .wym_panel ul { margin: 2px 0 5px; }
+ .wym_skin_default .wym_dropdown { padding: 0; border: solid gray; border-width: 1px 1px 0 1px; }
+ .wym_skin_default .wym_dropdown ul { border: solid gray; border-width: 0 1px 1px 1px; margin-left: -1px; padding: 5px 10px 5px 3px;}
+
+/*DIALOGS*/
+ .wym_dialog div.row { margin-bottom: 5px;}
+ .wym_dialog div.row input { margin-right: 5px;}
+ .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; }
+ .wym_dialog div.row-indent { padding-left: 160px; }
+ /*autoclearing*/
+ .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ .wym_dialog div.row { display: inline-block; }
+ /* Hides from IE-mac \*/
+ * html .wym_dialog div.row { height: 1%; }
+ .wym_dialog div.row { display: block; }
+ /* End hide from IE-mac */
+
+/*WYMEDITOR_LINK*/
+ a.wym_wymeditor_link { text-indent: -9999px; float: right; display: block; width: 50px; height: 15px; background: url(../wymeditor_icon.png); overflow: hidden; text-decoration: none; }
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/skin.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/skin.js
new file mode 100644
index 0000000..3d204e0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/default/skin.js
@@ -0,0 +1,40 @@
+WYMeditor.SKINS['default'] = {
+
+ init: function(wym) {
+
+ //render following sections as panels
+ jQuery(wym._box).find(wym._options.classesSelector)
+ .addClass("wym_panel");
+
+ //render following sections as buttons
+ jQuery(wym._box).find(wym._options.toolsSelector)
+ .addClass("wym_buttons");
+
+ //render following sections as dropdown menus
+ jQuery(wym._box).find(wym._options.containersSelector)
+ .addClass("wym_dropdown")
+ .find(WYMeditor.H2)
+ .append("<span>&#160;&gt;</span>");
+
+ // auto add some margin to the main area sides if left area
+ // or right area are not empty (if they contain sections)
+ jQuery(wym._box).find("div.wym_area_right ul")
+ .parents("div.wym_area_right").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-right": "155px"});
+
+ jQuery(wym._box).find("div.wym_area_left ul")
+ .parents("div.wym_area_left").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-left": "155px"});
+
+ //make hover work under IE < 7
+ jQuery(wym._box).find(".wym_section").hover(function(){
+ jQuery(this).addClass("hover");
+ },function(){
+ jQuery(this).removeClass("hover");
+ });
+ }
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/icons.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/icons.png
new file mode 100644
index 0000000..0e04964
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/icons.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/skin.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/skin.css
new file mode 100644
index 0000000..6ae3772
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/skin.css
@@ -0,0 +1,136 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2008 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * skin.css
+ * main stylesheet for the django WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+ * Jannis Leidel (jannis@leidel.info)
+*/
+
+/*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/
+ .wym_skin_django p, .wym_skin_django h2, .wym_skin_django h3,
+ .wym_skin_django ul, .wym_skin_django li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; }
+
+
+/*HIDDEN BY DEFAULT*/
+ .wym_skin_django .wym_area_left { display: none; }
+ .wym_skin_django .wym_area_right { display: block; }
+
+
+/*TYPO*/
+ .wym_skin_django { font-size: 62,5%; font-family: "Lucida Grande", "DejaVu Sans", "Bitstream Vera Sans", Verdana, Arial, sans-serif }
+ .wym_skin_django h2 { font-size: 110%; /* = 11px */}
+ .wym_skin_django h3 { font-size: 100%; /* = 10px */}
+ .wym_skin_django li { font-size: 100%; /* = 10px */}
+
+
+/*WYM_BOX*/
+ .wym_skin_django { border: 0px; background: none; padding: 10px}
+
+ /*auto-clear the wym_box*/
+ .wym_skin_django:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_django { height: 1%;}
+
+
+/*WYM_HTML*/
+ .wym_skin_django .wym_html { width: 98%;}
+ .wym_skin_django .wym_html textarea { width: 100%; height: 235px; border: 1px solid #ccc; background: white; }
+
+
+/*WYM_IFRAME*/
+ .wym_skin_django .wym_iframe { width: 98%;}
+ .wym_skin_django .wym_iframe iframe { width: 100%; height: 235px; border: 1px solid #ccc; background: white }
+
+
+/*AREAS*/
+ .wym_skin_django .wym_area_left { width: 150px; float: left;}
+ .wym_skin_django .wym_area_right { width: 150px; float: right;}
+ .wym_skin_django .wym_area_bottom { clear: both; display: none;}
+ * html .wym_skin_django .wym_area_main { height: 1%;}
+ * html .wym_skin_django .wym_area_top { height: 1%;}
+ *+html .wym_skin_django .wym_area_top { height: 1%;}
+
+/*SECTIONS SYSTEM*/
+
+ /*common defaults for all sections*/
+ .wym_skin_django .wym_section { margin-bottom: 5px; }
+ .wym_skin_django .wym_section h2,
+ .wym_skin_django .wym_section h3 { padding: 1px 3px; margin: 0; color:#333; }
+ .wym_skin_django .wym_section a { padding: 0 3px; display: block; text-decoration: none; color: black; }
+ .wym_skin_django .wym_section a:hover { background-color: #eaeaea; }
+ /*hide section titles by default*/
+ .wym_skin_django .wym_section h2 { display: none; }
+ /*disable any margin-collapse*/
+ .wym_skin_django .wym_section { padding-top: 1px; padding-bottom: 1px; }
+ /*auto-clear sections*/
+ .wym_skin_django .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_django .wym_section ul { height: 1%;}
+
+ /*option: add this class to a section to make it render as a panel*/
+ .wym_skin_django .wym_panel { }
+ .wym_skin_django .wym_panel h2 { display: block; }
+
+ /*option: add this class to a section to make it render as a dropdown menu*/
+ .wym_skin_django .wym_dropdown h2 { display: block; }
+ .wym_skin_django .wym_dropdown ul { display: none; position: absolute; background: white; }
+ .wym_skin_django .wym_dropdown:hover ul,
+ .wym_skin_django .wym_dropdown.hover ul { display: block; }
+
+ .wym_skin_django .wym_tools ul { padding-left: 0px !important; margin-left: 0px; }
+
+ /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/
+ .wym_skin_django .wym_buttons li { float:left;}
+ .wym_skin_django .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px }
+ /*image replacements*/
+ .wym_skin_django .wym_buttons li a { background: url(icons.png) no-repeat; text-indent: -9999px;}
+ .wym_skin_django .wym_buttons li.wym_tools_strong a { background-position: 0 -382px;}
+ .wym_skin_django .wym_buttons li.wym_tools_emphasis a { background-position: 0 -22px;}
+ .wym_skin_django .wym_buttons li.wym_tools_superscript a { background-position: 0 -430px;}
+ .wym_skin_django .wym_buttons li.wym_tools_subscript a { background-position: 0 -454px;}
+ .wym_skin_django .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;}
+ .wym_skin_django .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;}
+ .wym_skin_django .wym_buttons li.wym_tools_indent a { background-position: 0 -574px;}
+ .wym_skin_django .wym_buttons li.wym_tools_outdent a { background-position: 0 -598px;}
+ .wym_skin_django .wym_buttons li.wym_tools_undo a { background-position: 0 -502px;}
+ .wym_skin_django .wym_buttons li.wym_tools_redo a { background-position: 0 -526px;}
+ .wym_skin_django .wym_buttons li.wym_tools_link a { background-position: 0 -96px;}
+ .wym_skin_django .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;}
+ .wym_skin_django .wym_buttons li.wym_tools_image a { background-position: 0 -121px;}
+ .wym_skin_django .wym_buttons li.wym_tools_table a { background-position: 0 -144px;}
+ .wym_skin_django .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;}
+ .wym_skin_django .wym_buttons li.wym_tools_html a { background-position: 0 -193px;}
+ .wym_skin_django .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;}
+
+/*DECORATION*/
+ .wym_skin_django .wym_section h2 { background: #fff;}
+ .wym_skin_django .wym_section h2 span { color: gray;}
+ .wym_skin_django .wym_panel { padding: 0; background: white;}
+ .wym_skin_django .wym_panel ul { margin: 2px 0 5px; }
+ .wym_skin_django .wym_dropdown { padding: 0; border: solid gray; border-width: 1px 1px 0 1px; }
+ .wym_skin_django .wym_dropdown ul { border: solid gray; border-width: 0 1px 1px 1px; margin-left: -1px; padding: 5px 10px 5px 3px;}
+
+/*DIALOGS*/
+ .wym_dialog div.row { margin-bottom: 5px;}
+ .wym_dialog div.row input { margin-right: 5px;}
+ .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; }
+ .wym_dialog div.row-indent { padding-left: 160px; }
+ /*autoclearing*/
+ .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ .wym_dialog div.row { display: inline-block; }
+ /* Hides from IE-mac \*/
+ * html .wym_dialog div.row { height: 1%; }
+ .wym_dialog div.row { display: block; }
+ /* End hide from IE-mac */
+
+/*WYMEDITOR_LINK*/
+ a.wym_wymeditor_link { text-indent: -9999px; float: right; display: block; width: 50px; height: 15px; background: url(../wymeditor_icon.png); overflow: hidden; text-decoration: none; }
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/skin.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/skin.js
new file mode 100644
index 0000000..47597e6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/django/skin.js
@@ -0,0 +1,42 @@
+WYMeditor.SKINS['django'] = {
+
+ init: function(wym) {
+
+ //render following sections as panels
+ jQuery(wym._box).find(wym._options.classesSelector)
+ .addClass("wym_panel");
+
+ //render following sections as buttons
+ jQuery(wym._box).find(wym._options.toolsSelector)
+ .addClass("wym_buttons");
+
+ //render following sections as dropdown menus
+ jQuery(wym._box).find(wym._options.containersSelector)
+ .addClass("wym_panel")
+ .find(WYMeditor.H2);
+
+ //replace the status markup in h2
+ wym.status('&nbsp;');
+
+ // auto add some margin to the main area sides if left area
+ // or right area are not empty (if they contain sections)
+ jQuery(wym._box).find("div.wym_area_right ul")
+ .parents("div.wym_area_right").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-right": "155px"});
+
+ jQuery(wym._box).find("div.wym_area_left ul")
+ .parents("div.wym_area_left").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-left": "155px"});
+
+ //make hover work under IE < 7
+ jQuery(wym._box).find(".wym_section").hover(function(){
+ jQuery(this).addClass("hover");
+ },function(){
+ jQuery(this).removeClass("hover");
+ });
+ }
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.header.gif b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.header.gif
new file mode 100644
index 0000000..b2d2907
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.header.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.selector.silver.gif b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.selector.silver.gif
new file mode 100644
index 0000000..e65976b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.selector.silver.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.wymeditor.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.wymeditor.png
new file mode 100644
index 0000000..1e84813
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/bg.wymeditor.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/icons.silver.gif b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/icons.silver.gif
new file mode 100644
index 0000000..8c6a4fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/images/icons.silver.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/skin.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/skin.css
new file mode 100644
index 0000000..cea8d84
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/skin.css
@@ -0,0 +1,131 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * skin.css
+ * main stylesheet for the minimal WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Jean-Francois Hovinne
+ * Scott Lewis (see Silver skin)
+*/
+
+/* Set iframe */
+.wym_skin_minimal div.wym_iframe iframe {
+ width: 90%;
+ height: 200px;
+}
+
+/* Hide h2 by default */
+.wym_skin_minimal h2 {
+ display: none;
+}
+
+/* Show specific h2 */
+.wym_skin_minimal div.wym_tools h2,
+.wym_skin_minimal div.wym_containers h2,
+.wym_skin_minimal div.wym_classes h2 {
+ display: block;
+}
+
+.wym_skin_minimal div.wym_section ul {
+ margin: 0;
+}
+
+.wym_skin_minimal div.wym_section ul li {
+ float: left;
+ list-style-type: none;
+ margin-right: 5px;
+}
+
+.wym_skin_minimal div.wym_area_top,
+.wym_skin_minimal div.wym_area_right,
+.wym_skin_minimal div.wym_containers,
+.wym_skin_minimal div.wym_classes {
+ float: left;
+}
+
+.wym_skin_minimal div.wym_area_main {
+ clear: both;
+}
+
+.wym_skin_minimal div.wym_html {
+ width: 90%;
+}
+
+.wym_skin_minimal textarea.wym_html_val {
+ width: 100%;
+ height: 100px;
+}
+
+/* DROPDOWNS (see Silver skin) */
+.wym_skin_minimal div.wym_dropdown {
+ cursor: pointer;
+ margin: 0px 4px 10px 0px;
+ padding: 0px;
+ z-index: 1001;
+ display: block;
+}
+
+.wym_skin_minimal div.wym_dropdown ul {
+ display: none;
+ width: 124px;
+ padding: 0px;
+ margin: 0px;
+ list-style-type: none;
+ list-style-image: none;
+ z-index: 1002;
+ position: absolute;
+ border-top: 1px solid #AAA;
+}
+
+.wym_skin_minimal div.wym_dropdown ul li {
+ width: 146px;
+ height: 20px;
+ padding: 0px;
+ margin: 0px;
+ border: 1px solid #777;
+ border-top: none;
+ background: #EEE;
+ list-style-image: none;
+}
+
+.wym_skin_minimal div.wym_dropdown h2 {
+ width: 138px;
+ height: 16px;
+ color: #000;
+ background-image: url(images/bg.selector.silver.gif);
+ background-position: 0px -18px;
+ background-repeat: no-repeat;
+ border: none;
+ font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif;
+ font-size: 12px;
+ font-weight: bold;
+ padding: 2px 0px 0px 10px;
+ margin: 0px;
+}
+
+.wym_skin_minimal div.wym_dropdown a {
+ text-decoration: none;
+ font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif;
+ font-size: 12px;
+ padding: 5px 0px 0px 10px;
+ display: block;
+ width: 136px;
+ height: 15px;
+ color: #000;
+ text-align: left;
+ margin-left: 0px;
+}
+
+.wym_skin_minimal div.wym_dropdown a:hover {
+ background: #BBB;
+ border-bottom: none;
+}
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/skin.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/skin.js
new file mode 100644
index 0000000..af29ed4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/minimal/skin.js
@@ -0,0 +1,30 @@
+jQuery.fn.selectify = function() {
+ return this.each(function() {
+ jQuery(this).hover(
+ function() {
+ jQuery("h2", this).css("background-position", "0px -18px");
+ jQuery("ul", this).fadeIn("fast");
+ },
+ function() {
+ jQuery("h2", this).css("background-position", "");
+ jQuery("ul", this).fadeOut("fast");
+ }
+ );
+ });
+};
+
+WYMeditor.SKINS['minimal'] = {
+ //placeholder for the skin JS, if needed
+
+ //init the skin
+ //wym is the WYMeditor.editor instance
+ init: function(wym) {
+
+ //render following sections as dropdown menus
+ jQuery(wym._box).find(wym._options.toolsSelector + ', ' + wym._options.containersSelector + ', ' + wym._options.classesSelector)
+ .addClass("wym_dropdown")
+ .selectify();
+
+
+ }
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/COPYING b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/README b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/README
new file mode 100644
index 0000000..130dc46
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/README
@@ -0,0 +1,27 @@
+/**
+* @version Alpha 0.1 2008-05-10 23:28:43 $
+* @package Silver skin for WYMeditor
+* @copyright Copyright (C) 2008 Scott Edwin Lewis. All rights reserved.
+* @license GNU/GPL, see COPYING
+* Silver skin for WYMeditor is free software and is licensed under the
+* GNU General Public License. See COPYING for copyright notices and details.
+*/
+
+Adds custom buttons and color palette to the WYMeditor XHTML Editor.
+
+INSTALLATION:
+
+1. Copy the entire /silver/ directory to /wymeditor/skins/
+2. Initialize the WYMeditor 'skin' option as below:
+
+<script type="text/javascript">
+jQuery(function() {
+
+ jQuery('.wymeditor').wymeditor({
+ skin: 'silver'
+ });
+
+});
+</script>
+
+That's it. You're done.
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.header.gif b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.header.gif
new file mode 100644
index 0000000..b2d2907
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.header.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.selector.silver.gif b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.selector.silver.gif
new file mode 100644
index 0000000..e65976b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.selector.silver.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.wymeditor.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.wymeditor.png
new file mode 100644
index 0000000..1e84813
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/bg.wymeditor.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/icons.silver.gif b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/icons.silver.gif
new file mode 100644
index 0000000..8c6a4fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/images/icons.silver.gif
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/skin.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/skin.css
new file mode 100644
index 0000000..8284d81
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/skin.css
@@ -0,0 +1,297 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * screen.css
+ * main stylesheet for the default WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+ * Scott Edwin Lewis
+*/
+
+/*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/
+ .wym_skin_silver p, .wym_skin_silver h2, .wym_skin_silver h3,
+ .wym_skin_silver ul, .wym_skin_silver li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; }
+
+
+/*HIDDEN BY DEFAULT*/
+ .wym_skin_silver .wym_area_left { display: none; }
+ .wym_skin_silver .wym_area_right { display: block; }
+
+
+/*TYPO*/
+ .wym_skin_silver { font-size: 62.5%; font-family: Verdana, Arial, sans-serif; }
+ .wym_skin_silver h2 { font-size: 110%; /* = 11px */}
+ .wym_skin_silver h3 { font-size: 100%; /* = 10px */}
+ .wym_skin_silver li { font-size: 100%; /* = 10px */}
+
+
+/*WYM_BOX*/
+ .wym_skin_silver { border: 1px solid gray; background: #f2f2f2; padding: 0px; margin: 0px;}
+
+ /*auto-clear the wym_box*/
+ .wym_skin_silver:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_silver { height: 1%;}
+
+
+/*WYM_HTML*/
+ .wym_skin_silver .wym_html { width: 98%;}
+ .wym_skin_silver .wym_html textarea { width: 100%; height: 200px; border: 1px solid gray; background: white; }
+
+
+/*WYM_IFRAME*/
+ .wym_skin_silver .wym_iframe { width: 98%;}
+ .wym_skin_silver .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white }
+
+
+/*AREAS*/
+ .wym_skin_silver .wym_area_left { width: 150px; float: left;}
+ .wym_skin_silver .wym_area_right { width: 150px; float: right;}
+ .wym_skin_silver .wym_area_bottom { height: 1%; clear: both;}
+ * html .wym_skin_silver .wym_area_main { height: 1%;}
+ * html .wym_skin_silver .wym_area_top { height: 1%;}
+ *+html .wym_skin_silver .wym_area_top { height: 1%;}
+
+/*SECTIONS SYSTEM*/
+
+ /*common defaults for all sections*/
+ .wym_skin_silver .wym_section { margin-bottom: 5px; }
+ .wym_skin_silver .wym_section h2,
+ .wym_skin_silver .wym_section h3 { padding: 1px 3px; margin: 0; cursor: pointer; }
+ .wym_skin_silver .wym_section a { padding: 5px 0px 0px 10px; display: block; text-decoration: none; color: black; }
+ .wym_skin_silver .wym_section a:hover { /*background-color: #DDD;*/}
+ /*hide section titles by default*/
+ .wym_skin_silver .wym_section h2 { display: none; }
+ /*disable any margin-collapse*/
+ .wym_skin_silver .wym_section { padding-top: 1px; padding-bottom: 1px; }
+ /*auto-clear sections*/
+ .wym_skin_silver .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; padding: 0px; }
+ * html .wym_skin_silver .wym_section ul { height: 1%;}
+ .wym_skin_silver .wym_section li {}
+
+ /*option: add this class to a section to make it render as a panel*/
+ .wym_skin_silver .wym_panel { }
+ .wym_skin_silver .wym_panel h2 { display: block; font-size: 11px; }
+
+ /*option: add this class to a section to make it render as a dropdown menu*/
+ .wym_skin_silver .wym_dropdown h2 { display: block; font-size: 11px;}
+ .wym_skin_silver .wym_dropdown ul { position: absolute; background: white; padding: 0px;}
+ .wym_skin_silver .wym_dropdown:hover ul,
+ .wym_skin_silver .wym_dropdown.hover ul { cursor: pointer;}
+ .wym_skin_silver .wym_dropdown ul li a {/*border-bottom: 1px solid #AAA;*/}
+
+ /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/
+ .wym_skin_silver .wym_buttons li { float:left;}
+ .wym_skin_silver .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px; text-decoration: none !important; border: 1px solid #666; }
+ .wym_skin_silver .wym_buttons a:hover { text-decoration: none !important; border: 1px solid #000;}
+ /*image replacements*/
+ .wym_skin_silver .wym_buttons li a { background: url(images/icons.silver.gif) no-repeat; text-indent: -9999px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_strong a { background-position: 0 -384px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_emphasis a { background-position: 0 -24px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_superscript a { background-position: 0 -432px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_subscript a { background-position: 0 -456px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_indent a { background-position: 0 -600px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_outdent a { background-position: 0 -624px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_undo a { background-position: 0 -504px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_redo a { background-position: 0 -528px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_link a { background-position: 0 -96px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_image a { background-position: 0 -120px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_table a { background-position: 0 -144px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_html a { background-position: 0 -192px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_gadget a { background-position: 0 -576px;}
+
+ .wym_skin_silver .wym_buttons li.wym_tools_strong a:hover { background-position: -24px -384px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_emphasis a:hover { background-position: -24px -24px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_superscript a:hover { background-position: -24px -432px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_subscript a:hover { background-position: -24px -456px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_ordered_list a:hover { background-position: -24px -48px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_unordered_list a:hover{ background-position: -24px -72px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_indent a:hover { background-position: -24px -600px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_outdent a:hover { background-position: -24px -624px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_undo a:hover { background-position: -24px -504px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_redo a:hover { background-position: -24px -528px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_link a:hover { background-position: -24px -96px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_unlink a:hover { background-position: -24px -168px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_image a:hover { background-position: -24px -120px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_table a:hover { background-position: -24px -144px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_paste a:hover { background-position: -24px -552px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_html a:hover { background-position: -24px -192px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_preview a:hover { background-position: -24px -408px;}
+ .wym_skin_silver .wym_buttons li.wym_tools_gadget a:hover { background-position: -24px -576px;}
+
+/*DECORATION*/
+ .wym_skin_silver .wym_section h2 { background: #ddd; border: none;}
+ .wym_skin_silver .wym_section h2 span { color: gray;}
+ .wym_skin_silver .wym_panel { padding: 0; border: solid gray; border-width: 0px;}
+ .wym_skin_silver .wym_panel ul { margin: 2px 0 5px; }
+ .wym_skin_silver .wym_dropdown { padding: 0; border: none; }
+ .wym_skin_silver .wym_dropdown ul { border: none; margin-left: -1px; padding: 0px;}
+
+/*DIALOGS*/
+ .wym_dialog div.row { margin-bottom: 5px;}
+ .wym_dialog div.row input { margin-right: 5px;}
+ .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; }
+ .wym_dialog div.row-indent { padding-left: 160px; }
+ /*autoclearing*/
+ .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ .wym_dialog div.row { display: inline-block; }
+ /* Hides from IE-mac \*/
+ * html .wym_dialog div.row { height: 1%; }
+ .wym_dialog div.row { display: block; }
+ /* End hide from IE-mac */
+
+/*WYMEDITOR_LINK*/
+ a.wym_wymeditor_link
+ {
+ text-indent: -9999px;
+ float: right;
+ display: block;
+ width: 50px;
+ height: 15px;
+ background: url(../wymeditor_icon.png);
+ background-position: 1px 1px;
+ background-repeat: no-repeat;
+ overflow: hidden;
+ text-decoration: none;
+ padding: 1px !important;
+ border: 1px solid #333 !important;
+ background-color: #FFF !important;
+ }
+
+.wym_box
+{
+ padding: 0px !important;
+ margin: 0px;
+}
+.wym_inner
+{
+ border-left: 1px solid #FFF;
+ border-top: 1px solid #FFF;
+ border-right: 1px solid #FFF;
+ border-bottom: 1px solid #FFF;
+ padding: 5px;
+ background-color: #B8C1C4;
+ height: auto;
+}
+
+.clear {clear: both;}
+
+div.wym_dropdown
+{
+ cursor: pointer;
+ width: 138px !important;
+ margin: 0px 4px 10px 0px !important;
+ padding: 0px;
+ z-index: 1001;
+ display: block;
+ border: 1px solid red;
+}
+
+div.wym_dropdown ul
+{
+ display: none;
+ width: 124px;
+ padding: 0px !important;
+ margin: 0px !important;
+ list-style-type: none;
+ list-style-image: none;
+ z-index: 1002;
+ position: absolute;
+ border-top: 1px solid #AAA;
+}
+
+div.wym_dropdown ul li
+{
+ width: 146px;
+ height: 20px;
+ padding: 0px !important;
+ margin: 0px;
+ border: 1px solid #777;
+ border-top: none;
+ background: #DDD;
+ list-style-image: none;
+}
+
+div.wym_dropdown h2
+{
+ width: 138px;
+ height: 16px;
+ color: #000 !important;
+ background-image: url(images/bg.selector.silver.gif) !important;
+ background-position: 0px -18px;
+ background-repeat: no-repeat;
+ border: none;
+ font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif;
+ font-size: 12px !important;
+ font-weight: bold !important;
+ padding: 2px 0px 0px 10px !important;
+ margin: 0px !important;
+}
+
+.wym_skin_silver .wym_panel h2
+{
+ width: 138px;
+ height: 16px;
+ color: #000 !important;
+ background-image: url(images/bg.header.gif) !important;
+ background-position: 0px 0px;
+ background-repeat: no-repeat;
+ border: none;
+ font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif;
+ font-size: 12px !important;
+ font-weight: bold !important;
+ padding: 2px 0px 0px 10px !important;
+ margin: 0px !important;
+}
+
+.wym_skin_silver .wym_panel ul
+{
+ margin-top: 0px !important;
+}
+
+.wym_skin_silver .wym_panel ul li
+{
+ width: 146px;
+ height: 20px;
+ padding: 0px !important;
+ margin: 0px;
+ border: 1px solid #777;
+ border-top: none;
+ background: #DDD;
+ list-style-image: none;
+}
+
+.wym_skin_silver .wym_panel a,
+div.wym_dropdown a
+{
+ text-decoration: none;
+ font-family: "Trebuchet MS", Verdana, Arial, Helvetica, Sanserif;
+ font-size: 12px;
+ padding: 5px 0px 0px 10px !important;
+ display: block;
+ width: 136px;
+ height: 15px;
+ color: #000;
+ text-align: left !important;
+ margin-left: 0px !important;
+}
+
+div.wym_dropdown a:hover,
+.wym_skin_silver .wym_panel a:hover
+{
+ background: #BBB;
+ border-bottom: none !important;
+}
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/skin.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/skin.js
new file mode 100644
index 0000000..948ed91
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/silver/skin.js
@@ -0,0 +1,61 @@
+/* This file is part of the Silver skin for WYMeditor by Scott Edwin Lewis */
+
+jQuery.fn.selectify = function() {
+ return this.each(function() {
+ jQuery(this).hover(
+ function() {
+ jQuery("h2", this).css("background-position", "0px -18px");
+ jQuery("ul", this).fadeIn("fast");
+ },
+ function() {
+ jQuery("h2", this).css("background-position", "");
+ jQuery("ul", this).fadeOut("fast");
+ }
+ );
+ });
+};
+
+WYMeditor.SKINS['silver'] = {
+
+ init: function(wym) {
+
+ //add some elements to improve the rendering
+ jQuery(wym._box)
+ .append('<div class="clear"></div>')
+ .wrapInner('<div class="wym_inner"></div>');
+
+ //render following sections as panels
+ jQuery(wym._box).find(wym._options.classesSelector)
+ .addClass("wym_panel");
+
+ //render following sections as buttons
+ jQuery(wym._box).find(wym._options.toolsSelector)
+ .addClass("wym_buttons");
+
+ //render following sections as dropdown menus
+ jQuery(wym._box).find(wym._options.containersSelector)
+ .addClass("wym_dropdown")
+ .selectify();
+
+ // auto add some margin to the main area sides if left area
+ // or right area are not empty (if they contain sections)
+ jQuery(wym._box).find("div.wym_area_right ul")
+ .parents("div.wym_area_right").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-right": "155px"});
+
+ jQuery(wym._box).find("div.wym_area_left ul")
+ .parents("div.wym_area_left").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-left": "155px"});
+
+ //make hover work under IE < 7
+ jQuery(wym._box).find(".wym_section").hover(function(){
+ jQuery(this).addClass("hover");
+ },function(){
+ jQuery(this).removeClass("hover");
+ });
+ }
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/icons.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/icons.png
new file mode 100644
index 0000000..c6eb463
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/icons.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/skin.css b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/skin.css
new file mode 100644
index 0000000..7e6b8fd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/skin.css
@@ -0,0 +1,134 @@
+/*
+ * WYMeditor : what you see is What You Mean web-based editor
+ * Copyright (c) 2005 - 2009 Jean-Francois Hovinne, http://www.wymeditor.org/
+ * Dual licensed under the MIT (MIT-license.txt)
+ * and GPL (GPL-license.txt) licenses.
+ *
+ * For further information visit:
+ * http://www.wymeditor.org/
+ *
+ * File Name:
+ * screen.css
+ * main stylesheet for the WYMeditor skin
+ * See the documentation for more info.
+ *
+ * File Authors:
+ * Daniel Reszka (d.reszka a-t wymeditor dotorg)
+ * Jean-Francois Hovinne
+*/
+
+/*TRYING TO RESET STYLES THAT MAY INTERFERE WITH WYMEDITOR*/
+ .wym_skin_twopanels p, .wym_skin_twopanels h2, .wym_skin_twopanels h3,
+ .wym_skin_twopanels ul, .wym_skin_twopanels li { background: transparent url(); margin: 0; padding: 0; border-width:0; list-style: none; }
+
+
+/*HIDDEN BY DEFAULT*/
+ .wym_skin_twopanels .wym_area_left { display: block; }
+ .wym_skin_twopanels .wym_area_right { display: block; }
+
+
+/*TYPO*/
+ .wym_skin_twopanels { font-size: 62.5%; font-family: Verdana, Arial, sans-serif; }
+ .wym_skin_twopanels h2 { font-size: 110%; /* = 11px */}
+ .wym_skin_twopanels h3 { font-size: 100%; /* = 10px */}
+ .wym_skin_twopanels li { font-size: 100%; /* = 10px */}
+
+
+/*WYM_BOX*/
+ .wym_skin_twopanels { border: 1px solid gray; background: #f2f2f2; padding: 5px}
+
+ /*auto-clear the wym_box*/
+ .wym_skin_twopanels:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_twopanels { height: 1%;}
+
+
+/*WYM_HTML*/
+ .wym_skin_twopanels .wym_html { width: 98%;}
+ .wym_skin_twopanels .wym_html textarea { width: 100%; height: 200px; border: 1px solid gray; background: white; }
+
+
+/*WYM_IFRAME*/
+ .wym_skin_twopanels .wym_iframe { width: 98%;}
+ .wym_skin_twopanels .wym_iframe iframe { width: 100%; height: 200px; border: 1px solid gray; background: white }
+
+
+/*AREAS*/
+ .wym_skin_twopanels .wym_area_left { width: 100px; float: left;}
+ .wym_skin_twopanels .wym_area_right { width: 150px; float: right;}
+ .wym_skin_twopanels .wym_area_bottom { height: 1%; clear: both;}
+ * html .wym_skin_twopanels .wym_area_main { height: 1%;}
+ * html .wym_skin_twopanels .wym_area_top { height: 1%;}
+ *+html .wym_skin_twopanels .wym_area_top { height: 1%;}
+
+/*SECTIONS SYSTEM*/
+
+ /*common defaults for all sections*/
+ .wym_skin_twopanels .wym_section { margin-bottom: 5px; }
+ .wym_skin_twopanels .wym_section h2,
+ .wym_skin_twopanels .wym_section h3 { padding: 1px 3px; margin: 0; }
+ .wym_skin_twopanels .wym_section a { padding: 0 3px; display: block; text-decoration: none; color: black; }
+ .wym_skin_twopanels .wym_section a:hover { background-color: yellow; }
+ /*hide section titles by default*/
+ .wym_skin_twopanels .wym_section h2 { display: none; }
+ /*disable any margin-collapse*/
+ .wym_skin_twopanels .wym_section { padding-top: 1px; padding-bottom: 1px; }
+ /*auto-clear sections*/
+ .wym_skin_twopanels .wym_section ul:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ * html .wym_skin_twopanels .wym_section ul { height: 1%;}
+
+ /*option: add this class to a section to make it render as a panel*/
+ .wym_skin_twopanels .wym_panel { }
+ .wym_skin_twopanels .wym_panel h2 { display: block; }
+
+ /*option: add this class to a section to make it render as a dropdown menu*/
+ .wym_skin_twopanels .wym_dropdown h2 { display: block; }
+ .wym_skin_twopanels .wym_dropdown ul { display: none; position: absolute; background: white; }
+ .wym_skin_twopanels .wym_dropdown:hover ul,
+ .wym_skin_twopanels .wym_dropdown.hover ul { display: block; }
+
+ /*option: add this class to a section to make its elements render buttons (icons are only available for the wym_tools section for now)*/
+ .wym_skin_twopanels .wym_buttons li { float:left;}
+ .wym_skin_twopanels .wym_buttons a { width: 20px; height: 20px; overflow: hidden; padding: 2px }
+ /*image replacements*/
+ .wym_skin_twopanels .wym_buttons li a { background: url(icons.png) no-repeat; text-indent: -9999px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_strong a { background-position: 0 -382px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_emphasis a { background-position: 0 -22px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_superscript a { background-position: 0 -430px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_subscript a { background-position: 0 -454px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_ordered_list a { background-position: 0 -48px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_unordered_list a{ background-position: 0 -72px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_indent a { background-position: 0 -574px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_outdent a { background-position: 0 -598px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_undo a { background-position: 0 -502px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_redo a { background-position: 0 -526px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_link a { background-position: 0 -96px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_unlink a { background-position: 0 -168px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_image a { background-position: 0 -121px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_table a { background-position: 0 -144px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_paste a { background-position: 0 -552px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_html a { background-position: 0 -193px;}
+ .wym_skin_twopanels .wym_buttons li.wym_tools_preview a { background-position: 0 -408px;}
+
+/*DECORATION*/
+ .wym_skin_twopanels .wym_section h2 { background: #ddd; border: solid gray; border-width: 0 0 1px;}
+ .wym_skin_twopanels .wym_section h2 span { color: gray;}
+ .wym_skin_twopanels .wym_panel { padding: 0; border: solid gray; border-width: 1px; background: white;}
+ .wym_skin_twopanels .wym_panel ul { margin: 2px 0 5px; }
+ .wym_skin_twopanels .wym_dropdown { padding: 0; border: solid gray; border-width: 1px 1px 0 1px; }
+ .wym_skin_twopanels .wym_dropdown ul { border: solid gray; border-width: 0 1px 1px 1px; margin-left: -1px; padding: 5px 10px 5px 3px;}
+
+/*DIALOGS*/
+ .wym_dialog div.row { margin-bottom: 5px;}
+ .wym_dialog div.row input { margin-right: 5px;}
+ .wym_dialog div.row label { float: left; width: 150px; display: block; text-align: right; margin-right: 10px; }
+ .wym_dialog div.row-indent { padding-left: 160px; }
+ /*autoclearing*/
+ .wym_dialog div.row:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+ .wym_dialog div.row { display: inline-block; }
+ /* Hides from IE-mac \*/
+ * html .wym_dialog div.row { height: 1%; }
+ .wym_dialog div.row { display: block; }
+ /* End hide from IE-mac */
+
+/*WYMEDITOR_LINK*/
+ a.wym_wymeditor_link { text-indent: -9999px; float: right; display: block; width: 50px; height: 15px; background: url(../wymeditor_icon.png); overflow: hidden; text-decoration: none; }
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/skin.js b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/skin.js
new file mode 100644
index 0000000..e82efc5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/twopanels/skin.js
@@ -0,0 +1,39 @@
+WYMeditor.SKINS['twopanels'] = {
+
+ init: function(wym) {
+
+ //move the containers panel to the left area
+ jQuery(wym._box).find(wym._options.containersSelector)
+ .appendTo("div.wym_area_left");
+
+ //render following sections as panels
+ jQuery(wym._box).find(wym._options.classesSelector + ', '
+ + wym._options.containersSelector)
+ .addClass("wym_panel");
+
+ //render following sections as buttons
+ jQuery(wym._box).find(wym._options.toolsSelector)
+ .addClass("wym_buttons");
+
+ // auto add some margin to the main area sides if left area
+ // or right area are not empty (if they contain sections)
+ jQuery(wym._box).find("div.wym_area_right ul")
+ .parents("div.wym_area_right").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-right": "155px"});
+
+ jQuery(wym._box).find("div.wym_area_left ul")
+ .parents("div.wym_area_left").show()
+ .parents(wym._options.boxSelector)
+ .find("div.wym_area_main")
+ .css({"margin-left": "115px"});
+
+ //make hover work under IE < 7
+ jQuery(wym._box).find(".wym_section").hover(function(){
+ jQuery(this).addClass("hover");
+ },function(){
+ jQuery(this).removeClass("hover");
+ });
+ }
+};
diff --git a/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/wymeditor_icon.png b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/wymeditor_icon.png
new file mode 100644
index 0000000..d4fc155
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/static/objectapp/js/wymeditor/skins/wymeditor_icon.png
Binary files differ
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/404.html b/build/lib.linux-i686-2.6/objectapp/templates/404.html
new file mode 100644
index 0000000..7551f02
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/404.html
@@ -0,0 +1,46 @@
+{% extends "objectapp/skeleton.html" %}
+{% load i18n objectapp_tags %}
+
+{% block breadcrumbs %}
+ {% trans "Error 404" %}
+{% endblock %}
+
+{% block title %}{% trans "Page not found" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Page not found" %}</h2>
+
+<p>{% trans "Sorry, but the requested page could not be found." %}</p>
+
+<h3>{% trans "Useful links" %}</h3>
+<div class="links">
+ <ul>
+ <li>
+ <a href="{% url objectapp_gbobject_archive_index %}" title="{% trans "Blog index" %}">
+ {% trans "Blog index" %}
+ </a>
+ </li>
+ <li>
+ <a href="{% url objectapp_sitemap %}" title="{% trans "Sitemap" %}">
+ {% trans "Sitemap" %}
+ </a>
+ </li>
+ </ul>
+</div>
+
+<h3>{% trans "Recent gbobjects" %}</h3>
+<div class="recents">
+ {% get_recent_gbobjects 5 %}
+</div>
+
+<h3>{% trans "Search" %}</h3>
+<div class="search">
+ <form method="get" id="searchform" action="{% url objectapp_gbobject_search %}">
+ <p>
+ <input type="text" value="{% trans "Keywords..." %}" name="pattern" id="searchbox" onfocus="this.value=''"/>
+ <input type="submit" class="submitbutton" value="OK" />
+ </p>
+ </form>
+</div>
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/500.html b/build/lib.linux-i686-2.6/objectapp/templates/500.html
new file mode 100644
index 0000000..f481350
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/500.html
@@ -0,0 +1,46 @@
+{% extends "objectapp/skeleton.html" %}
+{% load i18n objectapp_tags %}
+
+{% block breadcrumbs %}
+ {% trans "Error 500" %}
+{% endblock %}
+
+{% block title %}{% trans "Server error" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Server error" %}</h2>
+
+<p>{% trans "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience." %}</p>
+
+<h3>{% trans "Useful links" %}</h3>
+<div class="links">
+ <ul>
+ <li>
+ <a href="{% url objectapp_gbobject_archive_index %}" title="{% trans "Blog index" %}">
+ {% trans "Blog index" %}
+ </a>
+ </li>
+ <li>
+ <a href="{% url objectapp_sitemap %}" title="{% trans "Sitemap" %}">
+ {% trans "Sitemap" %}
+ </a>
+ </li>
+ </ul>
+</div>
+
+<h3>{% trans "Recent gbobjects" %}</h3>
+<div class="recents">
+ {% get_recent_gbobjects 5 %}
+</div>
+
+<h3>{% trans "Search" %}</h3>
+<div class="search">
+ <form method="get" id="searchform" action="{% url objectapp_gbobject_search %}">
+ <p>
+ <input type="text" value="{% trans "Keywords..." %}" name="pattern" id="searchbox" onfocus="this.value=''"/>
+ <input type="submit" class="submitbutton" value="OK" />
+ </p>
+ </form>
+</div>
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/app_index.html b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/app_index.html
new file mode 100644
index 0000000..769c163
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/app_index.html
@@ -0,0 +1,41 @@
+{% extends "admin/app_index.html" %}
+{% load i18n adminmedia %}
+
+{% block extrastyle %}
+{{ block.super }}
+<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}objectapp/css/jquery.autocomplete.css" />
+<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}objectapp/css/dashboard_objectapp.css" />
+{% endblock %}
+
+{% block extrahead %}
+{{ block.super }}
+<script type="text/javascript" src="{{ STATIC_URL }}objectapp/js/jquery.js"></script>
+<script type="text/javascript" src="{{ STATIC_URL }}objectapp/js/jquery.masonry.js"></script>
+<script type="text/javascript" src="{{ STATIC_URL }}objectapp/js/jquery.bgiframe.js"></script>
+<script type="text/javascript" src="{{ STATIC_URL }}objectapp/js/jquery.autocomplete.js"></script>
+<script type="text/javascript" src="{% url admin:objectapp_gbobject_autocomplete_tags %}"></script>
+<script type="text/javascript">
+$(document).ready(function() {
+ $("#content-main").masonry({
+ singleMode: true, itemSelector: ".module"
+ });
+});
+</script>
+{% endblock %}
+
+{% block content %}
+<div id="content-main">
+ {% include "admin/objectapp/widgets/content_stats.html" %}
+
+ {% include "admin/objectapp/widgets/quickpost.html" %}
+
+ {% include "admin/objectapp/widgets/recent_comments.html" %}
+
+ {% include "admin/objectapp/widgets/draft_gbobjects.html" %}
+
+ {% include "admin/objectapp/widgets/recent_linkbacks.html" %}
+</div>
+{% endblock %}
+
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/autocomplete_tags.js b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/autocomplete_tags.js
new file mode 100644
index 0000000..41cb344
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/autocomplete_tags.js
@@ -0,0 +1,11 @@
+{% load tagging_tags %}
+
+$(document).ready(function() {
+ {% tags_for_model objectapp.Gbobject as gbobject_tags %}
+ var data = "{{ gbobject_tags|join:',' }}".split(",");
+ $("#id_tags").autocomplete(data, {
+ width: 150, max: 10,
+ multiple: true, multipleSeparator: ", ",
+ scroll: true, scrollHeight: 300,
+ matchContains: true, autoFill: true,});
+}); \ No newline at end of file
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/markitup.js b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/markitup.js
new file mode 100644
index 0000000..543d49b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/markitup.js
@@ -0,0 +1,3 @@
+$(document).ready(function() {
+ $("#id_content").markItUp(mySettings);
+});
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/tinymce_textareas.js b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/tinymce_textareas.js
new file mode 100644
index 0000000..51461c6
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/tinymce_textareas.js
@@ -0,0 +1,23 @@
+tinyMCE.init({
+ mode: "exact",
+ elements: "id_content",
+ theme: "advanced",
+ skin : "o2k7",
+ skin_variant : "silver",
+ height: "250",
+ width: "800",
+ relative_urls: false,
+ language: "{{ language }}",
+ directionality: "{{ directionality }}",
+ spellchecker_languages : "{{ spellchecker_languages }}",
+ spellchecker_rpc_url : "{{ spellchecker_rpc_url }}",
+ theme_advanced_toolbar_location : "top",
+ theme_advanced_toolbar_align : "left",
+ theme_advanced_statusbar_location : "bottom",
+ theme_advanced_resizing : true,
+ plugins: "contextmenu,directionality,fullscreen,paste,preview,searchreplace,spellchecker,visualchars,wordcount",
+ paste_auto_cleanup_on_paste : true,
+ theme_advanced_buttons1 : "formatselect,fontsizeselect,|,undo,redo,|,cut,copy,paste,pastetext,pasteword,|,search,replace,|,visualchars,visualaid,cleanup,code,preview,fullscreen",
+ theme_advanced_buttons2 : "bold,italic,underline,strikethrough,|,forecolor,backcolor,removeformat,|,justifyleft,justifycenter,justifyright,justifyfull,|,sub,sup,|,bullist,numlist,|,outdent,indent,|,link,unlink,anchor,image,blockquote,hr,charmap,",
+ theme_advanced_buttons3 : "",
+ });
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/wymeditor.js b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/wymeditor.js
new file mode 100644
index 0000000..f67218c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/gbobject/wymeditor.js
@@ -0,0 +1,10 @@
+$(document).ready(function() {
+ $("#id_content").wymeditor({
+ skin: "django", lang: "{{ LANGUAGE_CODE }}",
+ stylesheet: "{{ STATIC_URL }}objectapp/css/wymeditor_styles.css",
+ updateSelector: "input:submit", updateEvent: "click",
+ postInit: function(wym) {
+ wym.hovertools();
+ }
+ });
+ });
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_content_stats.html b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_content_stats.html
new file mode 100644
index 0000000..ab1b484
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_content_stats.html
@@ -0,0 +1,38 @@
+{% load i18n %}
+
+<tr>
+ <th>{% trans "Contents" %}</th>
+ <th>{% trans "Discussions" %}</th>
+</tr>
+<tr>
+ <td>
+ <a href="{% url admin:objectapp_gbobject_changelist %}">
+ {% blocktrans %}{{ gbobjects }} gbobjects{% endblocktrans %}
+ </a>
+ </td>
+ <td>
+ <a href="{% url admin:comments_comment_changelist %}?is_public__exact=1">
+ {% blocktrans %}{{ comments }} comments{% endblocktrans %}
+ </a>
+ </td>
+</tr>
+<tr>
+ <td>
+ <a href="{% url admin:tagging_tag_changelist %}">
+ {% blocktrans %}{{ tags }} tags{% endblocktrans %}
+ </a>
+ </td>
+ <td>{% blocktrans %}{{ trackbacks }} trackbacks{% endblocktrans %}</td>
+</tr>
+<tr>
+ <td>
+ <a href="{% url admin:auth_user_changelist %}">
+ {% blocktrans %}{{ authors }} authors{% endblocktrans %}
+ </a>
+ </td>
+ <td>
+ <a href="{% url admin:comments_comment_changelist %}?is_public__exact=0">
+ {% blocktrans %}{{ rejects }} rejected{% endblocktrans %}
+ </a>
+ </td>
+</tr>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_draft_gbobjects.html b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_draft_gbobjects.html
new file mode 100644
index 0000000..ea7fca9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_draft_gbobjects.html
@@ -0,0 +1,37 @@
+{% load i18n objectapp_tags %}
+
+{% for gbobject in gbobjects %}
+<tr>
+ <th>
+ <a href="{% url admin:objectapp_gbobject_change gbobject.pk %}"
+ title="{% trans "Edit the gbobject" %}">
+ {{ gbobject.title }}
+ </a>
+ {% trans "on" %}
+ <abbr>{{ gbobject.creation_date|date:"DATE_FORMAT" }}</abbr>
+ {{ gbobject.html_content|truncatewords_html:20|safe }}
+ </th>
+ <td>
+ <a href="{{ gbobject.get_absolute_url }}" class="previewlink">
+ {% trans "Preview" %}
+ </a>
+ </td>
+</tr>
+{% empty %}
+<tr>
+ <th colspan="2">
+ {% trans "No draft gbobjects." %}
+ </th>
+</tr>
+{% endfor %}
+
+{% if gbobjects %}
+<tr>
+ <th colspan="2">
+ <a href="{% url admin:objectapp_gbobject_changelist %}?status__exact=0"
+ title="{% trans "View all draft gbobjects" %}" class="managelink">
+ {% trans "View all draft gbobjects" %}
+ </a>
+ </th>
+</tr>
+{% endif %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_recent_comments.html b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_recent_comments.html
new file mode 100644
index 0000000..afa65e3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_recent_comments.html
@@ -0,0 +1,45 @@
+{% load i18n objectapp_tags %}
+
+{% for comment in comments %}
+<tr>
+ <th>
+ <img src="{% get_gravatar comment.email 40 "G" %}"
+ class="gravatar photo" alt="{{ comment.user_name }}" />
+ </th>
+ <td>
+ {% with comment.content_object as gbobject %}
+ <strong>{{ comment.user_name }}</strong> {% trans "in" %}
+ <strong>
+ <a href="{{ gbobject.get_absolute_url }}#comment_{{ comment.pk }}"
+ title="{% trans "Comment on" %} {{ gbobject.title }}">
+ {{ gbobject.title }}
+ </a>
+ </strong>
+ {% endwith %}
+ {{ comment.comment|truncatewords:20|linebreaks }}
+ </td>
+ <td>
+ <a href="{% url admin:comments_comment_change comment.pk %}"
+ title="{% trans "Edit the comment" %}" class="changelink">
+ {% trans "Edit" %}
+ </a>
+ </td>
+</tr>
+{% empty %}
+<tr>
+ <th colspan="3">
+ {% trans "No comments yet." %}
+ </th>
+</tr>
+{% endfor %}
+
+{% if comments %}
+<tr>
+ <th colspan="3">
+ <a href="{% url admin:comments_comment_changelist %}"
+ title="{% trans "Manage the comments" %}" class="managelink">
+ {% trans "Manage the comments" %}
+ </a>
+ </th>
+</tr>
+{% endif %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_recent_linkbacks.html b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_recent_linkbacks.html
new file mode 100644
index 0000000..89618eb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/_recent_linkbacks.html
@@ -0,0 +1,31 @@
+{% load i18n %}
+
+{% for linkback in linkbacks %}
+<tr>
+ <th>
+ {% with linkback.content_object as gbobject %}
+ <a href="{{ linkback.url }}">{{ linkback.user_name }}</a>
+ {% trans "made a linkback on" %}
+ <a href="{{ gbobject.get_absolute_url }}#{{ linkback.flags.all.0.flag }}_{{ linkback.pk }}"
+ title="{{ gbobject.title }}">
+ {{ gbobject.title }}
+ </a>
+ {% endwith %}
+ {{ linkback.comment|truncatewords:20|linebreaks }}
+ </th>
+ <td>
+ <a href="{% url admin:comments_comment_change linkback.pk %}"
+ title="{% trans "Edit the linkback" %}" class="changelink">
+ {% trans "Edit" %}
+ </a>
+ </td>
+</tr>
+{% empty %}
+<tr>
+ <th colspan="2">
+ {% trans "No linkbacks yet." %}
+ </th>
+</tr>
+{% endfor %}
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/base.html b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/base.html
new file mode 100644
index 0000000..d0790cd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/base.html
@@ -0,0 +1,6 @@
+<div id="{% block module_id %}{% endblock %}" class="module">
+ <table summary="{% block summary %}{% endblock %}">
+ <caption>{% block title %}{% endblock %}</caption>
+ {% block content %}{% endblock %}
+ </table>
+</div>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/content_stats.html b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/content_stats.html
new file mode 100644
index 0000000..ece7f58
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/content_stats.html
@@ -0,0 +1,12 @@
+{% extends "admin/objectapp/widgets/base.html" %}
+{% load i18n objectapp_admin_tags %}
+
+{% block module_id %}contents{% endblock %}
+
+{% block summary %}{% trans "Today" %}{% endblock %}
+{% block title %}{% trans "Today" %}{% endblock %}
+
+{% block content %}
+ {% get_content_stats %}
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/draft_gbobjects.html b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/draft_gbobjects.html
new file mode 100644
index 0000000..e59ea70
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/draft_gbobjects.html
@@ -0,0 +1,12 @@
+{% extends "admin/objectapp/widgets/base.html" %}
+{% load i18n objectapp_admin_tags %}
+
+{% block module_id %}drafts{% endblock %}
+
+{% block summary %}{% trans "Draft gbobjects" %}{% endblock %}
+{% block title %}{% trans "Draft gbobjects" %}{% endblock %}
+
+{% block content %}
+ {% get_draft_gbobjects %}
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/quickpost.html b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/quickpost.html
new file mode 100644
index 0000000..6bf0150
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/quickpost.html
@@ -0,0 +1,40 @@
+{% load i18n %}
+<div id="quickpost" class="module">
+ <form method="post" action="{% url objectapp_gbobject_quick_post %}">
+ {% csrf_token %}
+ <table summary="{% trans "Quick publishing" %}">
+ <caption>{% trans "Quick publishing" %}</caption>
+ <tr>
+ <th>
+ <label for="id_title" class="required">{% trans "Title" %}:</label>
+ </th>
+ <td>
+ <input name="title" class="vTextField" maxlength="255" id="id_title" type="text" />
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <label for="id_content" class="required">{% trans "Content" %}:</label>
+ </th>
+ <td>
+ <textarea id="id_content" rows="7" name="content" class="vLargeTextField"></textarea>
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <label for="id_tags">{% trans "Tags" %}:</label>
+ </th>
+ <td>
+ <input name="tags" class="vTextField" maxlength="255" id="id_tags" type="text" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input type="submit" value="{% trans "Save as draft" %}" name="save_draft" class="button" />
+ <input type="reset" value="{% trans "Reset" %}" class="button" />
+ <input type="submit" value="{% trans "Publish" %}" class="default" name="save" />
+ </td>
+ </tr>
+ </table>
+ </form>
+</div>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/recent_comments.html b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/recent_comments.html
new file mode 100644
index 0000000..e2a2127
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/recent_comments.html
@@ -0,0 +1,12 @@
+{% extends "admin/objectapp/widgets/base.html" %}
+{% load i18n objectapp_tags %}
+
+{% block module_id %}comments{% endblock %}
+
+{% block summary %}{% trans "Recent comments" %}{% endblock %}
+{% block title %}{% trans "Recent comments" %}{% endblock %}
+
+{% block content %}
+ {% get_recent_comments 3 "admin/objectapp/widgets/_recent_comments.html" %}
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/recent_linkbacks.html b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/recent_linkbacks.html
new file mode 100644
index 0000000..e104aa5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/admin/objectapp/widgets/recent_linkbacks.html
@@ -0,0 +1,12 @@
+{% extends "admin/objectapp/widgets/base.html" %}
+{% load i18n objectapp_tags %}
+
+{% block module_id %}linkbacks{% endblock %}
+
+{% block summary %}{% trans "Recent linkbacks" %}{% endblock %}
+{% block title %}{% trans "Recent linkbacks" %}{% endblock %}
+
+{% block content %}
+ {% get_recent_linkbacks 5 "admin/objectapp/widgets/_recent_linkbacks.html" %}
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/comments/comment_authors_email.txt b/build/lib.linux-i686-2.6/objectapp/templates/comments/comment_authors_email.txt
new file mode 100644
index 0000000..e32c876
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/comments/comment_authors_email.txt
@@ -0,0 +1,6 @@
+{% load i18n %}{% trans "Author" %}: {{ comment.userinfo.name }} {{ comment.userinfo.url }}
+
+{% trans "Comment" %}:
+{{ comment.comment }}
+
+{% trans "View this comment" %}: {{ protocol }}://{{ site }}{{ content_object.get_absolute_url }}#comment_{{ comment.pk }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/comments/comment_notification_email.txt b/build/lib.linux-i686-2.6/objectapp/templates/comments/comment_notification_email.txt
new file mode 100644
index 0000000..996166b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/comments/comment_notification_email.txt
@@ -0,0 +1,14 @@
+{% load i18n %}{% trans "Author" %}: {{ comment.userinfo.name }} {{ comment.userinfo.url }}
+{% trans "Email" %}: {{ comment.userinfo.email }}
+{% trans "IP" %}: {{ comment.ip_address }}
+
+{% trans "Comment" %}:
+{{ comment.comment }}
+
+{% trans "View this comment" %}: {{ protocol }}://{{ site }}{{ content_object.get_absolute_url }}#comment_{{ comment.pk }}
+
+{% trans "Flag this comment" %}: {{ protocol }}://{{ site }}{% url comments-flag comment.pk %}
+
+{% trans "Delete this comment" %}: {{ protocol }}://{{ site }}{% url comments-delete comment.pk %}
+
+{% trans "Approve this comment" %}: {{ protocol }}://{{ site }}{% url comments-approve comment.pk %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/comments/comment_reply_email.txt b/build/lib.linux-i686-2.6/objectapp/templates/comments/comment_reply_email.txt
new file mode 100644
index 0000000..e32c876
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/comments/comment_reply_email.txt
@@ -0,0 +1,6 @@
+{% load i18n %}{% trans "Author" %}: {{ comment.userinfo.name }} {{ comment.userinfo.url }}
+
+{% trans "Comment" %}:
+{{ comment.comment }}
+
+{% trans "View this comment" %}: {{ protocol }}://{{ site }}{{ content_object.get_absolute_url }}#comment_{{ comment.pk }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp/gbobject/form.html b/build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp/gbobject/form.html
new file mode 100644
index 0000000..a61758d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp/gbobject/form.html
@@ -0,0 +1,22 @@
+{% load comments i18n %}
+
+<form action="{% comment_form_target %}" method="post">
+ {% csrf_token %}
+ <fieldset>
+ <input type="hidden" name="next" value="{% url objectapp_discussion_success %}"/>
+ <legend>{% trans "Post your comment" %}</legend>
+ {% for field in form %}
+ {% if field.is_hidden %}{{ field }}{% else %}
+ <div{% if field.errors %} class="error"{% endif %}{% ifequal field.name "honeypot" %} style="display:none;"{% endifequal %}>
+ {{ field.label_tag }}
+ {% if field.errors %}{{ field.errors }}{% else %}<br />{% endif %}
+ {{ field }}
+ </div>
+ {% endif %}
+ {% endfor %}
+ <p class="submit">
+ <input type="submit" name="submit" class="submit-post" value="{% trans "Post" %}" />
+ <input type="submit" name="preview" class="submit-preview" value="{% trans "Preview" %}" />
+ </p>
+ </fieldset>
+</form>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp/gbobject/posted.html b/build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp/gbobject/posted.html
new file mode 100644
index 0000000..8db7d06
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp/gbobject/posted.html
@@ -0,0 +1,13 @@
+{% extends "objectapp/base.html" %}
+{% load i18n %}
+
+{% block title %}{% trans "Thanks for your comment" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Thanks for your comment" %}</h2>
+<p>
+ <a href="{% url objectapp_gbobject_archive_index %}" title="{% trans "Return to gbobject list" %}">
+ {% trans "Return to gbobject list" %}
+ </a>
+</p>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp_gbobject_preview.html b/build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp_gbobject_preview.html
new file mode 100644
index 0000000..47eaeed
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/comments/objectapp_gbobject_preview.html
@@ -0,0 +1,37 @@
+{% extends "objectapp/base.html" %}
+{% load i18n objectapp_tags comments %}
+
+{% block title %}{% trans "Comment preview" %}{% endblock %}
+
+{% block content %}
+ {% if form.errors %}
+ <h2>
+ {% blocktrans count form.errors|length as errors %}Please correct following error.{% plural %}Please correct following errors.{% endblocktrans %}
+ </h2>
+ {% else %}
+ <h2>{% trans "Preview of the comment" %}</h2>
+ <ol id="comment-list" class="span-15 last">
+ <li id="comment_preview" class="comment vcard {% cycle box1,box2 %} span-15 last">
+ <div class="span-2">
+ <img src="{% get_gravatar form.cleaned_data.email 60 "G" %}" class="gravatar photo" alt="form.cleaned_data.name" />
+ </div>
+ <div class="comment-body span-13 last">
+ <div class="comment-author span-13 last">
+ {% if form.cleaned_data.url %}
+ <a href="{{ form.cleaned_data.url }}" class="fn url">{{ form.cleaned_data.name }}</a>
+ {% else %}
+ {{ form.cleaned_data.name }}
+ {% endif %}
+ {% trans "on" %} {% now "m/d/Y P" %}
+ </div>
+ <div class="span-13 last">
+ {{ comment|linebreaks }}
+ </div>
+ </div>
+ </li>
+ </ol>
+ {% endif %}
+ <div class="commentForm span-16 last">
+ {% include "comments/objectapp/gbobject/form.html" %}
+ </div>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/feeds/comment_description.html b/build/lib.linux-i686-2.6/objectapp/templates/feeds/comment_description.html
new file mode 100644
index 0000000..8141388
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/feeds/comment_description.html
@@ -0,0 +1 @@
+{{ obj.comment }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/feeds/comment_title.html b/build/lib.linux-i686-2.6/objectapp/templates/feeds/comment_title.html
new file mode 100644
index 0000000..f9ee8ab
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/feeds/comment_title.html
@@ -0,0 +1,2 @@
+{% load i18n %}
+{{ obj.user_name }} {% trans "on" %} {{ obj.submit_date|date:"DATETIME_FORMAT" }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/feeds/discussion_description.html b/build/lib.linux-i686-2.6/objectapp/templates/feeds/discussion_description.html
new file mode 100644
index 0000000..8141388
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/feeds/discussion_description.html
@@ -0,0 +1 @@
+{{ obj.comment }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/feeds/discussion_title.html b/build/lib.linux-i686-2.6/objectapp/templates/feeds/discussion_title.html
new file mode 100644
index 0000000..f9ee8ab
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/feeds/discussion_title.html
@@ -0,0 +1,2 @@
+{% load i18n %}
+{{ obj.user_name }} {% trans "on" %} {{ obj.submit_date|date:"DATETIME_FORMAT" }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/feeds/gbobject_description.html b/build/lib.linux-i686-2.6/objectapp/templates/feeds/gbobject_description.html
new file mode 100644
index 0000000..7afb28a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/feeds/gbobject_description.html
@@ -0,0 +1 @@
+{{ obj.html_content|safe }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/feeds/gbobject_title.html b/build/lib.linux-i686-2.6/objectapp/templates/feeds/gbobject_title.html
new file mode 100644
index 0000000..91b32ca
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/feeds/gbobject_title.html
@@ -0,0 +1 @@
+{{ obj.title|safe }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/feeds/pingback_description.html b/build/lib.linux-i686-2.6/objectapp/templates/feeds/pingback_description.html
new file mode 100644
index 0000000..8141388
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/feeds/pingback_description.html
@@ -0,0 +1 @@
+{{ obj.comment }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/feeds/pingback_title.html b/build/lib.linux-i686-2.6/objectapp/templates/feeds/pingback_title.html
new file mode 100644
index 0000000..f9ee8ab
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/feeds/pingback_title.html
@@ -0,0 +1,2 @@
+{% load i18n %}
+{{ obj.user_name }} {% trans "on" %} {{ obj.submit_date|date:"DATETIME_FORMAT" }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/feeds/trackback_description.html b/build/lib.linux-i686-2.6/objectapp/templates/feeds/trackback_description.html
new file mode 100644
index 0000000..8141388
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/feeds/trackback_description.html
@@ -0,0 +1 @@
+{{ obj.comment }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/feeds/trackback_title.html b/build/lib.linux-i686-2.6/objectapp/templates/feeds/trackback_title.html
new file mode 100644
index 0000000..f9ee8ab
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/feeds/trackback_title.html
@@ -0,0 +1,2 @@
+{% load i18n %}
+{{ obj.user_name }} {% trans "on" %} {{ obj.submit_date|date:"DATETIME_FORMAT" }}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_gbobject_detail.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_gbobject_detail.html
new file mode 100644
index 0000000..10e1563
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_gbobject_detail.html
@@ -0,0 +1,149 @@
+{% load tagging_tags comments i18n %}
+<div id="gbobject-{{ object.pk }}" class="hgbobject{% if object.featured %} featured{% endif %} span-16 last">
+ <div class="gbobject-header span-16 last">
+ <h2 class="gbobject-title">
+ <a href="{{ object.get_absolute_url }}" title="{{ object.title }}" rel="bookmark">
+ {{ object.title }}
+ </a>
+ </h2>
+ <p class="gbobject-info">
+ {% if object.authors.count %}
+ {% trans "Written by" %}
+ {% for author in object.authors.all %}
+ <span class="vcard author">
+ <a href="{% url objectapp_author_detail author %}" class="fn nickname url" rel="author"
+ title="{% blocktrans with author as author %}Show {{ author }} gbobjects{% endblocktrans %}">{{ author }}</a>
+ </span>{% if not forloop.last %}, {% endif %}
+ {% endfor %}
+ {% trans "on" %}
+ {% else %}
+ {% trans "Written on" %}
+ {% endif %}
+ <abbr class="published" title="{{ object.creation_date|date:"c" }}Z">{{ object.creation_date|date:"DATE_FORMAT" }}</abbr>
+ {% if object.objecttypes.count %}
+ {% trans "in" %}
+ {% for Objecttype in object.objecttypes.all %}
+ <a href="{{ Objecttype.get_absolute_url }}" title="{{ Objecttype }}" rel="tag Objecttype">{{ Objecttype }}</a>{% if not forloop.last %}, {% endif %}{% endfor %}{% endif %}.
+ </p>
+
+</div>
+
+</div>
+<p>
+ <b>Name: </b> {{ object.title }} <br/>
+
+ {% if object.get_rendered_nbh.plural %}
+ <b> Plural Name :<nbsp></b>
+ {{object.get_rendered_nbh.plural}} <br/>
+ {% endif %}
+ {% if object.get_rendered_nbh.altnames %}
+ <b> Alternate names :<nbsp></b>
+ {{object.get_rendered_nbh.altnames}} <br/>
+{% endif %}
+
+ {% if object.get_rendered_nbh.member_of %}
+
+
+ <b> Member of :<nbsp></b>
+
+ {% for mkey,mvalue in object.get_rendered_nbh.member_of.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+
+ {% if object.get_rendered_nbh.relations %}
+
+
+ {% for relkey,relvalue in object.get_rendered_nbh.relations.items %}
+ <b>{{relkey}}:<nbsp></b>
+{% for relk, relv in relvalue.items %}
+<a href="{{relv}}">{{relk}}</a>;
+ {% endfor %}<br/>
+{% endfor %}
+{% endif %}
+
+ {% if object.get_rendered_nbh.attributes %}
+ {% for atkey,atvalue in object.get_rendered_nbh.attributes.items %}
+ {% if atvalue %}
+ <b> {{atkey}}:<nbsp></b>
+
+ {% for items in atvalue %}
+ {{items}};<nbsp>
+ {% endfor %}
+ {% endif %}<br/>
+ {% endfor %}
+ {% endif %}
+
+</p>
+
+
+
+
+ <div class="gbobject-body span-16 last">
+ {% if object.image %}
+ <div class="gbobject-image">
+ <p>
+ <a href="{{ object.get_absolute_url }}" rel="bookmark">
+<img src="{{ object.image.url }}" alt="{{ object.title }}" class="left" />
+ </a>
+ </p>
+ </div>
+ {% endif %}
+ <div class="gbobject-content">
+ {{ object_content }}
+ </div>
+ </div>
+
+ <div class="gbobject-footer">
+ <p class="gbobject-tags span-16 last">
+ <strong>{% trans "Tags" %}</strong> :
+ {% tags_for_object object as tag_list %}
+ {% for tag in tag_list %}
+ <a href="{% url objectapp_tag_detail tag %}"
+ title="Tag {{ tag }}" rel="tag">{{ tag }}</a>
+ {% empty %}
+ <span>{% trans "No tags" %}</span>
+ {% endfor %}
+ </p>
+
+ <p class="gbobject-shorturl span-16 last">
+ <strong>{% trans "Short url" %}</strong> :
+ <a href="{{ object.short_url }}" title="{{ object.title }}" rel="shortlink">
+ {{ object.short_url }}
+ </a>
+ </p>
+
+ <p class="gbobject-comments span-16 last">
+ <strong>{% trans "Discussions" %}</strong> :
+ {% with object.comments.count as comment_count %}
+ {% if comment_count %}
+ <a href="{{ object.get_absolute_url }}#comments" title="{{ object.title }}">
+ {% blocktrans count comment_count as comment_count %}{{ comment_count }} comment{% plural %}{{ comment_count }} comments{% endblocktrans %}
+ </a>
+ {% else %}
+ {% if object.comments_are_open %}
+ {% trans "No comments yet." %}
+ <a href="{{ object.get_absolute_url }}#comments" title="{{ object.title }}">
+ {% trans "Be first to comment!" %}
+ </a>
+ {% else %}
+ {% trans "Comments are closed." %}
+ {% endif %}
+ {% endif %}
+ {% endwith %}
+ {% with object.pingbacks.count as pingback_count %}
+ {% if pingback_count %}
+ <a href="{{ object.get_absolute_url }}#pingbacks" title="{{ object.title }}">
+ {% blocktrans count pingback_count as pingback_count %}{{ pingback_count }} pingback{% plural %}{{ pingback_count }} pingbacks{% endblocktrans %}
+ </a>
+ {% endif %}
+ {% endwith %}
+ {% with object.trackbacks.count as trackback_count %}
+ {% if trackback_count %}
+ <a href="{{ object.get_absolute_url }}#trackbacks" title="{{ object.title }}">
+ {% blocktrans count trackback_count as trackback_count %}{{ trackback_count }} trackback{% plural %}{{ trackback_count }} trackbacks{% endblocktrans %}
+ </a>
+ {% endif %}
+ {% endwith %}
+ </p>
+ </div>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_header.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_header.html
new file mode 100644
index 0000000..fa79f9d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_header.html
@@ -0,0 +1,56 @@
+{% load i18n grp_tags %}
+
+<div id="header">
+ <div class="branding">&nbsp;</div>
+ <!-- Title -->
+ <div class="admin-title">{% if grappelli_admin_title %}{{ grappelli_admin_title }}{% else %}{% get_admin_title %}{% endif %}</div>
+ {% if user.is_authenticated and user.is_staff %}
+ <ul id="user-tools">
+ <!-- Username -->
+ <li class="user-options-container collapse closed">
+ <a href="javascript://" class="user-options-handler collapse-handler">{% firstof user.first_name user.username %}</a>
+ <ul class="user-options">
+ <!-- Change Password -->
+ {% url admin:password_change as password_change_url %}
+ {% if password_change_url %}
+ <li><a href="{{ password_change_url }}">
+ {% else %}
+ <li><a href="{{ root_path }}password_change/">
+ {% endif %}
+ {% trans 'Change password' %}</a></li>
+ <!-- Logout -->
+ {% url admin:logout as logout_url %}
+ {% if logout_url %}
+ <li><a href="{{ logout_url }}">
+ {% else %}
+ <li><a href="{{ root_path }}logout/">
+ {% endif %}
+ {% trans 'Log out' %}</a></li>
+ </ul>
+ </li>
+ <!-- Userlinks -->
+ {% block userlinks %}
+ <!-- JS tests -->
+ {% url test-index as testindexurl %}
+ {% if testindexurl %}
+ <li><a href="{{ testindexurl }}">{% trans 'Tests' %}</a></li>
+ {% endif %}
+ <!-- Documentation -->
+ {% url django-admindocs-docroot as docsroot %}
+ {% if docsroot %}
+ <li><a href="{{ docsroot }}">{% trans 'Documentation' %}</a></li>
+ {% endif %}
+ {% endblock %}
+ </ul>
+ {% endif %}
+ {% block nav-global %}
+ {% endblock %}
+</div>
+
+<script type="text/javascript" charset="utf-8">
+ (function($) {
+ $(document).ready(function() {
+ $("div#header .collapse").grp_collapsible();
+ });
+ })(django.jQuery);
+</script>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_narrative_detail.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_narrative_detail.html
new file mode 100644
index 0000000..fc695d7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_narrative_detail.html
@@ -0,0 +1,117 @@
+<p>
+ <b>Name: </b> {{ object.title }} <br/>
+
+ {% if object.get_rendered_nbh.plural %}
+ <b> Plural Name :<nbsp></b>
+ {{object.get_rendered_nbh.plural}} <br/>
+ {% endif %}
+ {% if object.get_rendered_nbh.altnames %}
+ <b> Alternate names :<nbsp></b>
+ {{object.get_rendered_nbh.altnames}} <br/>
+ {% endif %}
+
+ {% if object.get_rendered_nbh.member_of %}
+
+
+ <b> Member of Metatypes :<nbsp></b>
+
+ {% for mkey,mvalue in object.get_rendered_nbh.member_of.items %}
+ <a href="{{mvalue}}">{{mkey}}</a>;
+ {% endfor %}<br/>
+ {% endif %}
+
+ {% if object.get_rendered_nbh.relations %}
+
+
+ {% for relkey,relvalue in object.get_rendered_nbh.relations.items %}
+ <b>{{relkey}}:<nbsp></b>
+ {% for relk, relv in relvalue.items %}
+ <a href="{{relv}}">{{relk}}</a>;
+ {% endfor %}<br/>
+ {% endfor %}
+ {% endif %}
+
+ {% if object.get_rendered_nbh.attributes %}
+
+
+
+ <b>Attributes: <nbsp> </b>
+
+ {% for items in object.get_rendered_nbh.attributes %}
+ {{items}};
+ {% endfor %} <br/>
+ {% endif %}
+
+</p>
+
+
+
+
+ <div class="gbobject-body span-16 last">
+ {% if object.image %}
+ <div class="gbobject-image">
+ <p>
+ <a href="{{ object.get_absolute_url }}" rel="bookmark">
+ <img src="{{ object.image.url }}" alt="{{ object.title }}" class="left" />
+ </a>
+ </p>
+ </div>
+ {% endif %}
+ <div class="gbobject-content">
+ {{ object_content }}
+ </div>
+ </div>
+
+ <div class="gbobject-footer">
+ <p class="gbobject-tags span-16 last">
+ <strong>{% trans "Tags" %}</strong> :
+ {% tags_for_object object as tag_list %}
+ {% for tag in tag_list %}
+ <a href="{% url objectapp_tag_detail tag %}"
+ title="Tag {{ tag }}" rel="tag">{{ tag }}</a>
+ {% empty %}
+ <span>{% trans "No tags" %}</span>
+ {% endfor %}
+ </p>
+
+ <p class="gbobject-shorturl span-16 last">
+ <strong>{% trans "Short url" %}</strong> :
+ <a href="{{ object.short_url }}" title="{{ object.title }}" rel="shortlink">
+ {{ object.short_url }}
+ </a>
+ </p>
+
+ <p class="gbobject-comments span-16 last">
+ <strong>{% trans "Discussions" %}</strong> :
+ {% with object.comments.count as comment_count %}
+ {% if comment_count %}
+ <a href="{{ object.get_absolute_url }}#comments" title="{{ object.title }}">
+ {% blocktrans count comment_count as comment_count %}{{ comment_count }} comment{% plural %}{{ comment_count }} comments{% endblocktrans %}
+ </a>
+ {% else %}
+ {% if object.comments_are_open %}
+ {% trans "No comments yet." %}
+ <a href="{{ object.get_absolute_url }}#comments" title="{{ object.title }}">
+ {% trans "Be first to comment!" %}
+ </a>
+ {% else %}
+ {% trans "Comments are closed." %}
+ {% endif %}
+ {% endif %}
+ {% endwith %}
+ {% with object.pingbacks.count as pingback_count %}
+ {% if pingback_count %}
+ <a href="{{ object.get_absolute_url }}#pingbacks" title="{{ object.title }}">
+ {% blocktrans count pingback_count as pingback_count %}{{ pingback_count }} pingback{% plural %}{{ pingback_count }} pingbacks{% endblocktrans %}
+ </a>
+ {% endif %}
+ {% endwith %}
+ {% with object.trackbacks.count as trackback_count %}
+ {% if trackback_count %}
+ <a href="{{ object.get_absolute_url }}#trackbacks" title="{{ object.title }}">
+ {% blocktrans count trackback_count as trackback_count %}{{ trackback_count }} trackback{% plural %}{{ trackback_count }} trackbacks{% endblocktrans %}
+ </a>
+ {% endif %}
+ {% endwith %}
+ </p>
+ </div>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_subtype_detail.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_subtype_detail.html
new file mode 100644
index 0000000..e77ced8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/_subtype_detail.html
@@ -0,0 +1 @@
+nothing as yet
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/author/gbobject_list.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/author/gbobject_list.html
new file mode 100644
index 0000000..d85e241
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/author/gbobject_list.html
@@ -0,0 +1 @@
+{% extends "objectapp/gbobject_list.html" %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/author_list.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/author_list.html
new file mode 100644
index 0000000..fbb5dcb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/author_list.html
@@ -0,0 +1,27 @@
+{% extends "objectapp/base.html" %}
+{% load i18n %}
+
+{% block meta-description %}{% trans "Author list" %}{% endblock %}
+
+{% block title %}{% trans "Authors" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Author list" %}</h2>
+<div>
+ <ul>
+ {% for object in object_list %}
+ <li class="vcard">
+ <a href="{% url objectapp_author_detail object.username %}"
+ title="{{ object.username }}" class="fn nickname url">
+ {{ object.username }}
+ </a>
+ {% blocktrans count object.gbobjects_published.count as gbobject_count %}{{ gbobject_count }} gbobject{% plural %}{{ gbobject_count }} gbobjects{% endblocktrans %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No authors yet." %}
+ </li>
+ {% endfor %}
+ </ul>
+</div>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/base.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/base.html
new file mode 100644
index 0000000..16aaaf9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/base.html
@@ -0,0 +1,109 @@
+{% extends "objectapp/skeleton.html" %}
+{% load objectapp_tags i18n %}
+
+ {% block meta %}
+ <meta name="generator" content="Objectapp {{ OBJECTAPP_VERSION }}" />
+{% endblock %}
+
+{% block link %}
+ <link rel="index" href="{% url objectapp_gbobject_archive_index %}" />
+ <link rel="EditURI" type="application/rsd+xml" href="{% url objectapp_rsd %}" />
+ <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="{% url objectapp_wlwmanifest %}" />
+ <link rel="search" type="application/opensearchdescription+xml" title="Objectapp's Blog" href="{% url objectapp_opensearch %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of latest gbobjects" %}" href="{% url objectapp_gbobject_latest_feed %}" />
+ {% get_archives_gbobjects "objectapp/tags/archives_gbobjects_link.html" %}
+{% endblock %}
+
+{% block breadcrumbs %}
+ {% objectapp_breadcrumbs %}
+{% endblock %}
+
+{% block sidebar %}
+ <img src="{{ STATIC_URL }}objectapp/img/rss.png" alt="?" width="20" height="" />
+ <a href="{% url objectapp_gbobject_latest_feed %}" class="feeds"><h4>Rssfeed</h4></a>
+
+<div class="search">
+ <h3>{% trans "Search" %}</h3>
+ <form method="get" id="searchform" action="{% url objectapp_gbobject_search %}">
+ <p>
+ <input type="text" value="{% trans "Keywords..." %}" name="pattern" id="searchbox" onfocus="this.value=''" />
+ <input type="submit" class="submitbutton" value="OK" />
+ <a title="{% trans 'You can use - to exclude words or phrases, &quot;double quotes&quot; for exact phrases and the AND/OR boolean operators combined with parenthesis for complex searchs.' %}">
+ <img src="{{ STATIC_URL }}objectapp/img/help.png" alt="?" width="14" height="14" />
+ </a>
+ </p>
+ </form>
+</div>
+<!--
+<div class="objecttypes">
+ <h3>{% trans "Objecttypes" %}</h3>
+ {% get_objecttypes %}
+</div>
+-->
+<div class="authors">
+ <h3>{% trans "Authors" %}</h3>
+ {% get_authors %}
+</div>
+<div class="calendar">
+ <h3>{% trans "Calendar" %}</h3>
+ {% get_calendar_gbobjects %}
+</div>
+<div class="tags">
+ <h3>{% trans "Tags" %}</h3>
+ {% get_tag_cloud %}
+</div>
+<div class="recents">
+ <h3>{% trans "Recent gbobjects" %}</h3>
+ {% get_recent_gbobjects 5 %}
+</div>
+<div class="comments">
+ <h3>{% trans "Recent comments" %}</h3>
+ {% get_recent_comments 5 %}
+</div>
+<div class="linkbacks">
+ <h3>{% trans "Recent linkbacks" %}</h3>
+ {% get_recent_linkbacks 5 %}
+</div>
+<div class="randoms">
+ <h3>{% trans "Random gbobjects" %}</h3>
+ {% get_random_gbobjects 5 %}
+</div>
+<div class="populars">
+ <h3>{% trans "Popular gbobjects" %}</h3>
+ {% get_popular_gbobjects 5 %}
+</div>
+<div class="archives">
+ <h3>{% trans "Archives" %}</h3>
+ {% get_archives_gbobjects_tree %}
+</div>
+{% if user.is_authenticated %}
+<div class="tools">
+ <h3>{% trans "Tools" %}</h3>
+ <ul>
+ {% if perms.objectapp %}
+ <li>
+ <a href="{% url admin:app_list "objectapp" %}" title="{% trans "Dashboard" %}">
+ {% trans "Dashboard" %}
+ </a>
+ </li>
+ {% endif %}
+ {% if perms.objectapp.add_gbobject %}
+ <li>
+ <a href="{% url admin:objectapp_gbobject_add %}" title="{% trans "Post an gbobject" %}">
+ {% trans "Post a gbobject" %}
+ </a>
+ </li>
+ {% endif %}
+ {% block admin_tools %}
+ {% endblock %}
+ <li>
+ <a href="{% url admin:logout %}" title="{% trans "Log out" %}">
+ {% trans "Log out" %}
+ </a>
+ </li>
+ </ul>
+</div>
+{% endif %}
+{% endblock %}
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/gbobject_detail.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/gbobject_detail.html
new file mode 100644
index 0000000..a93d0f0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/gbobject_detail.html
@@ -0,0 +1,8 @@
+{% load i18n %}
+{% for gbobject in gbobjects %}
+ {% with object=gbobject object_content=gbobject.html_content|truncatewords_html:100|safe %}
+ {% include "objectapp/_gbobject_detail.html" %}
+ {% endwith %}
+{% empty %}
+ <p class="notice">{% trans "No gbobjects yet." %}</p>
+{% endfor %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/gbobject_list.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/gbobject_list.html
new file mode 100644
index 0000000..9e9c924
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/gbobject_list.html
@@ -0,0 +1,12 @@
+{% load i18n %}
+<ul>
+ {% for gbobject in gbobjects %}
+ <li>
+ <a href="{{ gbobject.get_absolute_url }}" title="{{ gbobject.title }}" rel="bookmark">{{ gbobject.title }}</a>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No gbobjects yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/random_gbobjects.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/random_gbobjects.html
new file mode 100644
index 0000000..e215e06
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/cms/random_gbobjects.html
@@ -0,0 +1,4 @@
+{% load objectapp_tags %}
+
+{% get_random_gbobjects number_of_gbobjects template_to_render %}
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive.html
new file mode 100644
index 0000000..26f06a9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive.html
@@ -0,0 +1,30 @@
+{% extends "objectapp/gbobject_list.html" %}
+{% load i18n objectapp_tags %}
+
+{% block meta-description %}{% trans "Latest gbobjects" %}{% endblock %}
+
+{% block link %}
+ {{ block.super }}
+ <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}objectapp/css/slider.css" />
+{% endblock %}
+
+{% block script %}
+ {{ block.super }}
+ <script type="text/javascript" src="{{ STATIC_URL }}objectapp/js/jquery.js"></script>
+ <script type="text/javascript" src="{{ STATIC_URL }}objectapp/js/jquery.ui.js"></script>
+ <script type="text/javascript">
+ $(document).ready(function(){
+ $("#slider").tabs({ fx:{ opacity: "toggle"}}).tabs("rotate", 5000, true);
+ $("#slider").hover(
+ function() { $("#slider").tabs("rotate", 0, true); },
+ function() { $("#slider").tabs("rotate", 5000, true); });
+ });
+ </script>
+{% endblock %}
+
+{% block title %}{% trans "Latest gbobjects" %}{% endblock %}
+
+{% block content %}
+{% get_featured_gbobjects 5 "objectapp/tags/slider_gbobjects.html" %}
+{{ block.super }}
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_day.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_day.html
new file mode 100644
index 0000000..99e140c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_day.html
@@ -0,0 +1,23 @@
+{% extends "objectapp/gbobject_list.html" %}
+{% load i18n %}
+
+{% block meta-description %}{% trans "Archives" %} {{ day|date:"DATE_FORMAT" }}{% endblock %}
+
+{% block title %}{% trans "Archives" %} {{ day|date:"DATE_FORMAT" }}{% endblock %}
+
+{% block content %}
+<h1>{% trans "Archives" %} {{ day|date:"DATE_FORMAT" }}</h1>
+
+{{ block.super }}
+
+<!--<ul>
+ <li>
+ <a href="{% url objectapp_gbobject_archive_day previous_day|date:"Y" previous_day|date:"m" previous_day|date:"d" %}" rel="archives">{{ previous_day|date:"DATE_FORMAT" }}</a>
+ </li>
+ {% if next_day %}
+ <li>
+ <a href="{% url objectapp_gbobject_archive_day next_day|date:"Y" next_day|date:"m" next_day|date:"d" %}" rel="archives">{{ next_day|date:"DATE_FORMAT" }}</a>
+ </li>
+ {% endif %}
+</ul>-->
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_month.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_month.html
new file mode 100644
index 0000000..2caa7c7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_month.html
@@ -0,0 +1,31 @@
+{% extends "objectapp/gbobject_list.html" %}
+{% load i18n %}
+
+{% block meta-description %}{% trans "Archives" %} {{ month|date:"YEAR_MONTH_FORMAT" }}{% endblock %}
+
+{% block title %}{% trans "Archives" %} {{ month|date:"YEAR_MONTH_FORMAT" }}{% endblock %}
+
+{% block content %}
+<h1>{% trans "Archives" %} {{ month|date:"YEAR_MONTH_FORMAT" }}</h1>
+
+{{ block.super }}
+
+<h2>{% trans "Daily archives" %}</h2>
+<ul>
+ {% for date in date_list %}
+ <li>
+ <a href="{% url objectapp_gbobject_archive_day date|date:"Y" date|date:"m" date|date:"d" %}" rel="archives">{{ date|date:"DATE_FORMAT" }}</a>
+ </li>
+ {% endfor %}
+</ul>
+<!--<ul>
+ <li>
+ <a href="{% url objectapp_gbobject_archive_month previous_month|date:"Y" previous_month|date:"m" %}" rel="archives">{{ previous_month|date:"YEAR_MONTH_FORMAT" }}</a>
+ </li>
+ {% if next_month %}
+ <li>
+ <a href="{% url objectapp_gbobject_archive_month next_month|date:"Y" next_month|date:"m" %}" rel="archives">{{ next_month|date:"YEAR_MONTH_FORMAT" }}</a>
+ </li>
+ {% endif %}
+</ul>-->
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_year.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_year.html
new file mode 100644
index 0000000..eeca042
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_archive_year.html
@@ -0,0 +1,21 @@
+{% extends "objectapp/gbobject_list.html" %}
+{% load i18n %}
+
+{% block meta-description %}{% trans "Archives" %} {{ year }}{% endblock %}
+
+{% block title %}{% trans "Archives" %} {{ year }}{% endblock %}
+
+{% block content %}
+<h1>{% trans "Archives" %} {{ year }}</h1>
+
+{{ block.super }}
+
+<h2>{% trans "Monthly archives" %}</h2>
+<ul>
+ {% for date in date_list %}
+ <li>
+ <a href="{% url objectapp_gbobject_archive_month year date|date:"m" %}" rel="archives">{{ date|date:"YEAR_MONTH_FORMAT" }}</a>
+ </li>
+ {% endfor %}
+</ul>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_detail.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_detail.html
new file mode 100644
index 0000000..120fbc9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_detail.html
@@ -0,0 +1,242 @@
+{% extends "objectapp/base.html" %}
+{% load i18n comments objectapp_tags %}
+
+{% block title %}{{ object.title }}{% endblock %}
+
+{% block meta-description %}{% if object.excerpt %}{{ object.excerpt|striptags }}{% else %}{{ object.content|striptags|truncatewords:100 }}{% endif %}{% endblock %}
+
+{% block meta-keywords %}{% if object.tags %}{{ object.tags }}{% else %}{{ block.super }}{% endif %}{% endblock %}
+
+{% block link %}
+ {{ block.super }}
+ {% with object.previous_gbobject as previous_gbobject %}{% if previous_gbobject %}
+ <link rel="prev" title="{{ previous_gbobject.title }}" href="{{ previous_gbobject.get_absolute_url }}" />
+ {% endif %}{% endwith %}
+ {% with object.next_gbobject as next_gbobject %}{% if next_gbobject %}
+ <link rel="next" title="{{ next_gbobject.title }}" href="{{ next_gbobject.get_absolute_url }}" />
+ {% endif %}{% endwith %}
+ <link rel="shortlink" href="{{ object.short_url }}" />
+ <link rel="canonical" href="{{ object.get_absolute_url }}" />
+ {% with year=object.creation_date|date:"Y" month=object.creation_date|date:"m" day=object.creation_date|date:"d" %}
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of discussions on" %} '{{ object.title }}'"
+ href="{% url objectapp_gbobject_discussion_feed year month day object.slug %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of comments on" %} '{{ object.title }}'"
+ href="{% url objectapp_gbobject_comment_feed year month day object.slug %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of pingbacks on" %} '{{ object.title }}'"
+ href="{% url objectapp_gbobject_pingback_feed year month day object.slug %}" />
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of trackbacks on" %} '{{ object.title }}'"
+ href="{% url objectapp_gbobject_trackback_feed year month day object.slug %}" />
+ {% endwith %}
+{% endblock %}
+
+
+
+
+{% block content %}
+{% block gbobject-content %}
+
+ {% with object.html_content|safe as object_content %}
+ {% include "objectapp/_gbobject_detail.html" %}
+ {% endwith %}
+{% endblock %}
+
+
+
+{% block gbobject-widgets %}
+<div class="gbobject-widgets span-16 last">
+ {% with object.next_gbobject as next_gbobject %}
+ {% if next_gbobject %}
+
+ <div class="gbobject-next">
+ <h3>{% trans "Next object" %}</h3>
+ <ul>
+ <li>
+<a href="{{ next_gbobject.get_absolute_url }}" title="{{ next_gbobject.title }}" rel="next">
+{{ next_gbobject.title }}
+
+</a>
+ </li>
+ </ul>
+ </div>
+ {% endif %}
+ {% endwith %}
+
+
+
+ {% with object.previous_gbobject as previous_gbobject %}
+ {% if previous_gbobject %}
+ <div class="gbobject-previous">
+ <h3>{% trans "Previous object" %}</h3>
+ <ul>
+ <li>
+<a href="{{ previous_gbobject.get_absolute_url }}" title="{{ previous_gbobject.title }}" rel="prev">
+{{ previous_gbobject.title }}
+</a>
+ </li>
+ </ul>
+ </div>
+ {% endif %}
+ {% endwith %}
+ {% if object.related_published %}
+ <div class="gbobject-related">
+ <h3>{% trans "Related objects" %}</h3>
+ <ul>
+ {% for gbobject in object.related_published %}
+ <li>
+<a href="{{ gbobject.get_absolute_url }}" title="{{ gbobject.title }}" rel="bookmark">{{ gbobject.title }}</a>
+ </li>
+ {% endfor %}
+ </ul>
+ </div>
+ {% endif %}
+ <div class="gbobject-similar">
+ <h3>{% trans "Similar objects" %}</h3>
+ {% get_similar_gbobjects 5 %}
+ </div>
+</div>
+{% endblock %}
+
+
+
+
+
+
+{% block gbobject-comments %}
+<div id="comments" class="span-16 last">
+ <h3>{% trans "Comments" %}</h3>
+ {% with object.comments as comment_list %}
+ {% if comment_list.count %}
+ <ol id="comment-list" class="span-15 last">
+ {% for comment in comment_list %}
+ <li id="comment_{{ comment.pk }}" class="comment vcard {% cycle box1,box2 %}{% if comment.user in object.authors.all %} post-author{% endif %} span-15 last">
+ <div class="span-2">
+<img src="{% get_gravatar comment.email 60 "G" %}" class="gravatar photo" alt="{{ comment.user_name }}"/>
+ </div>
+ <div class="comment-body span-13 last">
+<div class="comment-author span-13 last">
+{% if comment.url %}
+<a href="{{ comment.url }}" class="fn url">{{ comment.user_name }}</a>
+{% else %}
+{{ comment.user_name }}
+{% endif %}
+{% trans "on" %} {{ comment.submit_date|date:"SHORT_DATETIME_FORMAT" }}
+</div>
+<div class="span-13 last">
+{{ comment.comment|linebreaks }}
+</div>
+ </div>
+ </li>
+ {% endfor %}
+ </ol>
+ {% if not object.comments_are_open %}
+ <p>{% trans "Comments are closed." %}</p>
+ {% endif %}
+ {% else %}
+ {% if object.comments_are_open %}
+ <p>{% trans "No comments yet." %}</p>
+ {% else %}
+ <p>{% trans "Comments are closed." %}</p>
+ {% endif %}
+ {% endif %}
+ {% endwith %}
+</div>
+{% endblock %}
+
+
+
+
+{% block gbobject-pingbacks %}
+<div id="pingbacks" class="span-16 last">
+ <h3>{% trans "Pingbacks" %}</h3>
+ {% with object.pingbacks as pingback_list %}
+ {% if pingback_list.count %}
+ <ol id="pingback-list" class="span-15 last">
+ {% for pingback in pingback_list %}
+ <li id="pingback_{{ pingback.pk }}" class="pingback {% cycle box1,box2 %} span-15 last">
+ <div class="pingback-body span-15 last">
+<div class="pingback-author span-15 last">
+<a href="{{ pingback.url }}">{{ pingback.user_name }}</a>
+{% trans "on" %} {{ pingback.submit_date|date:"SHORT_DATETIME_FORMAT" }}
+</div>
+<div class="span-15 last">
+<cite>
+{{ pingback.comment }}
+</cite>
+</div>
+ </div>
+ </li>
+ {% endfor %}
+ </ol>
+ {% endif %}
+ {% if object.pingback_enabled %}
+ <p>{% trans "Pingbacks are open." %}</p>
+ {% else %}
+ <p>{% trans "Pingbacks are closed." %}</p>
+ {% endif %}
+ {% endwith %}
+</div>
+{% endblock %}
+
+
+{% block gbobject-trackbacks %}
+{% with object.trackbacks as trackback_list %}
+{% if trackback_list.count or object.pingback_enabled %}
+<div id="trackbacks" class="span-16 last">
+ <h3>{% trans "Trackbacks" %}</h3>
+ {% if trackback_list.count %}
+ <ol id="trackback-list" class="span-15 last">
+ {% for trackback in trackback_list %}
+ <li id="trackback_{{ trackback.pk }}" class="trackback {% cycle box1,box2 %} span-15 last">
+ <div class="trackback-body span-15 last">
+<div class="trackback-author span-15 last">
+<a href="{{ trackback.url }}">{{ trackback.user_name }}</a>
+{% trans "on" %} {{ trackback.submit_date|date:"SHORT_DATETIME_FORMAT" }}
+</div>
+<div class="span-15 last">
+<cite>
+{{ trackback.comment }}
+</cite>
+</div>
+ </div>
+ </li>
+ {% endfor %}
+ </ol>
+ {% endif %}
+ {% if object.pingback_enabled %}
+ <p>
+ <a href="{% url objectapp_gbobject_trackback object.pk %}" rel="trackback">
+ {% trans "Trackback URL" %}</a>
+ </p>
+ {% endif %}
+</div>
+{% endif %}
+{% endwith %}
+{% endblock %}
+
+
+
+{% block gbobject-comments-form %}
+{% if object.comments_are_open %}
+<div class="commentForm span-16 last">
+ {% render_comment_form for object %}
+</div>
+{% endif %}
+{% endblock %}
+
+{% endblock %}
+
+
+{% block admin_tools %}
+{% if perms.objectapp.change_gbobject %}
+<li>
+ <a href="{% url admin:objectapp_gbobject_change object.pk %}" title="{% trans "Edit the object" %}">
+ {% trans "Edit the object" %}
+ </a>
+</li>
+{% endif %}
+{% endblock %}
+
+
+
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_list.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_list.html
new file mode 100644
index 0000000..73a3adf
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_list.html
@@ -0,0 +1,73 @@
+{% extends "objectapp/base.html" %}
+{% load i18n objectapp_tags %}
+
+{% block meta-description %}{% trans "Latest gbobjects for" %} {% if Objecttype %}{% trans "the Objecttype" %} {{ Objecttype }}{% if Objecttype.description %}: {{ Objecttype.description|striptags|safe }}{% endif %}{% endif %}{% if tag %}{% trans "the tag" %} {{ tag }}{% endif %}{% if author %}{% trans "the author" %} {{ author }}{% endif %}{% if page_obj %}{% ifnotequal page_obj.number 1 %} {% trans "page" %} {{ page_obj.number }}{% endifnotequal %}{% endif %}{% endblock %}
+
+{% block link %}
+ {{ block.super }}
+ {% if Objecttype %}
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed" %} {{ Objecttype.title }}" href="{% url objectapp_Objecttype_feed Objecttype.tree_path %}" />
+ {% endif %}
+ {% if tag %}
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed" %} {{ tag.name }}" href="{% url objectapp_tag_feed tag.name %}" />
+ {% endif %}
+ {% if author %}
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed" %} {{ author.username }}" href="{% url objectapp_author_feed author.username %}" />
+ {% endif %}
+{% endblock %}
+
+{% block title %}{% trans "Latest gbobjects" %} {% if Objecttype %}| {% trans "Objecttype" %} {{ Objecttype }}{% endif %}{% if tag %}| {% trans "Tag" %} {{ tag }}{% endif %}{% if author %}| {% trans "Author" %} {{ author }}{% endif %}{% if page_obj %}{% ifnotequal page_obj.number 1 %} | {% trans "Page" %} {{ page_obj.number }}{% endifnotequal %}{% endif %}{% endblock %}
+
+{% block content %}
+{% if Objecttype %}
+<h1>{{ Objecttype.title }}</h1>
+{% if Objecttype.description %}
+<p>{{ Objecttype.description|striptags|safe }}</p>
+{% endif %}
+{% endif %}
+
+{% if tag %}
+<h1>{% trans "Tag" %} : {{ tag }}</h1>
+{% endif %}
+
+{% if author %}
+<h1>{% blocktrans with author.username as author %}Gbobjects by {{ author }}{% endblocktrans %}</h1>
+{% endif %}
+
+{% for object in object_list %}
+ {% with object.html_content|truncatewords_html:100|safe as object_content %}
+ {% include "objectapp/_gbobject_detail.html" %}
+ {% endwith %}
+{% empty %}
+ <p class="notice">{% trans "No gbobjects yet." %}</p>
+{% endfor %}
+
+{% if is_paginated %}
+ {% objectapp_pagination page_obj %}
+{% endif %}
+{% endblock %}
+
+{% block admin_tools %}
+ {% if Objecttype and perms.objectapp.change_Objecttype %}
+ <li>
+ <a href="{% url admin:objectapp_Objecttype_change Objecttype.pk %}" title="{% trans "Edit the Objecttype" %}">
+ {% trans "Edit the Objecttype" %}
+ </a>
+ </li>
+ {% endif %}
+ {% if tag and perms.tagging.change_tag %}
+ <li>
+ <a href="{% url admin:tagging_tag_change tag.pk %}" title="{% trans "Edit the tag" %}">
+ {% trans "Edit the tag" %}
+ </a>
+ </li>
+ {% endif %}
+ {% if author and perms.auth.change_user %}
+ <li>
+ <a href="{% url admin:auth_user_change author.pk %}" title="{% trans "Edit the author" %}">
+ {% trans "Edit the author" %}
+ </a>
+ </li>
+ {% endif %}
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_search.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_search.html
new file mode 100644
index 0000000..c65e174
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_search.html
@@ -0,0 +1,49 @@
+{% extends "objectapp/gbobject_list.html" %}
+{% load i18n objectapp_tags %}
+
+{% block title %}{% trans "Search results for" %} {% if pattern %}'{{ pattern }}'{% endif %}{% if page_obj %}{% ifnotequal page_obj.number 1 %} | {% trans "Page" %} {{ page_obj.number }}{% endifnotequal %}{% endif %}{% endblock %}
+
+{% block meta-description %}{% trans "Search results for" %} {% if pattern %}'{{ pattern }}'{% endif %}{% if page_obj %}{% ifnotequal page_obj.number 1 %} {% trans "page" %} {{ page_obj.number }}{% endifnotequal %}{% endif %}{% endblock %}
+
+{% block link %}
+ {{ block.super }}
+ <link rel="alternate" type="application/rss+xml" title="{% trans "RSS Feed of search result of" %} '{{ pattern }}'" href="{% url objectapp_gbobject_search_feed %}?pattern={{ pattern }}" />
+{% endblock %}
+
+{% block content %}
+<h1>{% trans "Search results for" %} {% if pattern %}'{{ pattern }}'{% endif %}</h1>
+
+{% if error %}
+<p class="error">{{ error }}</p>
+{% endif %}
+
+{% if object_list %}
+<p class="success">
+ {% blocktrans count paginator.count as gbobject_count %}{{ gbobject_count }} gbobject found{% plural %}{{ gbobject_count }} gbobjects found{% endblocktrans %}
+</p>
+{% endif %}
+
+{% for object in object_list %}
+ {% with object.html_content|truncatewords_html:100|safe as object_content %}
+ {% include "objectapp/_gbobject_detail.html" %}
+ {% endwith %}
+{% empty %}
+<p class="notice">{% trans "Nothing found." %}</p>
+{% endfor %}
+
+<div class="search">
+ <form method="get" id="main_searchform" action="{% url objectapp_gbobject_search %}">
+ <p>
+ <input type="text" value="{{ pattern }}" name="pattern" id="main_searchbox" />
+ <input type="submit" id="button" value="OK" />
+ <a title="{% trans 'You can use - to exclude words or phrases, &quot;double quotes&quot; for exact phrases and the AND/OR boolean operators combined with parenthesis for complex searchs.' %}">
+ <img src="{{ STATIC_URL }}objectapp/img/help.png" alt="?" width="14" height="14" />
+ </a>
+ </p>
+ </form>
+</div>
+
+{% if is_paginated %}
+ {% objectapp_pagination page_obj %}
+{% endif %}
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_trackback.xml b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_trackback.xml
new file mode 100644
index 0000000..66dbbb7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/gbobject_trackback.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<response>
+ {% if not error %}
+ <error>0</error>
+ {% else %}
+ <error>1</error>
+ <message>{{ error }}</message>
+ {% endif %}
+</response>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/login.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/login.html
new file mode 100644
index 0000000..496e0ca
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/login.html
@@ -0,0 +1,40 @@
+{% extends "objectapp/base.html" %}
+{% load i18n %}
+
+{% block title %}{% trans "Login required" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Login required" %}</h2>
+
+<div class="gbobject_login">
+ {% if form.errors %}
+ <p class="error">
+ {% trans "Your username and password didn't match. Please try again." %}
+ </p>
+ {% endif %}
+ <p>
+ {% trans "You need to be connected to view this gbobject." %}
+ </p>
+
+ <form method="post" action=".">
+ {% csrf_token %}
+ <table>
+ <tr>
+ <td>{{ form.username.label_tag }}</td>
+ <td>{{ form.username }}</td>
+ </tr>
+ <tr>
+ <td>{{ form.password.label_tag }}</td>
+ <td>{{ form.password }}</td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input type="hidden" name="next" value="." />
+ <input type="submit" value="{% trans "Login" %}" />
+ </td>
+ </tr>
+ </table>
+ </form>
+</div>
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/objecttype/gbobject_list.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/objecttype/gbobject_list.html
new file mode 100644
index 0000000..d85e241
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/objecttype/gbobject_list.html
@@ -0,0 +1 @@
+{% extends "objectapp/gbobject_list.html" %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/objecttype_list.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/objecttype_list.html
new file mode 100644
index 0000000..c530641
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/objecttype_list.html
@@ -0,0 +1,25 @@
+{% extends "objectapp/base.html" %}
+{% load i18n mptt_tags %}
+
+{% block meta-description %}{% trans "Objecttype list" %}{% endblock %}
+
+{% block title %}{% trans "Objecttypes" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Objecttype list" %}</h2>
+<div>
+ {% for object, structure in object_list|tree_info %}
+ {% if structure.new_level %}<ul><li>{% else %}</li><li>{% endif %}
+ <a href="{{ object.get_absolute_url }}" title="{{ object }}">{{ object }}</a>
+ {% blocktrans count object.gbobjects_published.count as gbobject_count %}{{ gbobject_count }} gbobject{% plural %}{{ gbobject_count }} gbobjects{% endblocktrans %}
+ {% if object.description %}<br />{{ object.description|striptags|safe }}{% endif %}
+ {% for level in structure.closed_levels %}</li></ul>{% endfor %}
+ {% empty %}
+ <ul>
+ <li>
+ {% trans "No objecttypes yet." %}
+ </li>
+ </ul>
+ {% endfor %}
+</div>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/opensearch.xml b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/opensearch.xml
new file mode 100644
index 0000000..c951ffa
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/opensearch.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+{% load objectapp_tags %}
+{% get_tags as gbobject_tags %}
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"
+ xmlns:moz="http://www.mozilla.org/2006/browser/search/">
+ <ShortName>{{ site.name }}</ShortName>
+ <LongName>{{ site.name }} - web search</LongName>
+ <Description>Make a search on {{ site.name }}.</Description>
+ <Attribution>{{ copyright }}</Attribution>
+ <Tags>{{ gbobject_tags|slice:":15"|join:" " }}</Tags>
+ <Url type="text/html" template="{{ protocol }}://{{ site.domain }}{% url objectapp_gbobject_search %}?pattern={searchTerms}" />
+ <Url type="application/{{ feeds_format }}+xml" template="{{ protocol }}://{{ site.domain }}{% url objectapp_gbobject_search_feed %}?pattern={searchTerms}" />
+ <Url type="application/opensearchdescription+xml" rel="self" template="{{ protocol }}://{{ site.domain }}{% url objectapp_opensearch %}"/>
+ <Image height="16" width="16" type="image/vnd.microsoft.icon">{{ STATIC_URL }}objectapp/img/favicon.ico</Image>
+ <Query role="example" searchTerms="{{ gbobject_tags.0 }}" />
+ <Developer>Fantomas42</Developer>
+ <Contact>fantomas42@gmail.com</Contact>
+ <SyndicationRight>open</SyndicationRight>
+ <AdultContent>false</AdultContent>
+ <Language>{{ LANGUAGE_CODE }}</Language>
+ <OutputEncoding>UTF-8</OutputEncoding>
+ <InputEncoding>UTF-8</InputEncoding>
+ <moz:SearchForm>{{ protocol }}://{{ site.domain }}/</moz:SearchForm>
+</OpenSearchDescription>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/password.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/password.html
new file mode 100644
index 0000000..6eefc5c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/password.html
@@ -0,0 +1,35 @@
+{% extends "objectapp/base.html" %}
+{% load i18n %}
+
+{% block title %}{% trans "Password required" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Password required" %}</h2>
+
+<div class="gbobject_password">
+ {% if error %}
+ <p class="error">
+ {% trans "The password provided is not valid. Please try again." %}
+ </p>
+ {% endif %}
+ <p>
+ {% trans "You need to provide a password to view this gbobject." %}
+ </p>
+
+ <form method="post" action=".">
+ {% csrf_token %}
+ <table>
+ <tr>
+ <td><label for="id_password">{% trans "Password" %}</label></td>
+ <td><input name="password" id="id_password" type="password" /></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input type="submit" value="{% trans "Valid" %}" />
+ </td>
+ </tr>
+ </table>
+ </form>
+</div>
+{% endblock %}
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/rsd.xml b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/rsd.xml
new file mode 100644
index 0000000..1277462
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/rsd.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" ?>
+<rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd">
+ <service>
+ <engineName>Django Blog Objectapp {{ OBJECTAPP_VERSION }}</engineName>
+ <engineLink>http://github.com/Fantomas42/django-blog-objectapp</engineLink>
+ <homePageLink>{{ protocol }}://{{ site.domain }}/</homePageLink>
+ <apis>
+ <api name="MetaWeblog" preferred="true" apiLink="{{ protocol }}://{{ site.domain }}/xmlrpc/" blogID="{{ site.id }}">
+ <settings>
+ <docs>http://www.xmlrpc.com/metaWeblogApi</docs>
+ <notes>MetaWeblog API support + Blogger API partial support</notes>
+ </settings>
+ </api>
+ </apis>
+ </service>
+</rsd>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/sitemap.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/sitemap.html
new file mode 100644
index 0000000..32c9e03
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/sitemap.html
@@ -0,0 +1,70 @@
+{% extends "objectapp/base.html" %}
+{% load i18n objectapp_tags mptt_tags %}
+
+{% block title %}{% trans "Sitemap" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Sitemap" %}</h2>
+
+<div class="gbobjectsbyobjecttypes">
+ <h3>{% trans "Gbobjects per objecttypes" %}</h3>
+ {% for Objecttype in objecttypes %}
+ <h4>{{ Objecttype }}</h4>
+ <ul>
+ {% for gbobject in Objecttype.gbobjects_published.all %}
+ <li>
+ <a href="{{ gbobject.get_absolute_url }}" title="{{ gbobject.title }}" rel="bookmark">{{ gbobject.title }}</a>
+ {% with gbobject.comments.count as comment_count %}
+ - {{ comment_count }} {% trans "comment" %}{{ comment_count|pluralize }}
+ {% endwith %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No gbobjects yet." %}
+ </li>
+ {% endfor %}
+ </ul>
+ {% endfor %}
+</div>
+
+<div class="allgbobjects">
+ <h3>{% trans "All the gbobjects" %}</h3>
+ <ul>
+ {% for gbobject in gbobjects %}
+ <li>
+ <a href="{{ gbobject.get_absolute_url }}" title="{{ gbobject.title }}" rel="bookmark">{{ gbobject.title }}</a>
+ - {{ gbobject.creation_date|date:"SHORT_DATE_FORMAT" }}
+ {% with gbobject.comments.count as comment_count %}
+ - {{ comment_count }} {% trans "comment" %}{{ comment_count|pluralize }}
+ {% endwith %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No gbobjects yet." %}
+ </li>
+ {% endfor %}
+ </ul>
+</div>
+
+<div class="objecttypes">
+ <h3>{% trans "Objecttypes" %}</h3>
+ {% for Objecttype, structure in objecttypes|tree_info %}
+ {% if structure.new_level %}<ul><li>{% else %}</li><li>{% endif %}
+ <a href="{{ Objecttype.get_absolute_url }}" title="{{ Objecttype.title }}">{{ Objecttype.title }}</a>
+ -
+ {% blocktrans count Objecttype.gbobjects_published.count as gbobject_count %}{{ gbobject_count }} gbobject{% plural %}{{ gbobject_count }} gbobjects{% endblocktrans %}
+ {% for level in structure.closed_levels %}</li></ul>{% endfor %}
+ {% empty %}
+ <ul>
+ <li>
+ {% trans "No objecttypes yet." %}
+ </li>
+ </ul>
+ {% endfor %}
+</div>
+
+<div class="montharchives">
+ <h3>{% trans "Monthly archives" %}</h3>
+ {% get_archives_gbobjects %}
+</div>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/skeleton.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/skeleton.html
new file mode 100644
index 0000000..ff24c85
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/skeleton.html
@@ -0,0 +1,516 @@
+{% load gstudio_tags i18n %}
+{% load adminmedia grp_tags %}
+{% get_tags as objecttype_tags %}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xml:lang="{{ LANGUAGE_CODE }}" lang="{{ LANGUAGE_CODE }}" version="-//W3C//DTD XHTML 1.1//EN" xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+
+ <style type="text/css">
+ .link {
+ stroke: #ccc;
+ }
+ .nodetext {
+ #pointer-events: none;
+ font: 10px Serif;
+ font-style:italic;
+ }
+ .mainnode{
+
+ font: 15px sans-serif;
+ fill:"red";
+ border-width: 1px;
+ font-weight:bold;
+ border-color: gray;
+
+ }
+ .relnode {
+ font: 10px sans-serif;
+ font-weight:bold;
+ fill:#000;
+ }
+
+
+ .node {
+ border-width: 1px;
+ border-color: gray;
+ fill:"green";
+ font: 10px sans-serif;
+ }
+ body {
+ background-color: white;
+ }
+ #chart {
+ height: 90%;
+ margin: 0 auto;
+ width: 90%;
+ display: block;
+ }
+ svg {
+ margin-left: 10%;
+ margin-right: 10%;
+ display: block;
+ position: absolute;
+ }
+
+ </style>
+ <!-- the header lines from grappelli -->
+ {% block blockbots %}
+ <meta name="robots" content="NONE,NOARCHIVE" />
+ {% endblock %}
+ <!-- STYLESHEETS -->
+ {% block stylesheets %}
+ <link href="{% admin_media_prefix %}css/base.css" rel="stylesheet" type="text/css" />
+ {% if LANGUAGE_BIDI %}<link href="{% block stylesheet_rtl %}{% admin_media_prefix %}css/rtl.css{% endblock %}" rel="stylesheet" type="text/css" />{% endif %}
+ <link href="{% admin_media_prefix %}jquery/ui/css/custom-theme/jquery-ui-1.8.custom.css" rel="stylesheet" type="text/css" media="screen" title="no title" charset="utf-8" />
+ <link href="{% admin_media_prefix %}css/jquery-ui-grappelli-extensions.css" rel="stylesheet" type="text/css" />
+ {% endblock %}
+ <!-- EXTRASTYLES -->
+ {% block extrastyle %}{% endblock %}
+ <!-- JAVASCRIPTS -->
+ {% block javascripts %}
+ <script type="text/javascript">
+ // GLOBALS
+ var grappelli = {},
+ // TODO: klemens: drop ADMIN_URL
+ ADMIN_URL = "{% url admin:index %}",
+ MODEL_URL_ARRAY = {% get_content_types %},
+ DATE_FORMAT = "{% get_date_format %}",
+ TIME_FORMAT = "{% get_time_format %}",
+ DATETIME_FORMAT = "{% get_datetime_format %}";
+ </script>
+ <!-- jQuery, jQuery-UI -->
+ <script src="{% admin_media_prefix %}jquery/jquery-1.6.2.min.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}jquery/ui/js/jquery-ui-1.8.15.custom.min.js" type="text/javascript"></script>
+ <!-- Grappelli Main JS -->
+ <script src="{% admin_media_prefix %}js/grappelli/grappelli.js" type="text/javascript"></script>
+ <!-- Grappelli jQuery Plugins, Widgets -->
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_collapsible.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_collapsible_group.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_timepicker.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_related_fk.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_related_m2m.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_related_generic.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_autocomplete_fk.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_autocomplete_m2m.js" type="text/javascript"></script>
+ <script src="{% admin_media_prefix %}js/grappelli/jquery.grp_autocomplete_generic.js" type="text/javascript"></script>
+
+ <!-- EXTRAHEAD -->
+ {% block extrahead %}{% endblock %}
+
+ {% endblock %}
+
+
+ <!-- the header lines from gstudio. after checking the css classes
+ called in the tempaltes, we need to prune the following -->
+
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <meta http-equiv="cache-control" content="public" />
+ <meta name="robots" content="follow, all" />
+ <meta name="language" content="{{ LANGUAGE_CODE }}" />
+ <meta name="description" content="{% block meta-description %}Demonstration of the Gstudio Blog application.{% endblock %}" />
+ <meta name="keywords" content="{% block meta-keywords %}django, blog, gstudio, {{ objecttype_tags|join:", "}}{% endblock %}" />
+ <meta name="author" content="gnowgi" />
+ {% block meta %}{% endblock %}
+ <link rel="pingback" href="/xmlrpc/" />
+ <link rel="shortcut icon" href="{{ STATIC_URL }}gstudio/img/favicon.ico" />
+ <link rel="home" href="{% url gstudio_nodetype_archive_index %}" />
+ <link rel="stylesheet" type="text/css" media="screen, projection" href="{{ STATIC_URL }}objectapp/css/screen.css" />
+ <link rel="stylesheet" type="text/css" media="print" href="{{ STATIC_URL }}gstudio/css/print.css" />
+ <!--[if lt IE 8]>
+ <link rel="stylesheet" type="text/css" media="screen, projection" href="{{ STATIC_URL }}gstudio/css/ie.css" />
+ <![endif]-->
+ {% block link %}{% endblock %}
+ {% block script %}{% endblock %}
+ <title>Gnowledge Studio - {% block title %}{% endblock %}</title>
+ </head>
+ <body id="gstudio">
+<div class="body" >
+ <div class="content">
+
+ <!--
+ <div id="relation_type" class="ui-buttonset">
+ <span>Relation type:</span>
+ <input checked="checked" value="follows" type="radio" id="follows" name="radio" class="ui-helper-hidden-accessible"><label for="follows" class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-left" aria-pressed="false" role="button" aria-disabled="false"><span class="ui-button-text">Followers</span></label>
+ <input value="mentions" type="radio" id="mentions" name="radio" class="ui-helper-hidden-accessible"><label for="mentions" aria-pressed="true" class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-right ui-state-active" role="button" aria-disabled="false"><span class="ui-button-text">Mentions</span></label>
+ <input value="hashtags" type="radio" id="hashtags" name="radio"/><label for="hashtags">Shared interests</label>
+ </div>
+ -->
+ <div id="chart"><svg width="960" height="700" style="opacity: 1; ">
+ </div>
+
+
+ <script type="text/javascript" src="/static/gstudio/js/jquery.min.js" ></script>
+ <script type="text/javascript" src="/static/gstudio/js/jquery-ui.js" ></script>
+
+ <script type="text/javascript" src="/static/gstudio/js/underscore.js" ></script>
+
+ <script type="text/javascript" src="/static/gstudio/js/d3.js"></script>
+ <script type="text/javascript" src="/static/gstudio/js/d3.layout.js"></script>
+ <script type="text/javascript" src="/static/gstudio/js/d3.geom.js"></script>
+ <!-- <script type="text/javascript" src="/static/gstudio/js/force.js"></script>
+
+Javascript for Object type force graph
+-->
+ <script type="text/javascript" >
+
+ var w = 700,
+ h = 300,
+ fill = d3.scale.category20();
+
+ var vis = d3.select("#chart")
+ .append("svg:svg")
+ .attr("width", w)
+ .attr("height", h);
+
+ vis.append("svg:g").attr("class", "edges");
+ vis.append("svg:g").attr("class", "nodes");
+
+$(function() {
+ $.ajax({
+ url: '/nodetypes/graphs/graph_json/{{ object.id }}',
+ //crossDomain: true,
+ dataType: 'json',
+ success : function(json) {
+
+ //var node = NID.objects.get(slug='{{ slug }}');
+ var force;
+
+ // this contains all the nodes as a dict with _id as the key
+
+ var nodes_by_id = _.reduce(json.node_metadata, function(acc, n) {
+ acc[n._id] = n;
+ return acc;
+ }, {});
+
+ var member_of = _(json.member_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'member_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var contains_subtypes = _(json.contains_subtypes).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'contains_subtypes';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var contains_members = _(json.contains_members).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'contains_members';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var left_subjecttype_of = _(json.left_subjecttype_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'left_subjecttype_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var subjecttype_of = _(json.subjecttype_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'subjecttype_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var plural = _(json.plural).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'plural';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var altnames = _(json.altnames).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'altnames';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+
+ var type_of = _(json.type_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'type_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ /*var content = _(json.content).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'content';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();*/
+
+ contains_members = _(json.contains_members).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'contains_members';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var prior_nodes = _(json.prior_nodes).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'prior_node';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+ var posterior_nodes = _(json.posterior_nodes).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'posterior_node';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var right_subjecttype_of = _(json.right_subjecttype_of).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'right_subjecttype_of';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var follows_edges = _(json.is_followed_by).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'follows_edges';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ var mentions_edges = _(json.is_mentioned_by).chain().map(function(e) {
+ e.source = nodes_by_id[e.from];
+ e.target = nodes_by_id[e.to];
+ e.type = 'mentions_edges';
+ return e;
+ }).filter(function(e){
+ return nodes_by_id[e.from] && nodes_by_id[e.to]
+ }).value();
+
+
+ nodes_by_id[{{ object.id }}].x = w/2.0;
+ nodes_by_id[{{ object.id }}].y = h/2.0;
+
+ all_edges = new Array();
+ all_edges = all_edges.concat(follows_edges, member_of, contains_members, contains_subtypes, mentions_edges, right_subjecttype_of, left_subjecttype_of, subjecttype_of,type_of,plural,altnames,contains_members, prior_nodes,posterior_nodes);
+ /* all_edges.concat(follows_edges);
+ all_edges.concat(member_of_metatype);
+ all_edges.concat(contains_members);
+ all_edges.concat(contains_subtypes);
+ all_edges.concat(mentions_edges);
+
+
+ document.getElementById('debugbox1').value= follows_edges; //member_of_metatype
+ document.getElementById('debugbox2').value= mentions_edges;
+ //document.getElementById('debugbox2').value= member_of_metatype;
+ document.getElementById('debugbox3').value= all_edges;
+ */
+ var force = d3.layout.force()
+ .linkStrength(0.5)
+ .charge(-2000)
+ .friction(0.7)
+ .gravity(0.7)
+ .linkDistance(15)
+ .nodes([])
+ .links([])
+ .size([w, h])
+ .start();
+
+ function update(edges){
+ // for each func
+ _.each(nodes_by_id, function(n){n.added = false});
+ // reduce the nodes list to have only those nodes for a given rel.
+ nodes = _.reduce(edges, function(acc, e) {
+ if(nodes_by_id[e.from] && !nodes_by_id[e.from].added){
+ nodes_by_id[e.from].added = true;
+ acc.push(nodes_by_id[e.from]);
+ }
+ if(nodes_by_id[e.to] && !nodes_by_id[e.to].added){
+ nodes_by_id[e.to].added = true;
+ acc.push(nodes_by_id[e.to]);
+ }
+ return acc;
+ }, []);
+
+ force.nodes(nodes);
+ force.links(edges);
+ force.start();
+
+ link = d3.select("#chart g.edges").selectAll("line.link")
+ .data(edges, function(e){return e.from + "-" + e.to + "-" + e.type});
+
+ link.enter().append("svg:line")
+ .attr("class", "link")
+ .style("stroke-width", 2 /* function(d) {
+ return Math.sqrt(d.value);
+ } */ )
+ .attr("x1", function(d) {
+ return d.source.x;
+ })
+
+ .attr("y1", function(d) {
+ return d.source.y;
+ })
+ .attr("x2", function(d) {
+ return d.target.x;
+ })
+ .attr("y2", function(d) {
+ return d.target.y;
+ })
+ .attr("text", function(d) {
+ return d.type;
+ })
+
+ .append("a")
+ .text(function(d) { return d.type; });
+
+
+ var node = d3.select("#chart g.nodes").selectAll("g.node").data(nodes);
+
+
+
+ var new_g = node.enter().append("svg:a")
+ .attr("class", function(d) { if (d._id=={{ object.id }}) return "mainnode"; else if (isNaN(d._id)) return "relnode"; else if ((d._id)<0) return "nodetext"; else return "node"; })
+ .attr("xlink:href", function(d){return d.url;})
+ .call(force.drag);
+
+
+ new_g.append("svg:circle")
+ .attr("cx", function(d) { return d.x - w/2.0 + 15; })
+ .attr("cy", function(d) { return d.y - h/2.0 + 15; })
+ .attr("r", function(d) { if (d._id=={{ object.id }}) return 8; else if (isNaN(d._id) || (d._id)<0) return 1; else return 7 })
+ .style("fill", function color(d) { if (d._id=={{ object.id }}) return "red"; else if (isNaN(d._id) || (d._id)<0) return "white" ; else return "green"});
+
+
+ new_g.append("svg:text")
+ .attr("class",function(d) { if (d._id=={{ object.id }}) return "mainnode"; else if (isNaN(d._id)) return "relnode"; else if ((d._id)<0) return "nodetext"; else return "node"; })
+ .attr("dy", 20)
+ .attr("dx", 25)
+ .attr("text-anchor",function text(d) { if (isNaN(d._id) || (d._id)<0) return "middle" ; else return "left"})
+
+// .attr("style",function text(d) { if (isNaN(d._id)) return "font-size:9.00pt;fill:#333;" ; else return "font-size:9.00pt;fill:black;"})
+
+ .text(function(d) {
+ return d.screen_name;
+ });
+
+
+ node.exit().remove();
+
+
+
+ force.on("tick", function() {
+
+ var x_center = $("#chart").width() / 2;
+ var y_center = $("#chart").height() / 2;
+
+ link.attr("x1", function(d) { return d.source.x; })
+ .attr("y1", function(d) { return d.source.y; })
+ .attr("x2", function(d) { return d.target.x; })
+ .attr("y2", function(d) { return d.target.y; });
+
+ node.attr("transform", function(d) { return "translate(" + (d.x-16) + "," + (d.y-16) + ")"; });
+
+ });
+ }
+
+ update(all_edges);
+ vis.style("opacity", 1e-6)
+ .transition()
+ .duration(1000)
+ .style("opacity", 1);
+
+ /* $('input#follows').change(function(){
+ update(all_edges);
+ });
+ */
+
+ /* $('input#mentions').change(function(){
+ update(all_edges);
+ }); */
+ }
+ });
+
+// $("#relation_type").buttonset();
+
+// $('input#mentions').change(function(){console.log(this)});
+// $('input#follows').change(function(){console.log(this)});
+});
+
+
+</script>
+
+ </div>
+
+</div>
+
+ <div>
+
+ {% include "gstudio/_header.html" %}
+
+
+ <div id="breadcrumbs" class="span-24 last">
+ / {% block breadcrumbs %}{% endblock %}
+ </div>
+ </div>
+ <div id="body" class="span-24 last">
+ <div id="content" class="hfeed span-16 border">
+ {% block content %}
+ <h3>The content block need to be overrided!</h3>
+ {% endblock %}
+ </div>
+ <div id="graph" class="span-16 last">
+ {% block graph %} {% endblock %}
+ </div>
+ <div id="sidebar" class="span-8 last">
+ {% block sidebar %}
+ {% endblock %}
+ </div>
+ </div>
+ <div id="footer" class="span-24 last">
+ <p>Powered by <a href="http://www.djangoproject.com">Django</a> and <a href="http://github.com/gnowgi/django-gstudio">Gstudio {{ GSTUDIO_VERSION }}</a>.</p>
+ </div>
+ </div>
+ </body>
+</html>
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tag/gbobject_list.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tag/gbobject_list.html
new file mode 100644
index 0000000..d85e241
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tag/gbobject_list.html
@@ -0,0 +1 @@
+{% extends "objectapp/gbobject_list.html" %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tag_list.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tag_list.html
new file mode 100644
index 0000000..21905a4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tag_list.html
@@ -0,0 +1,24 @@
+{% extends "objectapp/base.html" %}
+{% load i18n %}
+
+{% block meta-description %}{% trans "Tag list" %}{% endblock %}
+
+{% block title %}{% trans "Tags" %}{% endblock %}
+
+{% block content %}
+<h2>{% trans "Tag list" %}</h2>
+<div>
+ <ul>
+ {% for object in object_list %}
+ <li>
+ <a href="{% url objectapp_tag_detail object %}" title="{{ object }}">{{ object }}</a>
+ {% blocktrans count object.count as gbobject_count %}{{ gbobject_count }} gbobject{% plural %}{{ gbobject_count }} gbobjects{% endblocktrans %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No tags yet." %}
+ </li>
+ {% endfor %}
+ </ul>
+</div>
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects.html
new file mode 100644
index 0000000..f799579
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects.html
@@ -0,0 +1,15 @@
+{% load i18n %}
+<ul>
+ {% for date in archives %}
+ <li>
+ <a title="{% trans "Archives" %} {{ date|date:"YEAR_MONTH_FORMAT" }}" rel="archives"
+ href="{% url objectapp_gbobject_archive_month date|date:"Y" date|date:"m" %}">
+ {{ date|date:"YEAR_MONTH_FORMAT" }}
+ </a>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No archives yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects_link.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects_link.html
new file mode 100644
index 0000000..66a186c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects_link.html
@@ -0,0 +1,3 @@
+{% load i18n %}
+{% for date in archives %}<link rel="archives" title="{% trans "Archives" %} {{ date|date:"YEAR_MONTH_FORMAT" }}" href="{% url objectapp_gbobject_archive_month date|date:"Y" date|date:"m" %}" />
+{% endfor %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects_tree.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects_tree.html
new file mode 100644
index 0000000..c3405fb
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/archives_gbobjects_tree.html
@@ -0,0 +1,43 @@
+{% load i18n %}
+
+{% regroup archives by year as year_list %}
+<ul>
+ {% for year in year_list %}
+ <li>
+ <a title="{% trans "Archives" %} {{ year.grouper }}" rel="archives"
+ href="{% url objectapp_gbobject_archive_year year.grouper %}">{{ year.grouper }}</a>
+ {% regroup year.list by month as month_list %}
+ <ul>
+ {% for month in month_list %}
+ <li>
+ {% with month.list.0 as month_date %}
+ <a title="{% trans "Archives" %} {{ month_date|date:"YEAR_MONTH_FORMAT" }}" rel="archives"
+ href="{% url objectapp_gbobject_archive_month month_date|date:"Y" month_date|date:"m" %}">
+ {{ month_date|date:"F" }}
+ </a>
+ {% endwith %}
+ {% regroup month.list by day as day_list %}
+ <ul>
+ {% for day in day_list %}
+ <li>
+ {% with day.list.0 as day_date %}
+ <a title="{% trans "Archives" %} {{ day_date|date:"DATE_FORMAT" }}" rel="archives"
+ href="{% url objectapp_gbobject_archive_day day_date|date:"Y" day_date|date:"m" day_date|date:"d" %}">
+ {{ day_date|date:"MONTH_DAY_FORMAT" }}
+ </a>
+ {% endwith %}
+ </li>
+ {% endfor %}
+ </ul>
+ </li>
+ {% endfor %}
+ </ul>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No archives yet." %}
+ </li>
+ {% endfor %}
+</ul>
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/authors.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/authors.html
new file mode 100644
index 0000000..562a83f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/authors.html
@@ -0,0 +1,16 @@
+{% load i18n %}
+
+<ul>
+ {% for author in authors %}
+ <li class="vcard">
+ <a href="{% url objectapp_author_detail author.username %}"
+ title="{{ author.username }}" class="fn nickname url">{{ author.username }}</a>
+ <!--
+ {% blocktrans count author.gbobjects_published.count as gbobject_count %}{{ gbobject_count }} gbobject{% plural %}{{ gbobject_count }} gbobjects{% endblocktrans %} -->
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No authors yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/breadcrumbs.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/breadcrumbs.html
new file mode 100644
index 0000000..c7a5361
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/breadcrumbs.html
@@ -0,0 +1,7 @@
+{% for crumb in breadcrumbs %}
+{% if not forloop.last %}
+<a href="{{ crumb.url }}" title="{{ crumb.name }}">{{ crumb.name }}</a> {{ separator }}
+{% else %}
+ {{ crumb.name }}
+{% endif %}
+{% endfor %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/calendar.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/calendar.html
new file mode 100644
index 0000000..17e3218
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/calendar.html
@@ -0,0 +1,17 @@
+{{ calendar|safe }}
+<div class="month-navigation">
+ <div class="month-previous">
+ {% if previous_month %}
+ <a href="{% url objectapp_gbobject_archive_month previous_month|date:"Y" previous_month|date:"m" %}">
+ &lt;&lt; {{ previous_month|date:"YEAR_MONTH_FORMAT" }}
+ </a>
+ {% endif %}
+ </div>
+ <div class="month-next">
+ {% if next_month %}
+ <a href="{% url objectapp_gbobject_archive_month next_month|date:"Y" next_month|date:"m" %}">
+ {{ next_month|date:"YEAR_MONTH_FORMAT" }} &gt;&gt;
+ </a>
+ {% endif %}
+ </div>
+</div>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/dummy.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/dummy.html
new file mode 100644
index 0000000..f04fcf5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/dummy.html
@@ -0,0 +1 @@
+{% extends template %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/featured_gbobjects.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/featured_gbobjects.html
new file mode 100644
index 0000000..9e9c924
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/featured_gbobjects.html
@@ -0,0 +1,12 @@
+{% load i18n %}
+<ul>
+ {% for gbobject in gbobjects %}
+ <li>
+ <a href="{{ gbobject.get_absolute_url }}" title="{{ gbobject.title }}" rel="bookmark">{{ gbobject.title }}</a>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No gbobjects yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/gbobjects.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/gbobjects.html
new file mode 100644
index 0000000..16ba809
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/gbobjects.html
@@ -0,0 +1,16 @@
+{% load i18n mptt_tags %}
+
+{% for objecttype, structure in objecttypes|tree_info %}
+ {% if structure.new_level %}<ul><li>{% else %}</li><li>{% endif %}
+ <a href="{{ objecttype.get_absolute_url }}" title="{{ objecttype.title }}">{{ objecttype.title }}</a>
+ {% blocktrans count objecttypes.gbobjects_published.count as gbobjects_count %}{{ gbobjects_count }} gbobject{% plural %}{{ gbobjects_count }} gbobjects{% endblocktrans %}
+
+ {% empty %}
+<ul>
+ <li>
+ {% trans "No subtypes yet." %}
+ </li>
+</ul>
+{% endfor %}
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/objecttypes.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/objecttypes.html
new file mode 100644
index 0000000..9c54641
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/objecttypes.html
@@ -0,0 +1,16 @@
+{% load i18n mptt_tags %}
+
+{% for Objecttype, structure in objecttypes|tree_info %}
+ {% if structure.new_level %}<ul><li>{% else %}</li><li>{% endif %}
+ <a href="{{ Objecttype.get_absolute_url }}" title="{{ Objecttype.title }}">{{ Objecttype.title }}</a>
+ {% blocktrans count Objecttype.gbobjects_published.count as gbobject_count %}{{ gbobject_count }} gbobject{% plural %}{{ gbobject_count }} gbobjects{% endblocktrans %}
+ {% for level in structure.closed_levels %}</li></ul>{% endfor %}
+ {% empty %}
+<ul>
+ <li>
+ {% trans "No objecttypes yet." %}
+ </li>
+</ul>
+{% endfor %}
+
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/pagination.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/pagination.html
new file mode 100644
index 0000000..273811f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/pagination.html
@@ -0,0 +1,59 @@
+{% load i18n %}
+<div class="paginator span-16 last">
+ <span class="index">
+ {% blocktrans with page.number as current_page and page.paginator.num_pages as total_page %}Page {{ current_page }} of {{ total_page }}{% endblocktrans %}
+ </span>
+
+ {% if page.has_previous %}
+ <span class="previous">
+ <a href="?page={{ page.previous_page_number }}{{ GET_string }}"
+ title="{% trans "More recent gbobjects" %}">&laquo;</a>
+ </span>
+ {% endif %}
+
+ {% for page_number in begin %}
+ <span class="page {% ifequal page.number page_number %}current{% endifequal %}">
+ {% ifequal page.number page_number %}
+ <strong>{{ page_number }}</strong>
+ {% else %}
+ <a href="?page={{ page_number }}{{ GET_string }}"
+ title="{% trans "Gbobjects page" %} {{ page_number }}">{{ page_number }}</a>
+ {% endifequal%}
+ </span>
+ {% endfor %}
+
+ {% if middle %}
+ <span class="ellipsis">&hellip;</span>
+ {% for page_number in middle %}
+ <span class="page {% ifequal page.number page_number %}current{% endifequal %}">
+ {% ifequal page.number page_number %}
+ <strong>{{ page_number }}</strong>
+ {% else %}
+ <a href="?page={{ page_number }}{{ GET_string }}"
+ title="{% trans "Gbobjects page" %} {{ page_number }}">{{ page_number }}</a>
+ {% endifequal%}
+ </span>
+ {% endfor %}
+ {% endif %}
+
+ {% if end %}
+ <span class="ellipsis">&hellip;</span>
+ {% for page_number in end %}
+ <span class="page {% ifequal page.number page_number %}current{% endifequal %}">
+ {% ifequal page.number page_number %}
+ <strong>{{ page_number }}</strong>
+ {% else %}
+ <a href="?page={{ page_number }}{{ GET_string }}"
+ title="{% trans "Gbobjects page" %} {{ page_number }}">{{ page_number }}</a>
+ {% endifequal%}
+ </span>
+ {% endfor %}
+ {% endif %}
+
+ {% if page.has_next %}
+ <span class="next">
+ <a href="?page={{ page.next_page_number }}{{ GET_string }}"
+ title="{% trans "More old gbobjects" %}">&raquo;</a>
+ </span>
+ {% endif %}
+</div>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/popular_gbobjects.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/popular_gbobjects.html
new file mode 100644
index 0000000..f3339af
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/popular_gbobjects.html
@@ -0,0 +1,16 @@
+{% load i18n %}
+<ul>
+ {% for gbobject in gbobjects %}
+ <li>
+ <a href="{{ gbobject.get_absolute_url }}" title="{{ gbobject.title }}" rel="bookmark">{{ gbobject.title }}</a>
+ <br />
+ {% with gbobject.comments.count as comment_count %}
+ <a href="{{ gbobject.get_absolute_url }}#comments" title="{{ gbobject.title }}">{{ comment_count }} {% trans "comment" %}{{ comment_count|pluralize }}</a>
+ {% endwith %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No gbobjects yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/random_gbobjects.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/random_gbobjects.html
new file mode 100644
index 0000000..9e9c924
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/random_gbobjects.html
@@ -0,0 +1,12 @@
+{% load i18n %}
+<ul>
+ {% for gbobject in gbobjects %}
+ <li>
+ <a href="{{ gbobject.get_absolute_url }}" title="{{ gbobject.title }}" rel="bookmark">{{ gbobject.title }}</a>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No gbobjects yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_comments.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_comments.html
new file mode 100644
index 0000000..58907d8
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_comments.html
@@ -0,0 +1,20 @@
+{% load i18n %}
+
+<ul>
+ {% for comment in comments %}
+ <li>
+ {% with comment.content_object as gbobject %}
+ {{ comment.user_name }} {% trans "in" %}
+ <a href="{{ gbobject.get_absolute_url }}#comment_{{ comment.pk }}"
+ title="{% trans "Comment on" %} {{ gbobject.title }}">
+ {{ gbobject.title }}
+ </a>
+ {% endwith %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No comments yet." %}
+ </li>
+ {% endfor %}
+</ul>
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_gbobjects.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_gbobjects.html
new file mode 100644
index 0000000..9e9c924
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_gbobjects.html
@@ -0,0 +1,12 @@
+{% load i18n %}
+<ul>
+ {% for gbobject in gbobjects %}
+ <li>
+ <a href="{{ gbobject.get_absolute_url }}" title="{{ gbobject.title }}" rel="bookmark">{{ gbobject.title }}</a>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No gbobjects yet." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_linkbacks.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_linkbacks.html
new file mode 100644
index 0000000..f731556
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/recent_linkbacks.html
@@ -0,0 +1,21 @@
+{% load i18n %}
+
+<ul>
+ {% for linkback in linkbacks %}
+ <li>
+ {% with linkback.content_object as gbobject %}
+ <a href="{{ linkback.url }}">{{ linkback.user_name }}</a>
+ {% trans "in" %}
+ <a href="{{ gbobject.get_absolute_url }}#{{ linkback.flags.all.0.flag }}_{{ linkback.pk }}"
+ title="{% trans "Linkback on" %} {{ gbobject.title }}">
+ {{ gbobject.title }}
+ </a>
+ {% endwith %}
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No linkbacks yet." %}
+ </li>
+ {% endfor %}
+</ul>
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/similar_gbobjects.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/similar_gbobjects.html
new file mode 100644
index 0000000..fcd8650
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/similar_gbobjects.html
@@ -0,0 +1,12 @@
+{% load i18n %}
+<ul>
+ {% for gbobject in gbobjects %}
+ <li>
+ <a href="{{ gbobject.get_absolute_url }}" title="{{ gbobject.title }}" rel="bookmark">{{ gbobject.title }}</a>
+ </li>
+ {% empty %}
+ <li>
+ {% trans "No similar objects." %}
+ </li>
+ {% endfor %}
+</ul>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/slider_gbobjects.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/slider_gbobjects.html
new file mode 100644
index 0000000..205a720
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/slider_gbobjects.html
@@ -0,0 +1,27 @@
+{% if gbobjects %}
+<div id="slider">
+ <ul class="ui-tabs-nav">
+ {% for gbobject in gbobjects %}
+ <li class="ui-tabs-nav-item{% if forloop.first %} ui-tabs-selected{% endif %}"
+ id="nav-slider-{{ forloop.counter }}">
+ <a href="#gbobject-slider-{{ forloop.counter }}">
+ <img src="{% if gbobject.image %}{{ gbobject.image.url }}{% endif %}" alt="{{ gbobject.title }}" />
+ <span>{{ gbobject.title }}</span>
+ </a>
+ </li>
+ {% endfor %}
+ </ul>
+
+ {% for gbobject in gbobjects %}
+ <div id="gbobject-slider-{{ forloop.counter }}" class="ui-tabs-panel">
+ <img src="{% if gbobject.image %}{{ gbobject.image.url }}{% endif %}" alt="{{ gbobject.title }}" />
+ <div class="panel_info">
+ <h2>
+ <a href="{{ gbobject.get_absolute_url }}" rel="bookmark">{{ gbobject.title }}</a>
+ </h2>
+ {{ gbobject.excerpt|linebreaks|truncatewords_html:20 }}
+ </div>
+ </div>
+ {% endfor %}
+</div>
+{% endif %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/tag_cloud.html b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/tag_cloud.html
new file mode 100644
index 0000000..fac0061
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/tags/tag_cloud.html
@@ -0,0 +1,13 @@
+{% load i18n %}
+
+<div>
+ <ul>
+ {% for tag in tags %}
+ <li>
+ <a href="{% url objectapp_tag_detail tag.name %}"
+ title="{% blocktrans count tag.count as gbobject_count %}{{ gbobject_count }} gbobject{% plural %}{{ gbobject_count }} gbobjects{% endblocktrans %}"
+ class="tag_{{ tag.font_size }}">{{ tag }}</a>
+ </li>
+ {% endfor %}
+ </ul>
+</div>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/wlwmanifest.xml b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/wlwmanifest.xml
new file mode 100644
index 0000000..a1a2312
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/wlwmanifest.xml
@@ -0,0 +1,63 @@
+{% load i18n %}<?xml version="1.0" encoding="utf-8" ?>
+<manifest xmlns="http://schemas.microsoft.com/wlw/manifest/weblog">
+ <options>
+ <!-- http://msdn.microsoft.com/en-us/library/bb463260.aspx -->
+ <clientType>Metaweblog</clientType>
+ <supportsPostAsDraft>Yes</supportsPostAsDraft>
+ <supportsFileUpload>Yes</supportsFileUpload>
+ <supportsExtendedGbobjects>No</supportsExtendedGbobjects>
+ <supportsCustomDate>Yes</supportsCustomDate>
+ <supportsObjecttypes>Yes</supportsObjecttypes>
+ <supportsObjecttypesInline>Yes</supportsObjecttypesInline>
+ <supportsMultipleObjecttypes>Yes</supportsMultipleObjecttypes>
+ <supportsHierarchicalObjecttypes>Yes</supportsHierarchicalObjecttypes>
+ <supportsNewObjecttypes>Yes</supportsNewObjecttypes>
+ <supportsNewObjecttypesInline>Yes</supportsNewObjecttypesInline>
+ <supportsKeywords>Yes</supportsKeywords>
+ <supportsCommentPolicy>Yes</supportsCommentPolicy>
+ <supportsPingPolicy>Yes</supportsPingPolicy>
+ <supportsAuthor>Yes</supportsAuthor>
+ <supportsSlug>Yes</supportsSlug>
+ <supportsPassword>Yes</supportsPassword>
+ <supportsExcerpt>Yes</supportsExcerpt>
+ <supportsTrackbacks>No</supportsTrackbacks>
+ <supportsPages>No</supportsPages>
+ <supportsPageParent>No</supportsPageParent>
+ <supportsPageOrder>No</supportsPageOrder>
+ <supportsEmptyTitles>No</supportsEmptyTitles>
+ <requiresHtmlTitles>No</requiresHtmlTitles>
+ <requiresXHTML>No</requiresXHTML>
+ <supportsScripts>Yes</supportsScripts>
+ <supportsEmbeds>Yes</supportsEmbeds>
+ <characterSet>UTF-8</characterSet>
+ <maxObjecttypeNameLength>50</maxObjecttypeNameLength>
+ </options>
+
+ <weblog>
+ <serviceName>{{ site.name }} Blog</serviceName>
+ <imageUrl>{{ STATIC_URL }}objectapp/img/wlw/objectapp.png</imageUrl>
+ <watermarkImageUrl>{{ STATIC_URL }}objectapp/img/wlw/watermark.png</watermarkImageUrl>
+ <homepageLinkText>{% trans "View site" %}</homepageLinkText>
+ <adminLinkText>{% trans "Admin. site" %}</adminLinkText>
+ <adminUrl><![CDATA[
+ {blog-homepage-url}{% url admin:index %}
+ ]]></adminUrl>
+ <postEditingUrl><![CDATA[
+ {blog-homepage-url}{% url admin:objectapp_gbobject_changelist %}{post-id}/
+ ]]></postEditingUrl>
+ </weblog>
+
+ <buttons>
+ <button>
+ <id>0</id>
+ <text>{% trans "Manage comments" %}</text>
+ <imageUrl>{{ STATIC_URL }}objectapp/img/wlw/comments.png</imageUrl>
+ <clickUrl><![CDATA[
+ {blog-homepage-url}{% url admin:comments_comment_changelist %}
+ ]]></clickUrl>
+ </button>
+ </buttons>-->
+
+ <!-- Add views section -->
+</manifest>
+
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectapp/wxr.xml b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/wxr.xml
new file mode 100644
index 0000000..09da154
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectapp/wxr.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+{% load tagging_tags %}
+<!-- This is a WordPress eXtended RSS file generated by Objectapp {{ version }} as an export of your blog. -->
+<!-- It contains information about your blog's posts, comments, and objecttypes. -->
+<!-- You may use this file to transfer that content from one site to another. -->
+<!-- This file is not intended to serve as a complete backup of your blog. -->
+
+<!-- generator="Objectapp/{{ version }}" created="{% now "Y-m-d H:i" %}"-->
+<rss version="2.0"
+ xmlns:excerpt="http://wordpress.org/export/1.0/excerpt/"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
+ xmlns:wfw="http://wellformedweb.org/CommentAPI/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:wp="http://wordpress.org/export/1.0/">
+ <channel>
+ <title>{{ site.name }}</title>
+ <link>{{ site_url }}</link>
+ <description>{{ description }}</description>
+ <pubDate>{% now "r" %}</pubDate>
+ <generator>Objectapp {{ version }}</generator>
+ <language>{{ language }}</language>
+ <wp:wxr_version>1.0</wp:wxr_version>
+ <wp:base_site_url>{{ site_url }}</wp:base_site_url>
+ <wp:base_blog_url>{{ site_url }}{% url objectapp_gbobject_archive_index %}</wp:base_blog_url>
+ {% for Objecttype in objecttypes %}
+ <wp:Objecttype>
+ <wp:Objecttype_nicename>{{ Objecttype.slug }}</wp:Objecttype_nicename>
+ <wp:Objecttype_parent>{{ Objecttype.parent.title }}</wp:Objecttype_parent>
+ <wp:cat_name><![CDATA[{{ Objecttype.title }}]]></wp:cat_name>
+ <wp:Objecttype_description><![CDATA[{{ Objecttype.description }}]]></wp:Objecttype_description>
+ </wp:Objecttype>
+ {% endfor %}{% for tag in tags %}
+ <wp:tag>
+ <wp:tag_slug>{{ tag.name }}</wp:tag_slug>
+ <wp:tag_name><![CDATA[{{ tag.name }}]]></wp:tag_name>
+ </wp:tag>
+ {% endfor %}{% for gbobject in gbobjects %}
+ <item>
+ <title>{{ gbobject.title }}</title>
+ <link>{{ site_url }}{{ gbobject.get_absolute_url }}</link>
+ <pubDate>{{ gbobject.publication_date|date:"r" }}</pubDate>
+ <dc:creator><![CDATA[{{ gbobject.authors.all.0 }}]]></dc:creator>
+ {% for Objecttype in gbobject.objecttypes.all %}
+ <Objecttype domain="Objecttype" nicename="{{ Objecttype.slug }}"><![CDATA[{{ Objecttype.title }}]]></Objecttype>
+ {% endfor %}{% tags_for_object gbobject as tag_list %}{% for tag in tag_list %}
+ <Objecttype domain="tag" nicename="{{ tag }}"><![CDATA[{{ tag }}]]></Objecttype>
+ {% endfor %}
+ <guid isPermaLink="true">{{ site_url }}{{ gbobject.get_absolute_url }}</guid>
+ <description></description>
+ <content:encoded><![CDATA[{{ gbobject.html_content|safe }}]]></content:encoded>
+ <excerpt:encoded><![CDATA[{{ gbobject.excerpt }}]]></excerpt:encoded>
+ <wp:post_id>{{ gbobject.pk }}</wp:post_id>
+ <wp:post_date>{{ gbobject.publication_date|date:"Y-m-d H:i:s"}}</wp:post_date>
+ <wp:post_date_gmt>0000-00-00 00:00:00</wp:post_date_gmt>
+ <wp:comment_status>{% if gbobject.comment_enabled %}open{% else %}closed{% endif %}</wp:comment_status>
+ <wp:ping_status>{% if gbobject.pingback_enabled %}open{% else %}closed{% endif %}</wp:ping_status>
+ <wp:post_name>{{ gbobject.slug }}</wp:post_name>
+ <wp:status>{% if gbobject.is_visible %}{% if gbobject.login_required %}private{% else %}publish{% endif %}{% else %}draft{% endif %}</wp:status>
+ <wp:post_parent>0</wp:post_parent>
+ <wp:menu_order>0</wp:menu_order>
+ <wp:post_type>post</wp:post_type>
+ <wp:post_password>{{ gbobject.password }}</wp:post_password>
+ <wp:is_sticky>{{ gbobject.featured|yesno:"1,0" }}</wp:is_sticky>
+ <wp:postmeta>
+ <wp:meta_key>_last_update</wp:meta_key>
+ <wp:meta_value><![CDATA[{{ gbobject.last_update|date:"c"}}]]></wp:meta_value>
+ </wp:postmeta>
+ <wp:postmeta>
+ <wp:meta_key>_start_publication</wp:meta_key>
+ <wp:meta_value><![CDATA[{{ gbobject.start_publication|date:"c"}}]]></wp:meta_value>
+ </wp:postmeta>
+ <wp:postmeta>
+ <wp:meta_key>_end_publication</wp:meta_key>
+ <wp:meta_value><![CDATA[{{ gbobject.end_publication|date:"c"}}]]></wp:meta_value>
+ </wp:postmeta>
+ {% for comment in gbobject.comments %}
+ <wp:comment>
+ <wp:comment_id>{{ comment.id }}</wp:comment_id>
+ <wp:comment_author><![CDATA[{{ comment.userinfo.name }}]]></wp:comment_author>
+ <wp:comment_author_email>{{ comment.userinfo.email }}</wp:comment_author_email>
+ <wp:comment_author_url>{{ comment.userinfo.url }}</wp:comment_author_url>
+ <wp:comment_author_IP>{{ comment.ip_address }}</wp:comment_author_IP>
+ <wp:comment_date>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date>
+ <wp:comment_date_gmt>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date_gmt>
+ <wp:comment_content><![CDATA[{{ comment.comment }}]]></wp:comment_content>
+ <wp:comment_approved>1</wp:comment_approved>
+ <wp:comment_type></wp:comment_type>
+ <wp:comment_parent>0</wp:comment_parent>
+ <wp:comment_user_id>0</wp:comment_user_id>
+ </wp:comment>
+ {% endfor %}{% for comment in gbobject.pingbacks %}
+ <wp:comment>
+ <wp:comment_id>{{ comment.id }}</wp:comment_id>
+ <wp:comment_author><![CDATA[{{ comment.userinfo.name }}]]></wp:comment_author>
+ <wp:comment_author_email>{{ comment.userinfo.email }}</wp:comment_author_email>
+ <wp:comment_author_url>{{ comment.userinfo.url }}</wp:comment_author_url>
+ <wp:comment_author_IP>{{ comment.ip_address }}</wp:comment_author_IP>
+ <wp:comment_date>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date>
+ <wp:comment_date_gmt>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date_gmt>
+ <wp:comment_content><![CDATA[{{ comment.comment }}]]></wp:comment_content>
+ <wp:comment_approved>1</wp:comment_approved>
+ <wp:comment_type>pingback</wp:comment_type>
+ <wp:comment_parent>0</wp:comment_parent>
+ <wp:comment_user_id>0</wp:comment_user_id>
+ </wp:comment>
+ {% endfor %}{% for comment in gbobject.trackbacks %}
+ <wp:comment>
+ <wp:comment_id>{{ comment.id }}</wp:comment_id>
+ <wp:comment_author><![CDATA[{{ comment.userinfo.name }}]]></wp:comment_author>
+ <wp:comment_author_email>{{ comment.userinfo.email }}</wp:comment_author_email>
+ <wp:comment_author_url>{{ comment.userinfo.url }}</wp:comment_author_url>
+ <wp:comment_author_IP>{{ comment.ip_address }}</wp:comment_author_IP>
+ <wp:comment_date>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date>
+ <wp:comment_date_gmt>{{ comment.submit_date|date:"Y-m-d H:i:s" }}</wp:comment_date_gmt>
+ <wp:comment_content><![CDATA[{{ comment.comment }}]]></wp:comment_content>
+ <wp:comment_approved>1</wp:comment_approved>
+ <wp:comment_type>trackback</wp:comment_type>
+ <wp:comment_parent>0</wp:comment_parent>
+ <wp:comment_user_id>0</wp:comment_user_id>
+ </wp:comment>
+ {% endfor %}
+ </item>
+ {% endfor %}
+ </channel>
+</rss>
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectappforms/gbobjectform.html b/build/lib.linux-i686-2.6/objectapp/templates/objectappforms/gbobjectform.html
new file mode 100644
index 0000000..8322277
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectappforms/gbobjectform.html
@@ -0,0 +1,29 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %}
+<h2>Form to add Objects</h2>
+{% if user.is_authenticated %}
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectappforms/processform.html b/build/lib.linux-i686-2.6/objectapp/templates/objectappforms/processform.html
new file mode 100644
index 0000000..e8fd6ae
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectappforms/processform.html
@@ -0,0 +1,29 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %}
+{% if user.is_authenticated %}
+<h2>Form to add Processes</h2>
+
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templates/objectappforms/systemform.html b/build/lib.linux-i686-2.6/objectapp/templates/objectappforms/systemform.html
new file mode 100644
index 0000000..6697897
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templates/objectappforms/systemform.html
@@ -0,0 +1,29 @@
+{% extends "gstudio/base.html" %}
+{% load i18n %}
+
+{% block content %}
+<form method="post" action=".">
+{% csrf_token %}
+{% if user.is_authenticated %}
+<h2>Form to add Systems</h2>
+
+{% for field in formset %}
+
+ {{ field.label_tag }}:{{ field }}<br>
+ {{field.help_text}}<br>
+ {{ field.errors }}<br>
+
+
+{% endfor %}
+
+ <input type="Submit" value="{% trans 'ADD' %}" />
+ <input type="hidden" name="next" value="{{ next }}" />
+</form>
+ {% else %}
+ <h2>Sorry either you are not logged in or dont have permission to view this content</h2>
+ <a href="{{get_absoulute_url}}/accounts/login">{% trans 'Login' %}</a><br>
+ <a href="{{get_absoulute_url}}/accounts/register">{% trans 'Register' %}</a><br>
+ {% endif %}
+
+
+{% endblock %}
diff --git a/build/lib.linux-i686-2.6/objectapp/templatetags/__init__.py b/build/lib.linux-i686-2.6/objectapp/templatetags/__init__.py
new file mode 100644
index 0000000..118b76b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templatetags/__init__.py
@@ -0,0 +1 @@
+"""Templatetags for Objectapp"""
diff --git a/build/lib.linux-i686-2.6/objectapp/templatetags/objectapp_admin_tags.py b/build/lib.linux-i686-2.6/objectapp/templatetags/objectapp_admin_tags.py
new file mode 100644
index 0000000..7d5432d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templatetags/objectapp_admin_tags.py
@@ -0,0 +1,89 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Template tags and filters for Objectapp's admin"""
+from django.template import Library
+from django.contrib import comments
+from django.contrib.contenttypes.models import ContentType
+
+from objectapp.models import Gbobject
+from objectapp.models import Author
+from objectapp.models import Objecttype
+from objectapp.managers import DRAFT
+from objectapp.managers import tags_published
+
+register = Library()
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_draft_gbobjects(
+ number=5, template='admin/objectapp/widgets/_draft_gbobjects.html'):
+ """Return the latest draft gbobjects"""
+ return {'template': template,
+ 'gbobjects': Gbobject.objects.filter(status=DRAFT)[:number]}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_content_stats(
+ template='admin/objectapp/widgets/_content_stats.html'):
+ """Return statistics of the contents"""
+ content_type = ContentType.objects.get_for_model(Gbobject)
+
+ discussions = comments.get_model().objects.filter(
+ is_public=True, content_type=content_type)
+
+ return {'template': template,
+ 'gbobjects': Gbobject.published.count(),
+ 'objecttypes': Objecttype.objects.count(),
+ 'tags': tags_published().count(),
+ 'authors': Author.published.count(),
+ 'comments': discussions.filter(flags=None).count(),
+ 'pingbacks': discussions.filter(flags__flag='pingback').count(),
+ 'trackbacks': discussions.filter(flags__flag='trackback').count(),
+ 'rejects': comments.get_model().objects.filter(
+ is_public=False, content_type=content_type).count(),
+ }
diff --git a/build/lib.linux-i686-2.6/objectapp/templatetags/objectapp_tags.py b/build/lib.linux-i686-2.6/objectapp/templatetags/objectapp_tags.py
new file mode 100644
index 0000000..209223c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templatetags/objectapp_tags.py
@@ -0,0 +1,375 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Template tags and filters for Objectapp"""
+from hashlib import md5
+from random import sample
+from urllib import urlencode
+from datetime import datetime
+
+from django.db.models import Q
+from django.db import connection
+from django.template import Node
+from django.template import Library
+from django.template import TemplateSyntaxError
+from django.contrib.comments.models import CommentFlag
+from django.contrib.contenttypes.models import ContentType
+from django.utils.encoding import smart_unicode
+from django.contrib.comments import get_model as get_comment_model
+
+from tagging.models import Tag
+from tagging.utils import calculate_cloud
+
+from gstudio.gnowql import get_node
+
+from objectapp.models import Gbobject
+from objectapp.models import Author
+from objectapp.models import Objecttype
+from objectapp.managers import tags_published
+from objectapp.comparison import VectorBuilder
+from objectapp.comparison import pearson_score
+from objectapp.templatetags.zcalendar import ObjectappCalendar
+from objectapp.templatetags.zbreadcrumbs import retrieve_breadcrumbs
+
+register = Library()
+
+VECTORS = None
+VECTORS_FACTORY = lambda: VectorBuilder(Gbobject.published.all(),
+ ['title', 'excerpt', 'content'])
+CACHE_GBOBJECTS_RELATED = {}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_objecttypes(template='objectapp/tags/objecttypes.html'):
+ """Return the objecttypes"""
+ return {'template': template,
+ 'objecttypes': Objecttype.tree.all()}
+
+@register.simple_tag
+def get_this_nodes_uri(name):
+ obj = get_node(name)
+ return obj.get_absolute_url()
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_authors(template='objectapp/tags/authors.html'):
+ """Return the published authors"""
+ return {'template': template,
+ 'authors': Author.published.all()}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_recent_gbobjects(number=5, template='objectapp/tags/recent_gbobjects.html'):
+ """Return the most recent gbobjects"""
+ return {'template': template,
+ 'gbobjects': Gbobject.published.all()[:number]}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_featured_gbobjects(number=5,
+ template='objectapp/tags/featured_gbobjects.html'):
+ """Return the featured gbobjects"""
+ return {'template': template,
+ 'gbobjects': Gbobject.published.filter(featured=True)[:number]}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_random_gbobjects(number=5, template='objectapp/tags/random_gbobjects.html'):
+ """Return random gbobjects"""
+ gbobjects = Gbobject.published.all()
+ if number > len(gbobjects):
+ number = len(gbobjects)
+ return {'template': template,
+ 'gbobjects': sample(gbobjects, number)}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_popular_gbobjects(number=5, template='objectapp/tags/popular_gbobjects.html'):
+ """Return popular gbobjects"""
+ ctype = ContentType.objects.get_for_model(Gbobject)
+ query = """SELECT object_pk, COUNT(*) AS score
+ FROM %s
+ WHERE content_type_id = %%s
+ AND is_public = '1'
+ GROUP BY object_pk
+ ORDER BY score DESC""" % get_comment_model()._meta.db_table
+
+ cursor = connection.cursor()
+ cursor.execute(query, [ctype.id])
+ object_ids = [int(row[0]) for row in cursor.fetchall()]
+
+ # Use ``in_bulk`` here instead of an ``id__in`` filter, because ``id__in``
+ # would clobber the ordering.
+ object_dict = Gbobject.published.in_bulk(object_ids)
+
+ return {'template': template,
+ 'gbobjects': [object_dict[object_id]
+ for object_id in object_ids
+ if object_id in object_dict][:number]}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html', takes_context=True)
+def get_similar_gbobjects(context, number=5,
+ template='objectapp/tags/similar_gbobjects.html',
+ flush=False):
+ """Return similar gbobjects"""
+ global VECTORS
+ global CACHE_GBOBJECTS_RELATED
+
+ if VECTORS is None or flush:
+ VECTORS = VECTORS_FACTORY()
+ CACHE_GBOBJECTS_RELATED = {}
+
+ def compute_related(object_id, dataset):
+ """Compute related gbobjects to an gbobject with a dataset"""
+ object_vector = None
+ for gbobject, e_vector in dataset.items():
+ if gbobject.pk == object_id:
+ object_vector = e_vector
+
+ if not object_vector:
+ return []
+
+ gbobject_related = {}
+ for gbobject, e_vector in dataset.items():
+ if gbobject.pk != object_id:
+ score = pearson_score(object_vector, e_vector)
+ if score:
+ gbobject_related[gbobject] = score
+
+ related = sorted(gbobject_related.items(), key=lambda(k, v): (v, k))
+ return [rel[0] for rel in related]
+
+ object_id = context['object'].pk
+ columns, dataset = VECTORS()
+ key = '%s-%s' % (object_id, VECTORS.key)
+ if not key in CACHE_GBOBJECTS_RELATED.keys():
+ CACHE_GBOBJECTS_RELATED[key] = compute_related(object_id, dataset)
+
+ gbobjects = CACHE_GBOBJECTS_RELATED[key][:number]
+ return {'template': template,
+ 'gbobjects': gbobjects}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_archives_gbobjects(template='objectapp/tags/archives_gbobjects.html'):
+ """Return archives gbobjects"""
+ return {'template': template,
+ 'archives': Gbobject.published.dates('creation_date', 'month',
+ order='DESC')}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_archives_gbobjects_tree(
+ template='objectapp/tags/archives_gbobjects_tree.html'):
+ """Return archives gbobjects as a Tree"""
+ return {'template': template,
+ 'archives': Gbobject.published.dates('creation_date', 'day',
+ order='ASC')}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html', takes_context=True)
+def get_calendar_gbobjects(context, year=None, month=None,
+ template='objectapp/tags/calendar.html'):
+ """Return an HTML calendar of gbobjects"""
+ if not year or not month:
+ date_month = context.get('month') or context.get('day') or \
+ getattr(context.get('object'), 'creation_date', None) or \
+ datetime.today()
+ year, month = date_month.timetuple()[:2]
+
+ calendar = ObjectappCalendar()
+ current_month = datetime(year, month, 1)
+
+ dates = list(Gbobject.published.dates('creation_date', 'month'))
+
+ if not current_month in dates:
+ dates.append(current_month)
+ dates.sort()
+ index = dates.index(current_month)
+
+ previous_month = index > 0 and dates[index - 1] or None
+ next_month = index != len(dates) - 1 and dates[index + 1] or None
+
+ return {'template': template,
+ 'next_month': next_month,
+ 'previous_month': previous_month,
+ 'calendar': calendar.formatmonth(year, month)}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_recent_comments(number=5, template='objectapp/tags/recent_comments.html'):
+ """Return the most recent comments"""
+ # Using map(smart_unicode... fix bug related to issue #8554
+ gbobject_published_pks = map(smart_unicode,
+ Gbobject.published.values_list('id', flat=True))
+ content_type = ContentType.objects.get_for_model(Gbobject)
+
+ comments = get_comment_model().objects.filter(
+ Q(flags=None) | Q(flags__flag=CommentFlag.MODERATOR_APPROVAL),
+ content_type=content_type, object_pk__in=gbobject_published_pks,
+ is_public=True).order_by('-submit_date')[:number]
+
+ return {'template': template,
+ 'comments': comments}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_recent_linkbacks(number=5,
+ template='objectapp/tags/recent_linkbacks.html'):
+ """Return the most recent linkbacks"""
+ gbobject_published_pks = map(smart_unicode,
+ Gbobject.published.values_list('id', flat=True))
+ content_type = ContentType.objects.get_for_model(Gbobject)
+
+ linkbacks = get_comment_model().objects.filter(
+ content_type=content_type,
+ object_pk__in=gbobject_published_pks,
+ flags__flag__in=['pingback', 'trackback'],
+ is_public=True).order_by(
+ '-submit_date')[:number]
+
+ return {'template': template,
+ 'linkbacks': linkbacks}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html', takes_context=True)
+def objectapp_pagination(context, page, begin_pages=3, end_pages=3,
+ before_pages=2, after_pages=2,
+ template='objectapp/tags/pagination.html'):
+ """Return a Digg-like pagination, by splitting long list of page
+ into 3 blocks of pages"""
+ GET_string = ''
+ for key, value in context['request'].GET.items():
+ if key != 'page':
+ GET_string += '&%s=%s' % (key, value)
+
+ begin = page.paginator.page_range[:begin_pages]
+ end = page.paginator.page_range[-end_pages:]
+ middle = page.paginator.page_range[max(page.number - before_pages - 1, 0):
+ page.number + after_pages]
+
+ if set(begin) & set(end): # [1, 2, 3], [...], [2, 3, 4]
+ begin = sorted(set(begin + end)) # [1, 2, 3, 4]
+ middle, end = [], []
+ elif begin[-1] + 1 == end[0]: # [1, 2, 3], [...], [4, 5, 6]
+ begin += end # [1, 2, 3, 4, 5, 6]
+ middle, end = [], []
+ elif set(begin) & set(middle): # [1, 2, 3], [2, 3, 4], [...]
+ begin = sorted(set(begin + middle)) # [1, 2, 3, 4]
+ middle = []
+ elif begin[-1] + 1 == middle[0]: # [1, 2, 3], [4, 5, 6], [...]
+ begin += middle # [1, 2, 3, 4, 5, 6]
+ middle = []
+ elif middle[-1] + 1 == end[0]: # [...], [15, 16, 17], [18, 19, 20]
+ end = middle + end # [15, 16, 17, 18, 19, 20]
+ middle = []
+ elif set(middle) & set(end): # [...], [17, 18, 19], [18, 19, 20]
+ end = sorted(set(middle + end)) # [17, 18, 19, 20]
+ middle = []
+
+ return {'template': template, 'page': page, 'GET_string': GET_string,
+ 'begin': begin, 'middle': middle, 'end': end}
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html', takes_context=True)
+def objectapp_breadcrumbs(context, separator='/', root_name='Objects',
+ template='objectapp/tags/breadcrumbs.html',):
+ """Return a breadcrumb for the application"""
+ path = context['request'].path
+ page_object = context.get('object') or context.get('Objecttype') or \
+ context.get('tag') or context.get('author')
+ breadcrumbs = retrieve_breadcrumbs(path, page_object, root_name)
+
+ return {'template': template,
+ 'separator': separator,
+ 'breadcrumbs': breadcrumbs}
+
+
+@register.simple_tag
+def get_gravatar(email, size=80, rating='g', default=None):
+ """Return url for a Gravatar"""
+ url = 'http://www.gravatar.com/avatar/%s.jpg' % \
+ md5(email.strip().lower()).hexdigest()
+ options = {'s': size, 'r': rating}
+ if default:
+ options['d'] = default
+
+ url = '%s?%s' % (url, urlencode(options))
+ return url.replace('&', '&amp;')
+
+
+class TagsNode(Node):
+ def __init__(self, context_var):
+ self.context_var = context_var
+
+ def render(self, context):
+ context[self.context_var] = tags_published()
+ return ''
+
+
+@register.tag
+def get_tags(parser, token):
+ """{% get_tags as var %}"""
+ bits = token.split_contents()
+
+ if len(bits) != 3:
+ raise TemplateSyntaxError(
+ 'get_tags tag takes exactly two arguments')
+ if bits[1] != 'as':
+ raise TemplateSyntaxError(
+ "first argument to get_tags tag must be 'as'")
+ return TagsNode(bits[2])
+
+
+@register.inclusion_tag('objectapp/tags/dummy.html')
+def get_tag_cloud(steps=6, template='objectapp/tags/tag_cloud.html'):
+ """Return a cloud of published tags"""
+ tags = Tag.objects.usage_for_queryset(
+ Gbobject.published.all(), counts=True)
+ return {'template': template,
+ 'tags': calculate_cloud(tags, steps)}
diff --git a/build/lib.linux-i686-2.6/objectapp/templatetags/zbreadcrumbs.py b/build/lib.linux-i686-2.6/objectapp/templatetags/zbreadcrumbs.py
new file mode 100644
index 0000000..3fc61df
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templatetags/zbreadcrumbs.py
@@ -0,0 +1,147 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Breadcrumb module for Objectapp templatetags"""
+import re
+from datetime import datetime
+
+from django.core.urlresolvers import reverse
+from django.utils.translation import ugettext as _
+
+
+class Crumb(object):
+ """Part of the Breadcrumbs"""
+ def __init__(self, name, url=None):
+ self.name = name
+ self.url = url
+
+
+def year_crumb(creation_date):
+ """Crumb for a year"""
+ year = creation_date.strftime('%Y')
+ return Crumb(year, reverse('objectapp_gbobject_archive_year',
+ args=[year]))
+
+
+def month_crumb(creation_date):
+ """Crumb for a month"""
+ year = creation_date.strftime('%Y')
+ month = creation_date.strftime('%m')
+ month_text = creation_date.strftime('%b').capitalize()
+ return Crumb(month_text, reverse('objectapp_gbobject_archive_month',
+ args=[year, month]))
+
+
+def day_crumb(creation_date):
+ """Crumb for a day"""
+ year = creation_date.strftime('%Y')
+ month = creation_date.strftime('%m')
+ day = creation_date.strftime('%d')
+ return Crumb(day, reverse('objectapp_gbobject_archive_day',
+ args=[year, month, day]))
+
+
+OBJECTAPP_ROOT_URL = lambda: reverse('objectapp_gbobject_archive_index')
+
+MODEL_BREADCRUMBS = {'Tag': lambda x: [Crumb(_('Tags'),
+ reverse('objectapp_tag_list')),
+ Crumb(x.name)],
+ 'Author': lambda x: [Crumb(_('Authors'),
+ reverse('objectapp_author_list')),
+ Crumb(x.username)],
+ 'Objecttype': lambda x: [Crumb(
+ _('Objecttypes'), reverse('objectapp_Objecttype_list'))] + \
+ [Crumb(anc.title, anc.get_absolute_url())
+ for anc in x.get_ancestors()] + [Crumb(x.title)],
+ 'Gbobject': lambda x: [year_crumb(x.creation_date),
+ month_crumb(x.creation_date),
+ day_crumb(x.creation_date),
+ Crumb(x.title)]}
+
+DATE_REGEXP = re.compile(
+ r'.*(?P<year>\d{4})/(?P<month>\d{2})?/(?P<day>\d{2})?.*')
+
+
+def retrieve_breadcrumbs(path, model_instance, root_name=''):
+ """Build a semi-hardcoded breadcrumbs
+ based of the model's url handled by Objectapp"""
+ breadcrumbs = []
+
+ if root_name:
+ breadcrumbs.append(Crumb(root_name, OBJECTAPP_ROOT_URL()))
+
+ if model_instance is not None:
+ key = model_instance.__class__.__name__
+ if key in MODEL_BREADCRUMBS:
+ breadcrumbs.extend(MODEL_BREADCRUMBS[key](model_instance))
+ return breadcrumbs
+
+ date_match = DATE_REGEXP.match(path)
+ if date_match:
+ date_dict = date_match.groupdict()
+ path_date = datetime(
+ int(date_dict['year']),
+ date_dict.get('month') is not None and \
+ int(date_dict.get('month')) or 1,
+ date_dict.get('day') is not None and \
+ int(date_dict.get('day')) or 1)
+
+ date_breadcrumbs = [year_crumb(path_date)]
+ if date_dict['month']:
+ date_breadcrumbs.append(month_crumb(path_date))
+ if date_dict['day']:
+ date_breadcrumbs.append(day_crumb(path_date))
+ breadcrumbs.extend(date_breadcrumbs)
+
+ return breadcrumbs
+
+ url_components = [comp for comp in
+ path.replace(OBJECTAPP_ROOT_URL(), '').split('/') if comp]
+ if len(url_components):
+ breadcrumbs.append(Crumb(_(url_components[-1].capitalize())))
+
+ return breadcrumbs
diff --git a/build/lib.linux-i686-2.6/objectapp/templatetags/zcalendar.py b/build/lib.linux-i686-2.6/objectapp/templatetags/zcalendar.py
new file mode 100644
index 0000000..24c087b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/templatetags/zcalendar.py
@@ -0,0 +1,109 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Calendar module for Objectapp templatetags"""
+from datetime import date
+from calendar import HTMLCalendar
+
+from django.utils.dates import MONTHS
+from django.utils.dates import WEEKDAYS_ABBR
+from django.utils.formats import get_format
+from django.core.urlresolvers import reverse
+
+from objectapp.models import Gbobject
+
+AMERICAN_TO_EUROPEAN_WEEK_DAYS = [6, 0, 1, 2, 3, 4, 5]
+
+
+class ObjectappCalendar(HTMLCalendar):
+ """Override of HTMLCalendar"""
+
+ def __init__(self):
+ """Retrieve and convert the localized first week day
+ at initialization"""
+ HTMLCalendar.__init__(self, AMERICAN_TO_EUROPEAN_WEEK_DAYS[
+ get_format('FIRST_DAY_OF_WEEK')])
+
+ def formatday(self, day, weekday):
+ """Return a day as a table cell with a link
+ if gbobjects are published this day"""
+ if day and day in self.day_gbobjects:
+ day_date = date(self.current_year, self.current_month, day)
+ archive_day_url = reverse('objectapp_gbobject_archive_day',
+ args=[day_date.strftime('%Y'),
+ day_date.strftime('%m'),
+ day_date.strftime('%d')])
+ return '<td class="%s gbobject"><a href="%s" '\
+ 'rel="archives">%d</a></td>' % (
+ self.cssclasses[weekday], archive_day_url, day)
+
+ return super(ObjectappCalendar, self).formatday(day, weekday)
+
+ def formatmonth(self, theyear, themonth, withyear=True):
+ """Return a formatted month as a table with
+ new attributes computed for formatting a day"""
+ self.current_year = theyear
+ self.current_month = themonth
+ self.day_gbobjects = [gbobjects.creation_date.day for gbobjects in
+ Gbobject.published.filter(
+ creation_date__year=theyear,
+ creation_date__month=themonth)]
+
+ return super(ObjectappCalendar, self).formatmonth(
+ theyear, themonth, withyear)
+
+ def formatweekday(self, day):
+ """Return a weekday name translated
+ as a table header."""
+ return '<th class="%s">%s</th>' % (self.cssclasses[day],
+ WEEKDAYS_ABBR[day].title())
+
+ def formatmonthname(self, theyear, themonth, withyear=True):
+ """Return a month name translated
+ as a table row."""
+ monthname = '%s %s' % (MONTHS[themonth].title(), theyear)
+ return '<tr><th colspan="7" class="month">%s</th></tr>' % monthname
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/__init__.py b/build/lib.linux-i686-2.6/objectapp/tests/__init__.py
new file mode 100644
index 0000000..7e8f4fc
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/__init__.py
@@ -0,0 +1,104 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Unit tests for Objectapp"""
+from unittest import TestSuite
+from unittest import TestLoader
+from django.conf import settings
+
+from objectapp.tests.gbobject import GbobjectTestCase # ~0.2s
+from objectapp.tests.gbobject import GbobjectHtmlContentTestCase # ~0.5s
+from objectapp.tests.gbobject import GbobjectGetBaseModelTestCase
+from objectapp.tests.signals import SignalsTestCase
+from objectapp.tests.Objecttype import ObjecttypeTestCase
+from objectapp.tests.admin import GbobjectAdminTestCase
+from objectapp.tests.admin import ObjecttypeAdminTestCase
+from objectapp.tests.managers import ManagersTestCase # ~1.2s
+from objectapp.tests.feeds import ObjectappFeedsTestCase # ~0.4s
+from objectapp.tests.views import ObjectappViewsTestCase # ~1.5s ouch...
+from objectapp.tests.views import ObjectappCustomDetailViews # ~0.3s
+from objectapp.tests.pingback import PingBackTestCase # ~0.3s
+from objectapp.tests.metaweblog import MetaWeblogTestCase # ~0.6s
+from objectapp.tests.comparison import ComparisonTestCase
+from objectapp.tests.quick_gbobject import QuickGbobjectTestCase # ~0.4s
+from objectapp.tests.sitemaps import ObjectappSitemapsTestCase # ~0.3s
+from objectapp.tests.ping import DirectoryPingerTestCase
+from objectapp.tests.ping import ExternalUrlsPingerTestCase
+from objectapp.tests.templatetags import TemplateTagsTestCase # ~0.4s
+from objectapp.tests.moderator import GbobjectCommentModeratorTestCase # ~0.1s
+from objectapp.tests.spam_checker import SpamCheckerTestCase
+from objectapp.tests.url_shortener import URLShortenerTestCase
+from objectapp.signals import disconnect_objectapp_signals
+# TOTAL ~ 6.6s
+
+
+def suite():
+ """Suite of TestCases for Django"""
+ suite = TestSuite()
+ loader = TestLoader()
+
+ test_cases = (ManagersTestCase, GbobjectTestCase,
+ GbobjectGetBaseModelTestCase, SignalsTestCase,
+ GbobjectHtmlContentTestCase, ObjecttypeTestCase,
+ ObjectappViewsTestCase, ObjectappFeedsTestCase,
+ ObjectappSitemapsTestCase, ComparisonTestCase,
+ DirectoryPingerTestCase, ExternalUrlsPingerTestCase,
+ TemplateTagsTestCase, QuickGbobjectTestCase,
+ URLShortenerTestCase, GbobjectCommentModeratorTestCase,
+ ObjectappCustomDetailViews, SpamCheckerTestCase,
+ GbobjectAdminTestCase, ObjecttypeAdminTestCase)
+
+ if 'django_xmlrpc' in settings.INSTALLED_APPS:
+ test_cases += (PingBackTestCase, MetaWeblogTestCase)
+
+ for test_class in test_cases:
+ tests = loader.loadTestsFromTestCase(test_class)
+ suite.addTests(tests)
+
+ return suite
+
+disconnect_objectapp_signals()
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/admin.py b/build/lib.linux-i686-2.6/objectapp/tests/admin.py
new file mode 100644
index 0000000..7962698
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/admin.py
@@ -0,0 +1,133 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Objectapp's admin"""
+from django.test import TestCase
+from django.contrib.auth.models import User
+
+from objectapp import settings
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+
+
+class GbobjectAdminTestCase(TestCase):
+ """Test case for Gbobject Admin"""
+ urls = 'objectapp.tests.urls'
+
+ def setUp(self):
+ self.original_wysiwyg = settings.WYSIWYG
+ settings.WYSIWYG = None
+ User.objects.create_superuser('admin', 'admin@example.com', 'password')
+ Objecttype_1 = Objecttype.objects.create(title='Objecttype 1', slug='cat-1')
+ Objecttype.objects.create(title='Objecttype 2', slug='cat-2',
+ parent=Objecttype_1)
+
+ self.client.login(username='admin', password='password')
+
+ def tearDown(self):
+ settings.WYSIWYG = self.original_wysiwyg
+
+ def test_gbobject_add_and_change(self):
+ """Test the insertion of an Gbobject"""
+ self.assertEquals(Gbobject.objects.count(), 0)
+ post_data = {'title': u'New gbobject',
+ 'template': u'objectapp/gbobject_detail.html',
+ 'creation_date_0': u'2011-01-01',
+ 'creation_date_1': u'12:00:00',
+ 'start_publication_0': u'2011-01-01',
+ 'start_publication_1': u'12:00:00',
+ 'end_publication_0': u'2042-03-15',
+ 'end_publication_1': u'00:00:00',
+ 'status': u'2',
+ 'sites': u'1',
+ 'content': u'My content'}
+
+ response = self.client.post('/admin/objectapp/gbobject/add/', post_data)
+ self.assertEquals(response.status_code, 200)
+ self.assertEquals(Gbobject.objects.count(), 0)
+
+ post_data.update({'slug': u'new-gbobject'})
+ response = self.client.post('/admin/objectapp/gbobject/add/',
+ post_data, follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/admin/objectapp/gbobject/', 302)])
+ self.assertEquals(Gbobject.objects.count(), 1)
+
+
+class ObjecttypeAdminTestCase(TestCase):
+ """Test cases for Objecttype Admin"""
+ urls = 'objectapp.tests.urls'
+
+ def setUp(self):
+ User.objects.create_superuser('admin', 'admin@example.com', 'password')
+ self.client.login(username='admin', password='password')
+
+ def test_Objecttype_add_and_change(self):
+ """Test the insertion of a Objecttype, change error, and new insert"""
+ self.assertEquals(Objecttype.objects.count(), 0)
+ post_data = {'title': u'New Objecttype',
+ 'slug': u'new-Objecttype'}
+ response = self.client.post('/admin/objectapp/Objecttype/add/',
+ post_data, follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/admin/objectapp/Objecttype/', 302)])
+ self.assertEquals(Objecttype.objects.count(), 1)
+
+ post_data.update({'parent': u'1'})
+ response = self.client.post('/admin/objectapp/Objecttype/1/', post_data)
+ self.assertEquals(response.status_code, 200)
+
+ response = self.client.post('/admin/objectapp/Objecttype/add/', post_data)
+ self.assertEquals(response.status_code, 200)
+ self.assertEquals(Objecttype.objects.count(), 1)
+
+ post_data.update({'slug': u'new-Objecttype-2'})
+ response = self.client.post('/admin/objectapp/Objecttype/add/',
+ post_data, follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/admin/objectapp/Objecttype/', 302)])
+ self.assertEquals(Objecttype.objects.count(), 2)
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/comparison.py b/build/lib.linux-i686-2.6/objectapp/tests/comparison.py
new file mode 100644
index 0000000..7f113be
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/comparison.py
@@ -0,0 +1,50 @@
+"""Test cases for Objectapp's comparison"""
+from django.test import TestCase
+
+from objectapp.models import Gbobject
+from objectapp.comparison import pearson_score
+from objectapp.comparison import VectorBuilder
+from objectapp.comparison import ClusteredModel
+
+
+class ComparisonTestCase(TestCase):
+ """Test cases for comparison tools"""
+
+ def test_pearson_score(self):
+ self.assertEquals(pearson_score([42], [42]), 0.0)
+ self.assertEquals(pearson_score([0, 1, 2], [0, 1, 2]), 0.0)
+ self.assertEquals(pearson_score([0, 1, 3], [0, 1, 2]),
+ 0.051316701949486232)
+ self.assertEquals(pearson_score([0, 1, 2], [0, 1, 3]),
+ 0.051316701949486232)
+
+ def test_clustered_model(self):
+ params = {'title': 'My gbobject 1', 'content': 'My content 1',
+ 'tags': 'objectapp, test', 'slug': 'my-gbobject-1'}
+ Gbobject.objects.create(**params)
+ params = {'title': 'My gbobject 2', 'content': 'My content 2',
+ 'tags': 'objectapp, test', 'slug': 'my-gbobject-2'}
+ Gbobject.objects.create(**params)
+ cm = ClusteredModel(Gbobject.objects.all())
+ self.assertEquals(cm.dataset().values(), ['1', '2'])
+ cm = ClusteredModel(Gbobject.objects.all(),
+ ['title', 'excerpt', 'content'])
+ self.assertEquals(cm.dataset().values(), ['My gbobject 1 My content 1',
+ 'My gbobject 2 My content 2'])
+
+ def test_vector_builder(self):
+ vectors = VectorBuilder(Gbobject.objects.all(),
+ ['title', 'excerpt', 'content'])
+ params = {'title': 'My gbobject 1', 'content':
+ 'This is my first content',
+ 'tags': 'objectapp, test', 'slug': 'my-gbobject-1'}
+ Gbobject.objects.create(**params)
+ params = {'title': 'My gbobject 2', 'content':
+ 'My second gbobject',
+ 'tags': 'objectapp, test', 'slug': 'my-gbobject-2'}
+ Gbobject.objects.create(**params)
+ columns, dataset = vectors()
+ self.assertEquals(columns, ['content', 'This', 'my', 'is', '1',
+ 'second', '2', 'first'])
+ self.assertEquals(dataset.values(), [[1, 1, 1, 1, 1, 0, 0, 1],
+ [0, 0, 0, 0, 0, 1, 1, 0]])
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/custom_spam_checker.py b/build/lib.linux-i686-2.6/objectapp/tests/custom_spam_checker.py
new file mode 100644
index 0000000..16ccea4
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/custom_spam_checker.py
@@ -0,0 +1,10 @@
+"""Custom spam checker backend for testing Objectapp"""
+from django.core.exceptions import ImproperlyConfigured
+
+
+raise ImproperlyConfigured('This backend only exists for testing')
+
+
+def backend(gbobject):
+ """Custom spam checker backend for testing Objectapp"""
+ return False
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/custom_url_shortener.py b/build/lib.linux-i686-2.6/objectapp/tests/custom_url_shortener.py
new file mode 100644
index 0000000..7d0aecc
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/custom_url_shortener.py
@@ -0,0 +1,57 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Custom url shortener backend for testing Objectapp"""
+from django.core.exceptions import ImproperlyConfigured
+
+
+raise ImproperlyConfigured('This backend only exists for testing')
+
+
+def backend(gbobject):
+ """Custom url shortener backend for testing Objectapp"""
+ return ''
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/custom_views_detail_urls.py b/build/lib.linux-i686-2.6/objectapp/tests/custom_views_detail_urls.py
new file mode 100644
index 0000000..6ff0e48
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/custom_views_detail_urls.py
@@ -0,0 +1,91 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test urls for the objectapp project"""
+from functools import wraps
+
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+from objectapp.views.tags import tag_detail
+from objectapp.views.authors import author_detail
+from objectapp.views.objecttypes import Objecttype_detail
+from objectapp.tests.urls import urlpatterns as test_urlpatterns
+
+
+def call_with_template_and_extra_context(
+ view, template_name='objectapp/gbobject_list.html',
+ extra_context={'extra': 'context'}):
+
+ @wraps(view)
+ def wrapper(*args, **kwargs):
+ return view(template_name=template_name,
+ extra_context=extra_context,
+ *args, **kwargs)
+
+ return wrapper
+
+custom_tag_detail = call_with_template_and_extra_context(tag_detail)
+custom_author_detail = call_with_template_and_extra_context(author_detail)
+custom_Objecttype_detail = call_with_template_and_extra_context(Objecttype_detail)
+
+
+urlpatterns = patterns(
+ '',
+ url(r'^authors/(?P<username>[.+-@\w]+)/$',
+ custom_author_detail, name='objectapp_author_detail'),
+ url(r'^authors/(?P<username>[.+-@\w]+)/page/(?P<page>\d+)/$',
+ custom_author_detail, name='objectapp_author_detail_paginated'),
+ url(r'^objecttypes/(?P<path>[-\/\w]+)/page/(?P<page>\d+)/$',
+ custom_Objecttype_detail, name='objectapp_Objecttype_detail_paginated'),
+ url(r'^objecttypes/(?P<path>[-\/\w]+)/$',
+ custom_Objecttype_detail, name='objectapp_Objecttype_detail'),
+ url(r'^tags/(?P<tag>[- \w]+)/$',
+ custom_tag_detail, name='objectapp_tag_detail'),
+ url(r'^tags/(?P<tag>[- \w]+)/page/(?P<page>\d+)/$',
+ custom_tag_detail, name='objectapp_tag_detail_paginated'),
+ ) + test_urlpatterns
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/feeds.py b/build/lib.linux-i686-2.6/objectapp/tests/feeds.py
new file mode 100644
index 0000000..3223fe9
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/feeds.py
@@ -0,0 +1,343 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Objectapp's feeds"""
+from datetime import datetime
+
+from django.test import TestCase
+from django.conf import settings
+from django.contrib import comments
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.utils.translation import ugettext as _
+from django.utils.feedgenerator import Atom1Feed
+from django.utils.feedgenerator import DefaultFeed
+from django.core.exceptions import ObjectDoesNotExist
+from django.contrib.contenttypes.models import ContentType
+
+from tagging.models import Tag
+
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.managers import PUBLISHED
+from objectapp import feeds
+from objectapp.feeds import GbobjectFeed
+from objectapp.feeds import LatestGbobjects
+from objectapp.feeds import ObjecttypeGbobjects
+from objectapp.feeds import AuthorGbobjects
+from objectapp.feeds import TagGbobjects
+from objectapp.feeds import SearchGbobjects
+from objectapp.feeds import GbobjectDiscussions
+from objectapp.feeds import GbobjectComments
+from objectapp.feeds import GbobjectPingbacks
+from objectapp.feeds import GbobjectTrackbacks
+
+
+class ObjectappFeedsTestCase(TestCase):
+ """Test cases for the Feed classes provided"""
+ urls = 'objectapp.tests.urls'
+
+ def setUp(self):
+ self.site = Site.objects.get_current()
+ self.author = User.objects.create(username='admin',
+ email='admin@example.com')
+ self.Objecttype = Objecttype.objects.create(title='Tests', slug='tests')
+ self.gbobject_ct_id = ContentType.objects.get_for_model(Gbobject).pk
+
+ def create_published_gbobject(self):
+ params = {'title': 'My test gbobject',
+ 'content': 'My test content with image '
+ '<img src="/image.jpg" />',
+ 'slug': 'my-test-gbobject',
+ 'tags': 'tests',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ gbobject = Gbobject.objects.create(**params)
+ gbobject.sites.add(self.site)
+ gbobject.objecttypes.add(self.Objecttype)
+ gbobject.authors.add(self.author)
+ return gbobject
+
+ def create_discussions(self, gbobject):
+ comment = comments.get_model().objects.create(comment='My Comment',
+ user=self.author,
+ content_object=gbobject,
+ site=self.site)
+ pingback = comments.get_model().objects.create(comment='My Pingback',
+ user=self.author,
+ content_object=gbobject,
+ site=self.site)
+ pingback.flags.create(user=self.author, flag='pingback')
+ trackback = comments.get_model().objects.create(comment='My Trackback',
+ user=self.author,
+ content_object=gbobject,
+ site=self.site)
+ trackback.flags.create(user=self.author, flag='trackback')
+ return [comment, pingback, trackback]
+
+ def test_gbobject_feed(self):
+ original_feeds_format = feeds.FEEDS_FORMAT
+ feeds.FEEDS_FORMAT = ''
+ gbobject = self.create_published_gbobject()
+ feed = GbobjectFeed()
+ self.assertEquals(feed.item_pubdate(gbobject), gbobject.creation_date)
+ self.assertEquals(feed.item_objecttypes(gbobject), [self.Objecttype.title])
+ self.assertEquals(feed.item_author_name(gbobject), self.author.username)
+ self.assertEquals(feed.item_author_email(gbobject), self.author.email)
+ self.assertEquals(
+ feed.item_author_link(gbobject),
+ 'http://example.com/authors/%s/' % self.author.username)
+ # Test a NoReverseMatch for item_author_link
+ self.author.username = '[]'
+ self.author.save()
+ feed.item_author_name(gbobject)
+ self.assertEquals(feed.item_author_link(gbobject), 'http://example.com')
+ feeds.FEEDS_FORMAT = original_feeds_format
+
+ def test_gbobject_feed_enclosure(self):
+ original_feeds_format = feeds.FEEDS_FORMAT
+ feeds.FEEDS_FORMAT = ''
+ gbobject = self.create_published_gbobject()
+ feed = GbobjectFeed()
+ self.assertEquals(
+ feed.item_enclosure_url(gbobject), 'http://example.com/image.jpg')
+ gbobject.content = 'My test content with image <img src="image.jpg" />',
+ gbobject.save()
+ self.assertEquals(
+ feed.item_enclosure_url(gbobject), 'http://example.com/image.jpg')
+ gbobject.content = 'My test content with image ' \
+ '<img src="http://test.com/image.jpg" />'
+ gbobject.save()
+ self.assertEquals(
+ feed.item_enclosure_url(gbobject), 'http://test.com/image.jpg')
+ gbobject.image = 'image_field.jpg'
+ gbobject.save()
+ self.assertEquals(feed.item_enclosure_url(gbobject),
+ '%simage_field.jpg' % settings.MEDIA_URL)
+ self.assertEquals(feed.item_enclosure_length(gbobject), '100000')
+ self.assertEquals(feed.item_enclosure_mime_type(gbobject), 'image/jpeg')
+ feeds.FEEDS_FORMAT = original_feeds_format
+
+ def test_latest_gbobjects(self):
+ self.create_published_gbobject()
+ feed = LatestGbobjects()
+ self.assertEquals(feed.link(), '/')
+ self.assertEquals(len(feed.items()), 1)
+ self.assertEquals(feed.title(),
+ 'example.com - %s' % _('Latest gbobjects'))
+ self.assertEquals(
+ feed.description(),
+ _('The latest gbobjects for the site %s') % 'example.com')
+
+ def test_Objecttype_gbobjects(self):
+ self.create_published_gbobject()
+ feed = ObjecttypeGbobjects()
+ self.assertEquals(feed.get_object('request', '/tests/'), self.Objecttype)
+ self.assertEquals(len(feed.items(self.Objecttype)), 1)
+ self.assertEquals(feed.link(self.Objecttype), '/objecttypes/tests/')
+ self.assertEquals(
+ feed.title(self.Objecttype),
+ _('Gbobjects for the Objecttype %s') % self.Objecttype.title)
+ self.assertEquals(
+ feed.description(self.Objecttype),
+ _('The latest gbobjects for the Objecttype %s') % self.Objecttype.title)
+
+ def test_author_gbobjects(self):
+ self.create_published_gbobject()
+ feed = AuthorGbobjects()
+ self.assertEquals(feed.get_object('request', 'admin'), self.author)
+ self.assertEquals(len(feed.items(self.author)), 1)
+ self.assertEquals(feed.link(self.author), '/authors/admin/')
+ self.assertEquals(feed.title(self.author),
+ _('Gbobjects for author %s') % self.author.username)
+ self.assertEquals(feed.description(self.author),
+ _('The latest gbobjects by %s') % self.author.username)
+
+ def test_tag_gbobjects(self):
+ self.create_published_gbobject()
+ feed = TagGbobjects()
+ tag = Tag(name='tests')
+ self.assertEquals(feed.get_object('request', 'tests').name, 'tests')
+ self.assertEquals(len(feed.items('tests')), 1)
+ self.assertEquals(feed.link(tag), '/tags/tests/')
+ self.assertEquals(feed.title(tag),
+ _('Gbobjects for the tag %s') % tag.name)
+ self.assertEquals(feed.description(tag),
+ _('The latest gbobjects for the tag %s') % tag.name)
+
+ def test_search_gbobjects(self):
+ class FakeRequest:
+ def __init__(self, val):
+ self.GET = {'pattern': val}
+ self.create_published_gbobject()
+ feed = SearchGbobjects()
+ self.assertRaises(ObjectDoesNotExist,
+ feed.get_object, FakeRequest('te'))
+ self.assertEquals(feed.get_object(FakeRequest('test')), 'test')
+ self.assertEquals(len(feed.items('test')), 1)
+ self.assertEquals(feed.link('test'), '/search/?pattern=test')
+ self.assertEquals(feed.title('test'),
+ _("Results of the search for '%s'") % 'test')
+ self.assertEquals(
+ feed.description('test'),
+ _("The gbobjects containing the pattern '%s'") % 'test')
+
+ def test_gbobject_discussions(self):
+ gbobject = self.create_published_gbobject()
+ comments = self.create_discussions(gbobject)
+ feed = GbobjectDiscussions()
+ self.assertEquals(feed.get_object(
+ 'request', 2010, 1, 1, gbobject.slug), gbobject)
+ self.assertEquals(feed.link(gbobject), '/2010/01/01/my-test-gbobject/')
+ self.assertEquals(len(feed.items(gbobject)), 3)
+ self.assertEquals(feed.item_pubdate(comments[0]),
+ comments[0].submit_date)
+ self.assertEquals(feed.item_link(comments[0]),
+ '/comments/cr/%i/1/#c1' % self.gbobject_ct_id)
+ self.assertEquals(feed.item_author_name(comments[0]), 'admin')
+ self.assertEquals(feed.item_author_email(comments[0]),
+ 'admin@example.com')
+ self.assertEquals(feed.item_author_link(comments[0]), '')
+ self.assertEquals(feed.title(gbobject),
+ _('Discussions on %s') % gbobject.title)
+ self.assertEquals(
+ feed.description(gbobject),
+ _('The latest discussions for the gbobject %s') % gbobject.title)
+
+ def test_gbobject_comments(self):
+ gbobject = self.create_published_gbobject()
+ comments = self.create_discussions(gbobject)
+ feed = GbobjectComments()
+ self.assertEquals(list(feed.items(gbobject)), [comments[0]])
+ self.assertEquals(feed.item_link(comments[0]),
+ '/comments/cr/%i/1/#comment_1' % self.gbobject_ct_id)
+ self.assertEquals(feed.title(gbobject),
+ _('Comments on %s') % gbobject.title)
+ self.assertEquals(
+ feed.description(gbobject),
+ _('The latest comments for the gbobject %s') % gbobject.title)
+ self.assertEquals(
+ feed.item_enclosure_url(comments[0]),
+ 'http://www.gravatar.com/avatar/e64c7d89f26b'
+ 'd1972efa854d13d7dd61.jpg?s=80&amp;r=g')
+ self.assertEquals(feed.item_enclosure_length(gbobject), '100000')
+ self.assertEquals(feed.item_enclosure_mime_type(gbobject), 'image/jpeg')
+
+ def test_gbobject_pingbacks(self):
+ gbobject = self.create_published_gbobject()
+ comments = self.create_discussions(gbobject)
+ feed = GbobjectPingbacks()
+ self.assertEquals(list(feed.items(gbobject)), [comments[1]])
+ self.assertEquals(feed.item_link(comments[1]),
+ '/comments/cr/%i/1/#pingback_2' % self.gbobject_ct_id)
+ self.assertEquals(feed.title(gbobject),
+ _('Pingbacks on %s') % gbobject.title)
+ self.assertEquals(
+ feed.description(gbobject),
+ _('The latest pingbacks for the gbobject %s') % gbobject.title)
+
+ def test_gbobject_trackbacks(self):
+ gbobject = self.create_published_gbobject()
+ comments = self.create_discussions(gbobject)
+ feed = GbobjectTrackbacks()
+ self.assertEquals(list(feed.items(gbobject)), [comments[2]])
+ self.assertEquals(feed.item_link(comments[2]),
+ '/comments/cr/%i/1/#trackback_3' % self.gbobject_ct_id)
+ self.assertEquals(feed.title(gbobject),
+ _('Trackbacks on %s') % gbobject.title)
+ self.assertEquals(
+ feed.description(gbobject),
+ _('The latest trackbacks for the gbobject %s') % gbobject.title)
+
+ def test_gbobject_feed_no_authors(self):
+ original_feeds_format = feeds.FEEDS_FORMAT
+ feeds.FEEDS_FORMAT = ''
+ gbobject = self.create_published_gbobject()
+ gbobject.authors.clear()
+ feed = GbobjectFeed()
+ self.assertEquals(feed.item_author_name(gbobject), None)
+ feeds.FEEDS_FORMAT = original_feeds_format
+
+ def test_gbobject_feed_rss_or_atom(self):
+ original_feeds_format = feeds.FEEDS_FORMAT
+ feeds.FEEDS_FORMAT = ''
+ feed = LatestGbobjects()
+ self.assertEquals(feed.feed_type, DefaultFeed)
+ feeds.FEEDS_FORMAT = 'atom'
+ feed = LatestGbobjects()
+ self.assertEquals(feed.feed_type, Atom1Feed)
+ self.assertEquals(feed.subtitle, feed.description)
+ feeds.FEEDS_FORMAT = original_feeds_format
+
+ def test_discussion_feed_with_same_slugs(self):
+ """
+ https://github.com/Fantomas42/django-blog-objectapp/issues/104
+
+ OK, Here I will reproduce the original case: getting a discussion
+ type feed, with a same slug.
+
+ The correction of this case, will need some changes in the
+ get_object method.
+ """
+ gbobject = self.create_published_gbobject()
+
+ feed = GbobjectDiscussions()
+ self.assertEquals(feed.get_object(
+ 'request', 2010, 1, 1, gbobject.slug), gbobject)
+
+ params = {'title': 'My test gbobject, part II',
+ 'content': 'My content ',
+ 'slug': 'my-test-gbobject',
+ 'tags': 'tests',
+ 'creation_date': datetime(2010, 2, 1),
+ 'status': PUBLISHED}
+ gbobject_same_slug = Gbobject.objects.create(**params)
+ gbobject_same_slug.sites.add(self.site)
+ gbobject_same_slug.authors.add(self.author)
+
+ self.assertEquals(feed.get_object(
+ 'request', 2010, 2, 1, gbobject_same_slug.slug), gbobject_same_slug)
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/gbobject.py b/build/lib.linux-i686-2.6/objectapp/tests/gbobject.py
new file mode 100644
index 0000000..c5746bd
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/gbobject.py
@@ -0,0 +1,331 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Objectapp's Gbobject"""
+from __future__ import with_statement
+import warnings
+from datetime import datetime
+from datetime import timedelta
+
+from django.test import TestCase
+from django.conf import settings
+from django.contrib import comments
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+from django.contrib.comments.models import CommentFlag
+
+from objectapp import models
+from objectapp.models import Gbobject
+from objectapp.managers import PUBLISHED
+from objectapp.models import get_base_model
+from objectapp.models import GbobjectAbstractClass
+from objectapp import models as models_settings
+from objectapp import url_shortener as shortener_settings
+
+
+class GbobjectTestCase(TestCase):
+
+ def setUp(self):
+ params = {'title': 'My gbobject',
+ 'content': 'My content',
+ 'slug': 'my-gbobject'}
+ self.gbobject = Gbobject.objects.create(**params)
+
+ def test_discussions(self):
+ site = Site.objects.get_current()
+ self.assertEquals(self.gbobject.discussions.count(), 0)
+ self.assertEquals(self.gbobject.comments.count(), 0)
+ self.assertEquals(self.gbobject.pingbacks.count(), 0)
+ self.assertEquals(self.gbobject.trackbacks.count(), 0)
+
+ comments.get_model().objects.create(comment='My Comment 1',
+ content_object=self.gbobject,
+ site=site)
+ self.assertEquals(self.gbobject.discussions.count(), 1)
+ self.assertEquals(self.gbobject.comments.count(), 1)
+ self.assertEquals(self.gbobject.pingbacks.count(), 0)
+ self.assertEquals(self.gbobject.trackbacks.count(), 0)
+
+ comments.get_model().objects.create(comment='My Comment 2',
+ content_object=self.gbobject,
+ site=site, is_public=False)
+ self.assertEquals(self.gbobject.discussions.count(), 1)
+ self.assertEquals(self.gbobject.comments.count(), 1)
+ self.assertEquals(self.gbobject.pingbacks.count(), 0)
+ self.assertEquals(self.gbobject.trackbacks.count(), 0)
+
+ author = User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+
+ comment = comments.get_model().objects.create(
+ comment='My Comment 3',
+ content_object=self.gbobject,
+ site=Site.objects.create(domain='http://toto.com',
+ name='Toto.com'))
+ comment.flags.create(user=author, flag=CommentFlag.MODERATOR_APPROVAL)
+ self.assertEquals(self.gbobject.discussions.count(), 2)
+ self.assertEquals(self.gbobject.comments.count(), 2)
+ self.assertEquals(self.gbobject.pingbacks.count(), 0)
+ self.assertEquals(self.gbobject.trackbacks.count(), 0)
+
+ comment = comments.get_model().objects.create(
+ comment='My Pingback 1', content_object=self.gbobject, site=site)
+ comment.flags.create(user=author, flag='pingback')
+ self.assertEquals(self.gbobject.discussions.count(), 3)
+ self.assertEquals(self.gbobject.comments.count(), 2)
+ self.assertEquals(self.gbobject.pingbacks.count(), 1)
+ self.assertEquals(self.gbobject.trackbacks.count(), 0)
+
+ comment = comments.get_model().objects.create(
+ comment='My Trackback 1', content_object=self.gbobject, site=site)
+ comment.flags.create(user=author, flag='trackback')
+ self.assertEquals(self.gbobject.discussions.count(), 4)
+ self.assertEquals(self.gbobject.comments.count(), 2)
+ self.assertEquals(self.gbobject.pingbacks.count(), 1)
+ self.assertEquals(self.gbobject.trackbacks.count(), 1)
+
+ def test_str(self):
+ self.assertEquals(str(self.gbobject), 'My gbobject: draft')
+
+ def test_word_count(self):
+ self.assertEquals(self.gbobject.word_count, 2)
+
+ def test_comments_are_open(self):
+ original_auto_close = models.AUTO_CLOSE_COMMENTS_AFTER
+ models.AUTO_CLOSE_COMMENTS_AFTER = None
+ self.assertEquals(self.gbobject.comments_are_open, True)
+ models.AUTO_CLOSE_COMMENTS_AFTER = 5
+ self.gbobject.start_publication = datetime.now() - timedelta(days=7)
+ self.gbobject.save()
+ self.assertEquals(self.gbobject.comments_are_open, False)
+
+ models.AUTO_CLOSE_COMMENTS_AFTER = original_auto_close
+
+ def test_is_actual(self):
+ self.assertTrue(self.gbobject.is_actual)
+ self.gbobject.start_publication = datetime(2020, 3, 15)
+ self.assertFalse(self.gbobject.is_actual)
+ self.gbobject.start_publication = datetime.now()
+ self.assertTrue(self.gbobject.is_actual)
+ self.gbobject.end_publication = datetime(2000, 3, 15)
+ self.assertFalse(self.gbobject.is_actual)
+
+ def test_is_visible(self):
+ self.assertFalse(self.gbobject.is_visible)
+ self.gbobject.status = PUBLISHED
+ self.assertTrue(self.gbobject.is_visible)
+ self.gbobject.start_publication = datetime(2020, 3, 15)
+ self.assertFalse(self.gbobject.is_visible)
+
+ def test_short_url(self):
+ original_shortener = shortener_settings.URL_SHORTENER_BACKEND
+ shortener_settings.URL_SHORTENER_BACKEND = 'objectapp.url_shortener.'\
+ 'backends.default'
+ self.assertEquals(self.gbobject.short_url,
+ 'http://example.com' +
+ reverse('objectapp_gbobject_shortlink',
+ args=[self.gbobject.pk]))
+ shortener_settings.URL_SHORTENER_BACKEND = original_shortener
+
+ def test_previous_gbobject(self):
+ site = Site.objects.get_current()
+ self.assertFalse(self.gbobject.previous_gbobject)
+ params = {'title': 'My second gbobject',
+ 'content': 'My second content',
+ 'slug': 'my-second-gbobject',
+ 'creation_date': datetime(2000, 1, 1),
+ 'status': PUBLISHED}
+ self.second_gbobject = Gbobject.objects.create(**params)
+ self.second_gbobject.sites.add(site)
+ self.assertEquals(self.gbobject.previous_gbobject, self.second_gbobject)
+ params = {'title': 'My third gbobject',
+ 'content': 'My third content',
+ 'slug': 'my-third-gbobject',
+ 'creation_date': datetime(2001, 1, 1),
+ 'status': PUBLISHED}
+ self.third_gbobject = Gbobject.objects.create(**params)
+ self.third_gbobject.sites.add(site)
+ self.assertEquals(self.gbobject.previous_gbobject, self.third_gbobject)
+ self.assertEquals(self.third_gbobject.previous_gbobject, self.second_gbobject)
+
+ def test_next_gbobject(self):
+ site = Site.objects.get_current()
+ self.assertFalse(self.gbobject.next_gbobject)
+ params = {'title': 'My second gbobject',
+ 'content': 'My second content',
+ 'slug': 'my-second-gbobject',
+ 'creation_date': datetime(2100, 1, 1),
+ 'status': PUBLISHED}
+ self.second_gbobject = Gbobject.objects.create(**params)
+ self.second_gbobject.sites.add(site)
+ self.assertEquals(self.gbobject.next_gbobject, self.second_gbobject)
+ params = {'title': 'My third gbobject',
+ 'content': 'My third content',
+ 'slug': 'my-third-gbobject',
+ 'creation_date': datetime(2050, 1, 1),
+ 'status': PUBLISHED}
+ self.third_gbobject = Gbobject.objects.create(**params)
+ self.third_gbobject.sites.add(site)
+ self.assertEquals(self.gbobject.next_gbobject, self.third_gbobject)
+ self.assertEquals(self.third_gbobject.next_gbobject, self.second_gbobject)
+
+ def test_related_published(self):
+ site = Site.objects.get_current()
+ self.assertFalse(self.gbobject.related_published)
+ params = {'title': 'My second gbobject',
+ 'content': 'My second content',
+ 'slug': 'my-second-gbobject',
+ 'status': PUBLISHED}
+ self.second_gbobject = Gbobject.objects.create(**params)
+ self.second_gbobject.related.add(self.gbobject)
+ self.assertEquals(len(self.gbobject.related_published), 0)
+
+ self.second_gbobject.sites.add(site)
+ self.assertEquals(len(self.gbobject.related_published), 1)
+ self.assertEquals(len(self.second_gbobject.related_published), 0)
+
+ self.gbobject.status = PUBLISHED
+ self.gbobject.save()
+ self.gbobject.sites.add(site)
+ self.assertEquals(len(self.gbobject.related_published), 1)
+ self.assertEquals(len(self.second_gbobject.related_published), 1)
+
+
+class GbobjectHtmlContentTestCase(TestCase):
+
+ def setUp(self):
+ params = {'title': 'My gbobject',
+ 'content': 'My content',
+ 'slug': 'my-gbobject'}
+ self.gbobject = Gbobject(**params)
+ self.original_debug = settings.DEBUG
+ self.original_rendering = models_settings.MARKUP_LANGUAGE
+ settings.DEBUG = False
+
+ def tearDown(self):
+ settings.DEBUG = self.original_debug
+ models_settings.MARKUP_LANGUAGE = self.original_rendering
+
+ def test_html_content_default(self):
+ models_settings.MARKUP_LANGUAGE = None
+ self.assertEquals(self.gbobject.html_content, '<p>My content</p>')
+
+ self.gbobject.content = 'Hello world !\n' \
+ ' this is my content'
+ self.assertEquals(self.gbobject.html_content,
+ '<p>Hello world !<br /> this is my content</p>')
+
+ def test_html_content_textitle(self):
+ models_settings.MARKUP_LANGUAGE = 'textile'
+ self.gbobject.content = 'Hello world !\n\n' \
+ 'this is my content :\n\n' \
+ '* Item 1\n* Item 2'
+ html_content = self.gbobject.html_content
+ try:
+ self.assertEquals(html_content,
+ '\t<p>Hello world !</p>\n\n\t' \
+ '<p>this is my content :</p>\n\n\t' \
+ '<ul>\n\t\t<li>Item 1</li>\n\t\t' \
+ '<li>Item 2</li>\n\t</ul>')
+ except AssertionError:
+ self.assertEquals(html_content, self.gbobject.content)
+
+ def test_html_content_markdown(self):
+ models_settings.MARKUP_LANGUAGE = 'markdown'
+ self.gbobject.content = 'Hello world !\n\n' \
+ 'this is my content :\n\n' \
+ '* Item 1\n* Item 2'
+ html_content = self.gbobject.html_content
+ try:
+ self.assertEquals(html_content,
+ '<p>Hello world !</p>\n' \
+ '<p>this is my content :</p>'\
+ '\n<ul>\n<li>Item 1</li>\n' \
+ '<li>Item 2</li>\n</ul>')
+ except AssertionError:
+ self.assertEquals(html_content, self.gbobject.content)
+
+ def test_html_content_restructuredtext(self):
+ models_settings.MARKUP_LANGUAGE = 'restructuredtext'
+ self.gbobject.content = 'Hello world !\n\n' \
+ 'this is my content :\n\n' \
+ '* Item 1\n* Item 2'
+ html_content = self.gbobject.html_content
+ try:
+ self.assertEquals(html_content,
+ '<p>Hello world !</p>\n' \
+ '<p>this is my content :</p>'\
+ '\n<ul class="simple">\n<li>Item 1</li>\n' \
+ '<li>Item 2</li>\n</ul>\n')
+ except AssertionError:
+ self.assertEquals(html_content, self.gbobject.content)
+
+
+class GbobjectGetBaseModelTestCase(TestCase):
+
+ def setUp(self):
+ self.original_gbobject_base_model = models_settings.GBOBJECT_BASE_MODEL
+
+ def tearDown(self):
+ models_settings.GBOBJECT_BASE_MODEL = self.original_gbobject_base_model
+
+ def test_get_base_model(self):
+ models_settings.GBOBJECT_BASE_MODEL = ''
+ self.assertEquals(get_base_model(), GbobjectAbstractClass)
+
+ models_settings.GBOBJECT_BASE_MODEL = 'mymodule.myclass'
+ try:
+ with warnings.catch_warnings(record=True) as w:
+ self.assertEquals(get_base_model(), GbobjectAbstractClass)
+ self.assertTrue(issubclass(w[-1].Objecttype, RuntimeWarning))
+ except AttributeError:
+ # Fail under Python2.5, because of'warnings.catch_warnings'
+ pass
+
+ models_settings.GBOBJECT_BASE_MODEL = 'objectapp.models.GbobjectAbstractClass'
+ self.assertEquals(get_base_model(), GbobjectAbstractClass)
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/managers.py b/build/lib.linux-i686-2.6/objectapp/tests/managers.py
new file mode 100644
index 0000000..abc6aa5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/managers.py
@@ -0,0 +1,296 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Objectapp's managers"""
+from datetime import datetime
+
+from django.test import TestCase
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+
+from tagging.models import Tag
+
+from objectapp.models import Gbobject
+from objectapp.models import Author
+from objectapp.models import Objecttype
+from objectapp.managers import PUBLISHED
+from objectapp.managers import tags_published
+from objectapp.managers import gbobjects_published
+
+
+class ManagersTestCase(TestCase):
+
+ def setUp(self):
+ self.sites = [
+ Site.objects.get_current(),
+ Site.objects.create(domain='http://domain.com',
+ name='Domain.com')]
+ self.authors = [
+ User.objects.create_user(username='webmaster',
+ email='webmaster@example.com'),
+ User.objects.create_user(username='contributor',
+ email='contributor@example.com')]
+ self.objecttypes = [
+ Objecttype.objects.create(title='Objecttype 1',
+ slug='Objecttype-1'),
+ Objecttype.objects.create(title='Objecttype 2',
+ slug='Objecttype-2')]
+
+ params = {'title': 'My gbobject 1', 'content': 'My content 1',
+ 'tags': 'objectapp, test', 'slug': 'my-gbobject-1',
+ 'status': PUBLISHED}
+ self.gbobject_1 = Gbobject.objects.create(**params)
+ self.gbobject_1.authors.add(self.authors[0])
+ self.gbobject_1.objecttypes.add(*self.objecttypes)
+ self.gbobject_1.sites.add(*self.sites)
+
+ params = {'title': 'My gbobject 2', 'content': 'My content 2',
+ 'tags': 'objectapp, test', 'slug': 'my-gbobject-2'}
+ self.gbobject_2 = Gbobject.objects.create(**params)
+ self.gbobject_2.authors.add(*self.authors)
+ self.gbobject_2.objecttypes.add(self.objecttypes[0])
+ self.gbobject_2.sites.add(self.sites[0])
+
+ def test_tags_published(self):
+ self.assertEquals(tags_published().count(), Tag.objects.count())
+ Tag.objects.create(name='out')
+ self.assertNotEquals(tags_published().count(), Tag.objects.count())
+
+ def test_author_published_manager_get_query_set(self):
+ self.assertEquals(Author.published.count(), 1)
+ self.gbobject_2.status = PUBLISHED
+ self.gbobject_2.save()
+ self.assertEquals(Author.published.count(), 2)
+ self.gbobject_2.sites.remove(self.sites[0])
+ self.gbobject_2.sites.add(self.sites[1])
+ self.assertEquals(Author.published.count(), 1)
+
+ def test_gbobjects_published(self):
+ self.assertEquals(gbobjects_published(Gbobject.objects.all()).count(), 1)
+ self.gbobject_2.status = PUBLISHED
+ self.gbobject_2.save()
+ self.assertEquals(gbobjects_published(Gbobject.objects.all()).count(), 2)
+ self.gbobject_1.sites.clear()
+ self.assertEquals(gbobjects_published(Gbobject.objects.all()).count(), 1)
+ self.gbobject_1.sites.add(*self.sites)
+ self.gbobject_1.start_publication = datetime(2020, 1, 1)
+ self.gbobject_1.save()
+ self.assertEquals(gbobjects_published(Gbobject.objects.all()).count(), 1)
+ self.gbobject_1.start_publication = datetime(2000, 1, 1)
+ self.gbobject_1.save()
+ self.assertEquals(gbobjects_published(Gbobject.objects.all()).count(), 2)
+ self.gbobject_1.end_publication = datetime(2000, 1, 1)
+ self.gbobject_1.save()
+ self.assertEquals(gbobjects_published(Gbobject.objects.all()).count(), 1)
+ self.gbobject_1.end_publication = datetime(2020, 1, 1)
+ self.gbobject_1.save()
+ self.assertEquals(gbobjects_published(Gbobject.objects.all()).count(), 2)
+
+ def test_gbobject_published_manager_get_query_set(self):
+ self.assertEquals(Gbobject.published.count(), 1)
+ self.gbobject_2.status = PUBLISHED
+ self.gbobject_2.save()
+ self.assertEquals(Gbobject.published.count(), 2)
+ self.gbobject_1.sites.clear()
+ self.assertEquals(Gbobject.published.count(), 1)
+ self.gbobject_1.sites.add(*self.sites)
+ self.gbobject_1.start_publication = datetime(2020, 1, 1)
+ self.gbobject_1.save()
+ self.assertEquals(Gbobject.published.count(), 1)
+ self.gbobject_1.start_publication = datetime(2000, 1, 1)
+ self.gbobject_1.save()
+ self.assertEquals(Gbobject.published.count(), 2)
+ self.gbobject_1.end_publication = datetime(2000, 1, 1)
+ self.gbobject_1.save()
+ self.assertEquals(Gbobject.published.count(), 1)
+ self.gbobject_1.end_publication = datetime(2020, 1, 1)
+ self.gbobject_1.save()
+ self.assertEquals(Gbobject.published.count(), 2)
+
+ def test_gbobject_published_manager_on_site(self):
+ self.assertEquals(Gbobject.published.on_site().count(), 2)
+ self.gbobject_2.sites.clear()
+ self.gbobject_2.sites.add(self.sites[1])
+ self.assertEquals(Gbobject.published.on_site().count(), 1)
+ self.gbobject_1.sites.clear()
+ self.assertEquals(Gbobject.published.on_site().count(), 0)
+
+ def test_gbobject_published_manager_basic_search(self):
+ self.assertEquals(Gbobject.published.basic_search('My ').count(), 1)
+ self.gbobject_2.status = PUBLISHED
+ self.gbobject_2.save()
+ self.assertEquals(Gbobject.published.basic_search('My ').count(), 2)
+ self.assertEquals(Gbobject.published.basic_search('1').count(), 1)
+ self.assertEquals(Gbobject.published.basic_search('content 1').count(), 2)
+
+ def test_gbobject_published_manager_advanced_search(self):
+ Objecttype = Objecttype.objects.create(
+ title='SimpleObjecttype', slug='simple')
+ self.gbobject_2.objecttypes.add(Objecttype)
+ self.gbobject_2.tags = self.gbobject_2.tags + ', custom'
+ self.gbobject_2.status = PUBLISHED
+ self.gbobject_2.save()
+ self.assertEquals(
+ Gbobject.published.advanced_search('content').count(), 2)
+ search = Gbobject.published.advanced_search('content 1')
+ self.assertEquals(search.count(), 1)
+ self.assertEquals(search.all()[0], self.gbobject_1)
+ self.assertEquals(
+ Gbobject.published.advanced_search('content 1 or 2').count(), 2)
+ self.assertEquals(
+ Gbobject.published.advanced_search('content 1 and 2').count(), 0)
+ self.assertEquals(
+ Gbobject.published.advanced_search('content 1 2').count(), 0)
+ self.assertEquals(
+ Gbobject.published.advanced_search('"My content" 1 or 2').count(), 2)
+ self.assertEquals(
+ Gbobject.published.advanced_search('-"My content" 2').count(), 0)
+ search = Gbobject.published.advanced_search('content -1')
+ self.assertEquals(search.count(), 1)
+ self.assertEquals(search.all()[0], self.gbobject_2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content Objecttype:SimpleObjecttype').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content Objecttype:simple').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content Objecttype:"Objecttype 1"').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content Objecttype:"Objecttype-1"').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content Objecttype:"Objecttype-2"').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content tag:objectapp').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content tag:custom').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content author:webmaster').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content author:contributor').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content author:webmaster tag:objectapp').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content author:webmaster tag:custom').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content 1 or 2 author:webmaster').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'content 1 or 2 author:webmaster').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ '(author:webmaster content) my').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ '(author:webmaster) or (author:contributor)').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ '(author:webmaster) (author:contributor)').count(), 0)
+ self.assertEquals(Gbobject.published.advanced_search(
+ '(author:webmaster content) 1').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ '(author:webmaster content) or 2').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ '(author:contributor content) or 1').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ '(author:contributor content) or 2').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ '(author:webmaster or ("hello world")) and 2').count(), 1)
+
+ # Complex queries
+ self.assertEquals(Gbobject.published.advanced_search(
+ '(author:admin and "content 1") or author:webmaster').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'author:admin and ("content 1" or author:webmaster)').count(), 0)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'author:admin and "content 1" or author:webmaster').count(), 0)
+ self.assertEquals(Gbobject.published.advanced_search(
+ '-(author:webmaster and "content 1")').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ '-(-author:webmaster and "content 1")').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'Objecttype:"Objecttype -1" or author:"web master"').count(), 0)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'Objecttype:"Objecttype-1" or author:"webmaster"').count(), 2)
+
+ # Wildcards
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'author:webm*').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'author:*bmas*').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'author:*master').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'author:*master Objecttype:*ory-2').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'author:*master or Objecttype:cate*').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'Objecttype:*ate*').count(), 2)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'author:"webmast*"').count(), 0)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'tag:"objectapp*"').count(), 0)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'tag:*inni*').count(), 2)
+
+ def test_gbobject_published_manager_advanced_search_with_punctuation(self):
+ self.gbobject_2.content = 'How are you today ? Fine thank you ! OK.'
+ self.gbobject_2.status = PUBLISHED
+ self.gbobject_2.save()
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'today ?').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ 'today or ! or .').count(), 1)
+ self.assertEquals(Gbobject.published.advanced_search(
+ '"you today ?"').count(), 1)
+
+ def test_gbobject_published_manager_search(self):
+ self.gbobject_2.content = self.gbobject_2.content + ' * '
+ self.gbobject_2.status = PUBLISHED
+ self.gbobject_2.save()
+ # Be sure that basic_search does not return
+ # the same results of advanced_search
+ self.assertNotEquals(
+ Gbobject.published.basic_search('content 1').count(),
+ Gbobject.published.advanced_search('content 1').count())
+ # Now check the fallback with the '*' pattern
+ # which will fails advanced search
+ self.assertEquals(Gbobject.published.search('*').count(), 1)
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/metaweblog.py b/build/lib.linux-i686-2.6/objectapp/tests/metaweblog.py
new file mode 100644
index 0000000..7ca0189
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/metaweblog.py
@@ -0,0 +1,343 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Objectapp's MetaWeblog API"""
+from xmlrpclib import Binary
+from xmlrpclib import Fault
+from xmlrpclib import ServerProxy
+from datetime import datetime
+from tempfile import TemporaryFile
+
+from django.test import TestCase
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.core.files.storage import default_storage
+
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.managers import DRAFT
+from objectapp.managers import PUBLISHED
+from objectapp.settings import UPLOAD_TO
+from objectapp.xmlrpc.metaweblog import authenticate
+from objectapp.xmlrpc.metaweblog import post_structure
+from objectapp.tests.utils import TestTransport
+
+
+class MetaWeblogTestCase(TestCase):
+ """Test cases for MetaWeblog"""
+ urls = 'objectapp.tests.urls'
+
+ def setUp(self):
+ # Create data
+ self.webmaster = User.objects.create_superuser(
+ username='webmaster',
+ email='webmaster@example.com',
+ password='password')
+ self.contributor = User.objects.create_user(
+ username='contributor',
+ email='contributor@example.com',
+ password='password')
+ self.site = Site.objects.get_current()
+ self.objecttypes = [
+ Objecttype.objects.create(title='Objecttype 1',
+ slug='Objecttype-1'),
+ Objecttype.objects.create(title='Objecttype 2',
+ slug='Objecttype-2')]
+ params = {'title': 'My gbobject 1', 'content': 'My content 1',
+ 'tags': 'objectapp, test', 'slug': 'my-gbobject-1',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ self.gbobject_1 = Gbobject.objects.create(**params)
+ self.gbobject_1.authors.add(self.webmaster)
+ self.gbobject_1.objecttypes.add(*self.objecttypes)
+ self.gbobject_1.sites.add(self.site)
+
+ params = {'title': 'My gbobject 2', 'content': 'My content 2',
+ 'creation_date': datetime(2010, 3, 15),
+ 'tags': 'objectapp, test', 'slug': 'my-gbobject-2'}
+ self.gbobject_2 = Gbobject.objects.create(**params)
+ self.gbobject_2.authors.add(self.webmaster)
+ self.gbobject_2.objecttypes.add(self.objecttypes[0])
+ self.gbobject_2.sites.add(self.site)
+ # Instanciating the server proxy
+ self.server = ServerProxy('http://localhost:8000/xmlrpc/',
+ transport=TestTransport())
+
+ def test_authenticate(self):
+ self.assertRaises(Fault, authenticate, 'badcontributor', 'badpassword')
+ self.assertRaises(Fault, authenticate, 'contributor', 'badpassword')
+ self.assertRaises(Fault, authenticate, 'contributor', 'password')
+ self.contributor.is_staff = True
+ self.contributor.save()
+ self.assertEquals(authenticate('contributor', 'password'),
+ self.contributor)
+ self.assertRaises(Fault, authenticate, 'contributor',
+ 'password', 'objectapp.change_gbobject')
+ self.assertEquals(authenticate('webmaster', 'password'),
+ self.webmaster)
+ self.assertEquals(authenticate('webmaster', 'password',
+ 'objectapp.change_gbobject'),
+ self.webmaster)
+
+ def test_get_users_blogs(self):
+ self.assertRaises(Fault, self.server.blogger.getUsersBlogs,
+ 'apikey', 'contributor', 'password')
+ self.assertEquals(self.server.blogger.getUsersBlogs(
+ 'apikey', 'webmaster', 'password'),
+ [{'url': 'http://example.com/',
+ 'blogid': 1,
+ 'blogName': 'example.com'}])
+
+ def test_get_user_info(self):
+ self.assertRaises(Fault, self.server.blogger.getUserInfo,
+ 'apikey', 'contributor', 'password')
+ self.webmaster.first_name = 'John'
+ self.webmaster.last_name = 'Doe'
+ self.webmaster.save()
+ self.assertEquals(self.server.blogger.getUserInfo(
+ 'apikey', 'webmaster', 'password'),
+ {'firstname': 'John', 'lastname': 'Doe',
+ 'url': 'http://example.com/authors/webmaster/',
+ 'userid': self.webmaster.pk,
+ 'nickname': 'webmaster',
+ 'email': 'webmaster@example.com'})
+
+ def test_get_authors(self):
+ self.assertRaises(Fault, self.server.wp.getAuthors,
+ 'apikey', 'contributor', 'password')
+ self.assertEquals(self.server.wp.getAuthors(
+ 'apikey', 'webmaster', 'password'), [
+ {'user_login': 'webmaster',
+ 'user_id': self.webmaster.pk,
+ 'user_email': 'webmaster@example.com',
+ 'display_name': 'webmaster'}])
+
+ def test_get_objecttypes(self):
+ self.assertRaises(Fault, self.server.metaWeblog.getObjecttypes,
+ 1, 'contributor', 'password')
+ self.assertEquals(
+ self.server.metaWeblog.getObjecttypes('apikey',
+ 'webmaster', 'password'),
+ [{'rssUrl': 'http://example.com/feeds/objecttypes/Objecttype-1/',
+ 'description': 'Objecttype 1',
+ 'htmlUrl': 'http://example.com/objecttypes/Objecttype-1/',
+ 'ObjecttypeId': 1, 'parentId': 0,
+ 'ObjecttypeName': 'Objecttype 1',
+ 'ObjecttypeDescription': ''},
+ {'rssUrl': 'http://example.com/feeds/objecttypes/Objecttype-2/',
+ 'description': 'Objecttype 2',
+ 'htmlUrl': 'http://example.com/objecttypes/Objecttype-2/',
+ 'ObjecttypeId': 2, 'parentId': 0,
+ 'ObjecttypeName': 'Objecttype 2',
+ 'ObjecttypeDescription': ''}])
+ self.objecttypes[1].parent = self.objecttypes[0]
+ self.objecttypes[1].description = 'Objecttype 2 description'
+ self.objecttypes[1].save()
+ self.assertEquals(
+ self.server.metaWeblog.getObjecttypes('apikey',
+ 'webmaster', 'password'),
+ [{'rssUrl': 'http://example.com/feeds/objecttypes/Objecttype-1/',
+ 'description': 'Objecttype 1',
+ 'htmlUrl': 'http://example.com/objecttypes/Objecttype-1/',
+ 'ObjecttypeId': 1, 'parentId': 0,
+ 'ObjecttypeName': 'Objecttype 1',
+ 'ObjecttypeDescription': ''},
+ {'rssUrl':
+ 'http://example.com/feeds/objecttypes/Objecttype-1/Objecttype-2/',
+ 'description': 'Objecttype 2',
+ 'htmlUrl':
+ 'http://example.com/objecttypes/Objecttype-1/Objecttype-2/',
+ 'ObjecttypeId': 2, 'parentId': 1,
+ 'ObjecttypeName': 'Objecttype 2',
+ 'ObjecttypeDescription': 'Objecttype 2 description'}])
+
+ def test_new_Objecttype(self):
+ Objecttype_struct = {'name': 'Objecttype 3', 'slug': 'Objecttype-3',
+ 'description': 'Objecttype 3 description',
+ 'parent_id': self.objecttypes[0].pk}
+ self.assertRaises(Fault, self.server.wp.newObjecttype,
+ 1, 'contributor', 'password', Objecttype_struct)
+ self.assertEquals(Objecttype.objects.count(), 2)
+ new_Objecttype_id = self.server.wp.newObjecttype(
+ 1, 'webmaster', 'password', Objecttype_struct)
+ self.assertEquals(Objecttype.objects.count(), 3)
+ Objecttype = Objecttype.objects.get(pk=new_Objecttype_id)
+ self.assertEquals(Objecttype.title, 'Objecttype 3')
+ self.assertEquals(Objecttype.description, 'Objecttype 3 description')
+ self.assertEquals(Objecttype.slug, 'Objecttype-3')
+ self.assertEquals(Objecttype.parent.pk, 1)
+
+ def test_get_recent_posts(self):
+ self.assertRaises(Fault, self.server.metaWeblog.getRecentPosts,
+ 1, 'contributor', 'password', 10)
+ self.assertEquals(len(self.server.metaWeblog.getRecentPosts(
+ 1, 'webmaster', 'password', 10)), 2)
+
+ def test_delete_post(self):
+ self.assertRaises(Fault, self.server.blogger.deletePost,
+ 'apikey', 1, 'contributor', 'password', 'publish')
+ self.assertEquals(Gbobject.objects.count(), 2)
+ self.assertTrue(
+ self.server.blogger.deletePost(
+ 'apikey', self.gbobject_1.pk, 'webmaster', 'password', 'publish'))
+ self.assertEquals(Gbobject.objects.count(), 1)
+
+ def test_get_post(self):
+ self.assertRaises(Fault, self.server.metaWeblog.getPost,
+ 1, 'contributor', 'password')
+ post = self.server.metaWeblog.getPost(
+ self.gbobject_1.pk, 'webmaster', 'password')
+ self.assertEquals(post['title'], self.gbobject_1.title)
+ self.assertEquals(post['description'], '<p>My content 1</p>')
+ self.assertEquals(post['objecttypes'], ['Objecttype 1', 'Objecttype 2'])
+ self.assertEquals(post['dateCreated'].value, '2010-01-01T00:00:00')
+ self.assertEquals(post['link'],
+ 'http://example.com/2010/01/01/my-gbobject-1/')
+ self.assertEquals(post['permaLink'],
+ 'http://example.com/2010/01/01/my-gbobject-1/')
+ self.assertEquals(post['postid'], self.gbobject_1.pk)
+ self.assertEquals(post['userid'], 'webmaster')
+ self.assertEquals(post['mt_excerpt'], '')
+ self.assertEquals(post['mt_allow_comments'], 1)
+ self.assertEquals(post['mt_allow_pings'], 1)
+ self.assertEquals(post['mt_keywords'], self.gbobject_1.tags)
+ self.assertEquals(post['wp_author'], 'webmaster')
+ self.assertEquals(post['wp_author_id'], self.webmaster.pk)
+ self.assertEquals(post['wp_author_display_name'], 'webmaster')
+ self.assertEquals(post['wp_password'], '')
+ self.assertEquals(post['wp_slug'], self.gbobject_1.slug)
+
+ def test_new_post(self):
+ post = post_structure(self.gbobject_2, self.site)
+ self.assertRaises(Fault, self.server.metaWeblog.newPost,
+ 1, 'contributor', 'password', post, 1)
+ self.assertEquals(Gbobject.objects.count(), 2)
+ self.assertEquals(Gbobject.published.count(), 1)
+ self.server.metaWeblog.newPost(
+ 1, 'webmaster', 'password', post, 1)
+ self.assertEquals(Gbobject.objects.count(), 3)
+ self.assertEquals(Gbobject.published.count(), 2)
+ del post['dateCreated']
+ post['wp_author_id'] = self.contributor.pk
+ self.server.metaWeblog.newPost(
+ 1, 'webmaster', 'password', post, 0)
+ self.assertEquals(Gbobject.objects.count(), 4)
+ self.assertEquals(Gbobject.published.count(), 2)
+
+ def test_edit_post(self):
+ post = post_structure(self.gbobject_2, self.site)
+ self.assertRaises(Fault, self.server.metaWeblog.editPost,
+ 1, 'contributor', 'password', post, 1)
+ new_post_id = self.server.metaWeblog.newPost(
+ 1, 'webmaster', 'password', post, 0)
+
+ gbobject = Gbobject.objects.get(pk=new_post_id)
+ self.assertEquals(gbobject.title, self.gbobject_2.title)
+ self.assertEquals(gbobject.content, self.gbobject_2.html_content)
+ self.assertEquals(gbobject.excerpt, self.gbobject_2.excerpt)
+ self.assertEquals(gbobject.slug, self.gbobject_2.slug)
+ self.assertEquals(gbobject.status, DRAFT)
+ self.assertEquals(gbobject.password, self.gbobject_2.password)
+ self.assertEquals(gbobject.comment_enabled, True)
+ self.assertEquals(gbobject.pingback_enabled, True)
+ self.assertEquals(gbobject.objecttypes.count(), 1)
+ self.assertEquals(gbobject.authors.count(), 1)
+ self.assertEquals(gbobject.authors.all()[0], self.webmaster)
+ self.assertEquals(gbobject.creation_date, self.gbobject_2.creation_date)
+
+ gbobject.title = 'Title edited'
+ gbobject.creation_date = datetime(2000, 1, 1)
+ post = post_structure(gbobject, self.site)
+ post['objecttypes'] = ''
+ post['description'] = 'Content edited'
+ post['mt_excerpt'] = 'Content edited'
+ post['wp_slug'] = 'slug-edited'
+ post['wp_password'] = 'password'
+ post['mt_allow_comments'] = 2
+ post['mt_allow_pings'] = 0
+
+ response = self.server.metaWeblog.editPost(
+ new_post_id, 'webmaster', 'password', post, 1)
+ self.assertEquals(response, True)
+ gbobject = Gbobject.objects.get(pk=new_post_id)
+ self.assertEquals(gbobject.title, post['title'])
+ self.assertEquals(gbobject.content, post['description'])
+ self.assertEquals(gbobject.excerpt, post['mt_excerpt'])
+ self.assertEquals(gbobject.slug, 'slug-edited')
+ self.assertEquals(gbobject.status, PUBLISHED)
+ self.assertEquals(gbobject.password, 'password')
+ self.assertEquals(gbobject.comment_enabled, False)
+ self.assertEquals(gbobject.pingback_enabled, False)
+ self.assertEquals(gbobject.objecttypes.count(), 0)
+ self.assertEquals(gbobject.creation_date, datetime(2000, 1, 1))
+
+ del post['dateCreated']
+ post['wp_author_id'] = self.contributor.pk
+
+ response = self.server.metaWeblog.editPost(
+ new_post_id, 'webmaster', 'password', post, 1)
+ gbobject = Gbobject.objects.get(pk=new_post_id)
+ self.assertEquals(gbobject.authors.count(), 1)
+ self.assertEquals(gbobject.authors.all()[0], self.contributor)
+ self.assertEquals(gbobject.creation_date, datetime(2000, 1, 1))
+
+ def test_new_media_object(self):
+ file_ = TemporaryFile()
+ file_.write('My test content')
+ file_.seek(0)
+ media = {'name': 'objectapp_test_file.txt',
+ 'type': 'text/plain',
+ 'bits': Binary(file_.read())}
+ file_.close()
+
+ self.assertRaises(Fault, self.server.metaWeblog.newMediaObject,
+ 1, 'contributor', 'password', media)
+ new_media = self.server.metaWeblog.newMediaObject(
+ 1, 'webmaster', 'password', media)
+ self.assertTrue('/objectapp_test_file' in new_media['url'])
+ default_storage.delete('/'.join([
+ UPLOAD_TO, new_media['url'].split('/')[-1]]))
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/moderator.py b/build/lib.linux-i686-2.6/objectapp/tests/moderator.py
new file mode 100644
index 0000000..57dac52
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/moderator.py
@@ -0,0 +1,186 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Objectapp's moderator"""
+from django.core import mail
+from django.test import TestCase
+from django.contrib import comments
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.contrib.contenttypes.models import ContentType
+
+from objectapp.models import Gbobject
+from objectapp.managers import PUBLISHED
+from objectapp.moderator import GbobjectCommentModerator
+
+
+class GbobjectCommentModeratorTestCase(TestCase):
+ """Test cases for the moderator"""
+
+ def setUp(self):
+ self.site = Site.objects.get_current()
+ self.author = User.objects.create(username='admin',
+ email='admin@example.com')
+ self.gbobject_ct_id = ContentType.objects.get_for_model(Gbobject).pk
+
+ params = {'title': 'My test gbobject',
+ 'content': 'My test gbobject',
+ 'slug': 'my-test-gbobject',
+ 'status': PUBLISHED}
+ self.gbobject = Gbobject.objects.create(**params)
+ self.gbobject.sites.add(self.site)
+ self.gbobject.authors.add(self.author)
+
+ def test_email(self):
+ comment = comments.get_model().objects.create(
+ comment='My Comment', user=self.author, is_public=True,
+ content_object=self.gbobject, site=self.site)
+ self.assertEquals(len(mail.outbox), 0)
+ moderator = GbobjectCommentModerator(Gbobject)
+ moderator.email_reply = False
+ moderator.email_authors = False
+ moderator.mail_comment_notification_recipients = []
+ moderator.email(comment, self.gbobject, 'request')
+ self.assertEquals(len(mail.outbox), 0)
+ moderator.email_reply = True
+ moderator.email_authors = True
+ moderator.mail_comment_notification_recipients = ['admin@example.com']
+ moderator.email(comment, self.gbobject, 'request')
+ self.assertEquals(len(mail.outbox), 1)
+
+ def test_do_email_notification(self):
+ comment = comments.get_model().objects.create(
+ comment='My Comment', user=self.author, is_public=True,
+ content_object=self.gbobject, site=self.site)
+ self.assertEquals(len(mail.outbox), 0)
+ moderator = GbobjectCommentModerator(Gbobject)
+ moderator.mail_comment_notification_recipients = ['admin@example.com']
+ moderator.do_email_notification(comment, self.gbobject, 'request')
+ self.assertEquals(len(mail.outbox), 1)
+
+ def test_do_email_authors(self):
+ comment = comments.get_model().objects.create(
+ comment='My Comment', user=self.author, is_public=True,
+ content_object=self.gbobject, site=self.site)
+ self.assertEquals(len(mail.outbox), 0)
+ moderator = GbobjectCommentModerator(Gbobject)
+ moderator.email_authors = True
+ moderator.mail_comment_notification_recipients = ['admin@example.com']
+ moderator.do_email_authors(comment, self.gbobject, 'request')
+ self.assertEquals(len(mail.outbox), 0)
+ moderator.mail_comment_notification_recipients = []
+ moderator.do_email_authors(comment, self.gbobject, 'request')
+ self.assertEquals(len(mail.outbox), 1)
+
+ def test_do_email_reply(self):
+ comment = comments.get_model().objects.create(
+ comment='My Comment 1', user=self.author, is_public=True,
+ content_object=self.gbobject, site=self.site)
+ moderator = GbobjectCommentModerator(Gbobject)
+ moderator.email_notification_reply = True
+ moderator.mail_comment_notification_recipients = ['admin@example.com']
+ moderator.do_email_reply(comment, self.gbobject, 'request')
+ self.assertEquals(len(mail.outbox), 0)
+
+ comment = comments.get_model().objects.create(
+ comment='My Comment 2', user_email='user_1@example.com',
+ content_object=self.gbobject, is_public=True, site=self.site)
+ moderator.do_email_reply(comment, self.gbobject, 'request')
+ self.assertEquals(len(mail.outbox), 0)
+
+ comment = comments.get_model().objects.create(
+ comment='My Comment 3', user_email='user_2@example.com',
+ content_object=self.gbobject, is_public=True, site=self.site)
+ moderator.do_email_reply(comment, self.gbobject, 'request')
+ self.assertEquals(len(mail.outbox), 1)
+ self.assertEquals(mail.outbox[0].bcc, [u'user_1@example.com'])
+
+ comment = comments.get_model().objects.create(
+ comment='My Comment 4', user=self.author, is_public=True,
+ content_object=self.gbobject, site=self.site)
+ moderator.do_email_reply(comment, self.gbobject, 'request')
+ self.assertEquals(len(mail.outbox), 2)
+ self.assertEquals(mail.outbox[1].bcc, [u'user_1@example.com',
+ u'user_2@example.com'])
+
+ def test_moderate(self):
+ comment = comments.get_model().objects.create(
+ comment='My Comment', user=self.author, is_public=True,
+ content_object=self.gbobject, site=self.site)
+ moderator = GbobjectCommentModerator(Gbobject)
+ moderator.auto_moderate_comments = True
+ moderator.spam_checker_backends = ()
+ self.assertEquals(moderator.moderate(comment, self.gbobject, 'request'),
+ True)
+ moderator.auto_moderate_comments = False
+ self.assertEquals(moderator.moderate(comment, self.gbobject, 'request'),
+ False)
+ self.assertEquals(comments.get_model().objects.filter(
+ flags__flag='spam').count(), 0)
+ moderator.spam_checker_backends = (
+ 'objectapp.spam_checker.backends.all_is_spam',)
+ self.assertEquals(moderator.moderate(comment, self.gbobject, 'request'),
+ True)
+ self.assertEquals(comments.get_model().objects.filter(
+ flags__flag='spam').count(), 1)
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/objecttype.py b/build/lib.linux-i686-2.6/objectapp/tests/objecttype.py
new file mode 100644
index 0000000..73e8d45
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/objecttype.py
@@ -0,0 +1,116 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Objectapp's Objecttype"""
+from django.test import TestCase
+from django.contrib.sites.models import Site
+
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.managers import PUBLISHED
+
+
+class ObjecttypeTestCase(TestCase):
+
+ def setUp(self):
+ self.site = Site.objects.get_current()
+ self.objecttypes = [Objecttype.objects.create(title='Objecttype 1',
+ slug='Objecttype-1'),
+ Objecttype.objects.create(title='Objecttype 2',
+ slug='Objecttype-2')]
+ params = {'title': 'My gbobject',
+ 'content': 'My content',
+ 'tags': 'objectapp, test',
+ 'slug': 'my-gbobject'}
+
+ self.gbobject = Gbobject.objects.create(**params)
+ self.gbobject.objecttypes.add(*self.objecttypes)
+ self.gbobject.sites.add(self.site)
+
+ def test_gbobjects_published(self):
+ Objecttype = self.objecttypes[0]
+ self.assertEqual(Objecttype.gbobjects_published().count(), 0)
+ self.gbobject.status = PUBLISHED
+ self.gbobject.save()
+ self.assertEqual(Objecttype.gbobjects_published().count(), 1)
+
+ params = {'title': 'My second gbobject',
+ 'content': 'My second content',
+ 'tags': 'objectapp, test',
+ 'status': PUBLISHED,
+ 'slug': 'my-second-gbobject'}
+
+ new_gbobject = Gbobject.objects.create(**params)
+ new_gbobject.sites.add(self.site)
+ new_gbobject.objecttypes.add(self.objecttypes[0])
+
+ self.assertEqual(self.objecttypes[0].gbobjects_published().count(), 2)
+ self.assertEqual(self.objecttypes[1].gbobjects_published().count(), 1)
+
+ def test_gbobjects_tree_path(self):
+ self.assertEqual(self.objecttypes[0].tree_path, 'Objecttype-1')
+ self.assertEqual(self.objecttypes[1].tree_path, 'Objecttype-2')
+ self.objecttypes[1].parent = self.objecttypes[0]
+ self.objecttypes[1].save()
+ self.assertEqual(self.objecttypes[1].tree_path, 'Objecttype-1/Objecttype-2')
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/ping.py b/build/lib.linux-i686-2.6/objectapp/tests/ping.py
new file mode 100644
index 0000000..9bdcb17
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/ping.py
@@ -0,0 +1,187 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Objectapp's ping"""
+import cStringIO
+from urllib2 import URLError
+from urllib import addinfourl
+from django.test import TestCase
+
+from objectapp.models import Gbobject
+from objectapp.ping import URLRessources
+from objectapp.ping import DirectoryPinger
+from objectapp.ping import ExternalUrlsPinger
+
+
+class DirectoryPingerTestCase(TestCase):
+ """Test cases for DirectoryPinger"""
+ def setUp(self):
+ params = {'title': 'My gbobject',
+ 'content': 'My content',
+ 'tags': 'objectapp, test',
+ 'slug': 'my-gbobject'}
+ self.gbobject = Gbobject.objects.create(**params)
+ self.pinger = DirectoryPinger('http://localhost', [self.gbobject],
+ start_now=False)
+
+ def test_ping_gbobject(self):
+ self.assertEquals(
+ self.pinger.ping_gbobject(self.gbobject),
+ {'message': 'http://localhost is an invalid directory.',
+ 'flerror': True})
+
+
+class ExternalUrlsPingerTestCase(TestCase):
+ """Test cases for ExternalUrlsPinger"""
+
+ def setUp(self):
+ params = {'title': 'My gbobject',
+ 'content': 'My content',
+ 'tags': 'objectapp, test',
+ 'slug': 'my-gbobject'}
+ self.gbobject = Gbobject.objects.create(**params)
+ self.pinger = ExternalUrlsPinger(self.gbobject, start_now=False)
+
+ def test_is_external_url(self):
+ r = URLRessources()
+ self.assertEquals(self.pinger.is_external_url(
+ 'http://example.com/', 'http://google.com/'), True)
+ self.assertEquals(self.pinger.is_external_url(
+ 'http://example.com/toto/', 'http://google.com/titi/'), True)
+ self.assertEquals(self.pinger.is_external_url(
+ 'http://example.com/blog/', 'http://example.com/page/'), False)
+ self.assertEquals(self.pinger.is_external_url(
+ '%s/blog/' % r.site_url, r.site_url), False)
+ self.assertEquals(self.pinger.is_external_url(
+ 'http://google.com/', r.site_url), True)
+ self.assertEquals(self.pinger.is_external_url(
+ '/blog/', r.site_url), False)
+
+ def test_find_external_urls(self):
+ r = URLRessources()
+ external_urls = self.pinger.find_external_urls(self.gbobject)
+ self.assertEquals(external_urls, [])
+ self.gbobject.content = """
+ <p>This is a <a href="http://fantomas.willbreak.it/">link</a>
+ to a site.</p>
+ <p>This is a <a href="%s/blog/">link</a> within my site.</p>
+ <p>This is a <a href="/blog/">relative link</a> within my site.</p>
+ """ % r.site_url
+ self.gbobject.save()
+ external_urls = self.pinger.find_external_urls(self.gbobject)
+ self.assertEquals(external_urls, ['http://fantomas.willbreak.it/'])
+
+ def test_find_pingback_href(self):
+ result = self.pinger.find_pingback_href('')
+ self.assertEquals(result, None)
+ result = self.pinger.find_pingback_href("""
+ <html><head><link rel="pingback" href="/xmlrpc/" /></head>
+ <body></body></html>
+ """)
+ self.assertEquals(result, '/xmlrpc/')
+ result = self.pinger.find_pingback_href("""
+ <html><head><LINK hrEF="/xmlrpc/" REL="PingBack" /></head>
+ <body></body></html>
+ """)
+ self.assertEquals(result, '/xmlrpc/')
+ result = self.pinger.find_pingback_href("""
+ <html><head><LINK REL="PingBack" /></head><body></body></html>
+ """)
+ self.assertEquals(result, None)
+
+ def fake_urlopen(self, url):
+ """Fake urlopen using test client"""
+ if 'example' in url:
+ response = cStringIO.StringIO('')
+ return addinfourl(response, {'X-Pingback': '/xmlrpc.php',
+ 'Content-Type': 'text/html'}, url)
+ elif 'localhost' in url:
+ response = cStringIO.StringIO(
+ '<link rel="pingback" href="/xmlrpc/">')
+ return addinfourl(response, {'Content-Type': 'text/xhtml'}, url)
+ elif 'google' in url:
+ response = cStringIO.StringIO('PNG CONTENT')
+ return addinfourl(response, {'content-type': 'image/png'}, url)
+ elif 'error' in url:
+ raise URLError('Invalid ressource')
+
+ def test_find_pingback_urls(self):
+ # Set up a stub around urlopen
+ import objectapp.ping
+ self.original_urlopen = objectapp.ping.urlopen
+ objectapp.ping.urlopen = self.fake_urlopen
+
+ urls = ['http://localhost/', 'http://example.com/', 'http://error',
+ 'http://www.google.co.uk/images/nav_logo72.png']
+ self.assertEquals(
+ self.pinger.find_pingback_urls(urls),
+ {'http://localhost/': 'http://localhost/xmlrpc/',
+ 'http://example.com/': 'http://example.com/xmlrpc.php'})
+ # Remove stub
+ objectapp.ping.urlopen = self.original_urlopen
+
+ def test_pingback_url(self):
+ self.assertEquals(self.pinger.pingback_url('http://localhost',
+ 'http://error.com'),
+ 'http://error.com cannot be pinged.')
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/pingback.py b/build/lib.linux-i686-2.6/objectapp/tests/pingback.py
new file mode 100644
index 0000000..d003b27
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/pingback.py
@@ -0,0 +1,253 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Objectapp's PingBack API"""
+import cStringIO
+from datetime import datetime
+from urlparse import urlsplit
+from urllib2 import HTTPError
+from xmlrpclib import ServerProxy
+
+from django.test import TestCase
+from django.contrib import comments
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.contrib.contenttypes.models import ContentType
+
+from BeautifulSoup import BeautifulSoup
+
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.managers import PUBLISHED
+from objectapp.tests.utils import TestTransport
+from objectapp.xmlrpc.pingback import generate_pingback_content
+from objectapp import url_shortener as shortener_settings
+
+
+class PingBackTestCase(TestCase):
+ """Test cases for pingbacks"""
+ urls = 'objectapp.tests.urls'
+
+ def fake_urlopen(self, url):
+ """Fake urlopen using client if domain
+ correspond to current_site else HTTPError"""
+ scheme, netloc, path, query, fragment = urlsplit(url)
+ if not netloc:
+ raise
+ if self.site.domain == netloc:
+ response = cStringIO.StringIO(self.client.get(url).content)
+ return response
+ raise HTTPError(url, 404, 'unavailable url', {}, None)
+
+ def setUp(self):
+ # Use default URL shortener backend, to avoid networks errors
+ self.original_shortener = shortener_settings.URL_SHORTENER_BACKEND
+ shortener_settings.URL_SHORTENER_BACKEND = 'objectapp.url_shortener.'\
+ 'backends.default'
+ # Set up a stub around urlopen
+ import objectapp.xmlrpc.pingback
+ self.original_urlopen = objectapp.xmlrpc.pingback.urlopen
+ objectapp.xmlrpc.pingback.urlopen = self.fake_urlopen
+ # Preparing site
+ self.site = Site.objects.get_current()
+ self.site.domain = 'localhost:8000'
+ self.site.save()
+ # Creating tests gbobjects
+ self.author = User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+ self.Objecttype = Objecttype.objects.create(title='test', slug='test')
+ params = {'title': 'My first gbobject',
+ 'content': 'My first content',
+ 'slug': 'my-first-gbobject',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ self.first_gbobject = Gbobject.objects.create(**params)
+ self.first_gbobject.sites.add(self.site)
+ self.first_gbobject.objecttypes.add(self.Objecttype)
+ self.first_gbobject.authors.add(self.author)
+
+ params = {'title': 'My second gbobject',
+ 'content': 'My second content with link '
+ 'to <a href="http://%s%s">first gbobject</a>'
+ ' and other links : %s %s.' % (
+ self.site.domain,
+ self.first_gbobject.get_absolute_url(),
+ 'http://localhost:8000/error-404/',
+ 'http://example.com/'),
+ 'slug': 'my-second-gbobject',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ self.second_gbobject = Gbobject.objects.create(**params)
+ self.second_gbobject.sites.add(self.site)
+ self.second_gbobject.objecttypes.add(self.Objecttype)
+ self.second_gbobject.authors.add(self.author)
+ # Instanciating the server proxy
+ self.server = ServerProxy('http://localhost:8000/xmlrpc/',
+ transport=TestTransport())
+
+ def tearDown(self):
+ import objectapp.xmlrpc.pingback
+ objectapp.xmlrpc.pingback.urlopen = self.original_urlopen
+ shortener_settings.URL_SHORTENER_BACKEND = self.original_shortener
+
+ def test_generate_pingback_content(self):
+ soup = BeautifulSoup(self.second_gbobject.content)
+ target = 'http://%s%s' % (self.site.domain,
+ self.first_gbobject.get_absolute_url())
+
+ self.assertEquals(
+ generate_pingback_content(soup, target, 1000),
+ 'My second content with link to first gbobject and other links : '
+ 'http://localhost:8000/error-404/ http://example.com/.')
+ self.assertEquals(
+ generate_pingback_content(soup, target, 50),
+ '...ond content with link to first gbobject and other lin...')
+
+ soup = BeautifulSoup('<a href="%s">test link</a>' % target)
+ self.assertEquals(
+ generate_pingback_content(soup, target, 6), 'test l...')
+
+ soup = BeautifulSoup('test <a href="%s">link</a>' % target)
+ self.assertEquals(
+ generate_pingback_content(soup, target, 8), '...est link')
+ self.assertEquals(
+ generate_pingback_content(soup, target, 9), 'test link')
+
+ def test_pingback_ping(self):
+ target = 'http://%s%s' % (
+ self.site.domain, self.first_gbobject.get_absolute_url())
+ source = 'http://%s%s' % (
+ self.site.domain, self.second_gbobject.get_absolute_url())
+
+ # Error code 0 : A generic fault code
+ response = self.server.pingback.ping('toto', 'titi')
+ self.assertEquals(response, 0)
+ response = self.server.pingback.ping('http://%s/' % self.site.domain,
+ 'http://%s/' % self.site.domain)
+ self.assertEquals(response, 0)
+
+ # Error code 16 : The source URI does not exist.
+ response = self.server.pingback.ping('http://example.com/', target)
+ self.assertEquals(response, 16)
+
+ # Error code 17 : The source URI does not contain a link to
+ # the target URI and so cannot be used as a source.
+ response = self.server.pingback.ping(source, 'toto')
+ self.assertEquals(response, 17)
+
+ # Error code 32 : The target URI does not exist.
+ response = self.server.pingback.ping(
+ source, 'http://localhost:8000/error-404/')
+ self.assertEquals(response, 32)
+ response = self.server.pingback.ping(source, 'http://example.com/')
+ self.assertEquals(response, 32)
+
+ # Error code 33 : The target URI cannot be used as a target.
+ response = self.server.pingback.ping(source, 'http://localhost:8000/')
+ self.assertEquals(response, 33)
+ self.first_gbobject.pingback_enabled = False
+ self.first_gbobject.save()
+ response = self.server.pingback.ping(source, target)
+ self.assertEquals(response, 33)
+
+ # Validate pingback
+ self.assertEquals(self.first_gbobject.comments.count(), 0)
+ self.first_gbobject.pingback_enabled = True
+ self.first_gbobject.save()
+ response = self.server.pingback.ping(source, target)
+ self.assertEquals(
+ response,
+ 'Pingback from %s to %s registered.' % (source, target))
+ self.assertEquals(self.first_gbobject.pingbacks.count(), 1)
+ self.assertTrue(self.second_gbobject.title in \
+ self.first_gbobject.pingbacks[0].user_name)
+
+ # Error code 48 : The pingback has already been registered.
+ response = self.server.pingback.ping(source, target)
+ self.assertEquals(response, 48)
+
+ def test_pingback_extensions_get_pingbacks(self):
+ target = 'http://%s%s' % (
+ self.site.domain, self.first_gbobject.get_absolute_url())
+ source = 'http://%s%s' % (
+ self.site.domain, self.second_gbobject.get_absolute_url())
+
+ response = self.server.pingback.ping(source, target)
+ self.assertEquals(
+ response, 'Pingback from %s to %s registered.' % (source, target))
+
+ response = self.server.pingback.extensions.getPingbacks(
+ 'http://example.com/')
+ self.assertEquals(response, 32)
+
+ response = self.server.pingback.extensions.getPingbacks(
+ 'http://localhost:8000/error-404/')
+ self.assertEquals(response, 32)
+
+ response = self.server.pingback.extensions.getPingbacks(
+ 'http://localhost:8000/2010/')
+ self.assertEquals(response, 33)
+
+ response = self.server.pingback.extensions.getPingbacks(source)
+ self.assertEquals(response, [])
+
+ response = self.server.pingback.extensions.getPingbacks(target)
+ self.assertEquals(response, [
+ 'http://localhost:8000/2010/01/01/my-second-gbobject/'])
+
+ comment = comments.get_model().objects.create(
+ content_type=ContentType.objects.get_for_model(Gbobject),
+ object_pk=self.first_gbobject.pk,
+ site=self.site, comment='Test pingback',
+ user_url='http://example.com/blog/1/',
+ user_name='Test pingback')
+ comment.flags.create(user=self.author, flag='pingback')
+
+ response = self.server.pingback.extensions.getPingbacks(target)
+ self.assertEquals(response, [
+ 'http://localhost:8000/2010/01/01/my-second-gbobject/',
+ 'http://example.com/blog/1/'])
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/quick_gbobject.py b/build/lib.linux-i686-2.6/objectapp/tests/quick_gbobject.py
new file mode 100644
index 0000000..888ae8e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/quick_gbobject.py
@@ -0,0 +1,120 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Test cases for Objectapp's quick gbobject"""
+from django.test import TestCase
+from django.contrib.auth.models import User
+
+from objectapp import settings
+from objectapp.models import Gbobject
+from objectapp.managers import DRAFT
+
+
+class QuickGbobjectTestCase(TestCase):
+ """Test cases for quick_gbobject view"""
+ urls = 'objectapp.tests.urls'
+
+ def setUp(self):
+ self.original_wysiwyg = settings.WYSIWYG
+ settings.WYSIWYG = None
+
+ def tearDown(self):
+ settings.WYSIWYG = self.original_wysiwyg
+
+ def test_quick_gbobject(self):
+ User.objects.create_user('user', 'user@example.com', 'password')
+ User.objects.create_superuser('admin', 'admin@example.com', 'password')
+
+ response = self.client.get('/quick_gbobject/', follow=True)
+ self.assertEquals(
+ response.redirect_chain,
+ [('http://testserver/accounts/login/?next=/quick_gbobject/', 302)])
+ self.client.login(username='user', password='password')
+ response = self.client.get('/quick_gbobject/', follow=True)
+ self.assertEquals(
+ response.redirect_chain,
+ [('http://testserver/accounts/login/?next=/quick_gbobject/', 302)])
+ self.client.logout()
+ self.client.login(username='admin', password='password')
+ response = self.client.get('/quick_gbobject/', follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/admin/objectapp/gbobject/add/', 302)])
+ response = self.client.post('/quick_gbobject/', {'title': 'test'},
+ follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/admin/objectapp/gbobject/add/' \
+ '?tags=&title=test&sites=1&content=' \
+ '%3Cp%3E%3C%2Fp%3E&authors=2&slug=test', 302)])
+ response = self.client.post('/quick_gbobject/',
+ {'title': 'test', 'tags': 'test',
+ 'content': 'Test content',
+ 'save_draft': ''}, follow=True)
+ gbobject = Gbobject.objects.get(title='test')
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver%s' % gbobject.get_absolute_url(),
+ 302)])
+ self.assertEquals(gbobject.status, DRAFT)
+ self.assertEquals(gbobject.title, 'test')
+ self.assertEquals(gbobject.tags, 'test')
+ self.assertEquals(gbobject.content, '<p>Test content</p>')
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/signals.py b/build/lib.linux-i686-2.6/objectapp/tests/signals.py
new file mode 100644
index 0000000..c6f6b06
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/signals.py
@@ -0,0 +1,154 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Objectapp's signals"""
+from django.test import TestCase
+
+from objectapp.models import Gbobject
+from objectapp.managers import DRAFT
+from objectapp.managers import PUBLISHED
+from objectapp.signals import disable_for_loaddata
+from objectapp.signals import ping_directories_handler
+from objectapp.signals import ping_external_urls_handler
+
+
+class SignalsTestCase(TestCase):
+ """Test cases for signals"""
+
+ def test_disable_for_loaddata(self):
+ self.top = 0
+
+ @disable_for_loaddata
+ def make_top():
+ self.top += 1
+
+ def call():
+ return make_top()
+
+ call()
+ self.assertEquals(self.top, 1)
+ # Okay the command is executed
+
+ def test_ping_directories_handler(self):
+ # Set up a stub around DirectoryPinger
+ self.top = 0
+
+ def fake_pinger(*ka, **kw):
+ self.top += 1
+
+ import objectapp.ping
+ from objectapp import settings
+ self.original_pinger = objectapp.ping.DirectoryPinger
+ objectapp.ping.DirectoryPinger = fake_pinger
+
+ params = {'title': 'My gbobject',
+ 'content': 'My content',
+ 'status': PUBLISHED,
+ 'slug': 'my-gbobject'}
+ gbobject = Gbobject.objects.create(**params)
+ self.assertEquals(gbobject.is_visible, True)
+ settings.PING_DIRECTORIES = ()
+ ping_directories_handler('sender', **{'instance': gbobject})
+ self.assertEquals(self.top, 0)
+ settings.PING_DIRECTORIES = ('toto',)
+ settings.SAVE_PING_DIRECTORIES = True
+ ping_directories_handler('sender', **{'instance': gbobject})
+ self.assertEquals(self.top, 1)
+ gbobject.status = DRAFT
+ ping_directories_handler('sender', **{'instance': gbobject})
+ self.assertEquals(self.top, 1)
+
+ # Remove stub
+ objectapp.ping.DirectoryPinger = self.original_pinger
+
+ def test_ping_external_urls_handler(self):
+ # Set up a stub around ExternalUrlsPinger
+ self.top = 0
+
+ def fake_pinger(*ka, **kw):
+ self.top += 1
+
+ import objectapp.ping
+ from objectapp import settings
+ self.original_pinger = objectapp.ping.ExternalUrlsPinger
+ objectapp.ping.ExternalUrlsPinger = fake_pinger
+
+ params = {'title': 'My gbobject',
+ 'content': 'My content',
+ 'status': PUBLISHED,
+ 'slug': 'my-gbobject'}
+ gbobject = Gbobject.objects.create(**params)
+ self.assertEquals(gbobject.is_visible, True)
+ settings.SAVE_PING_EXTERNAL_URLS = False
+ ping_external_urls_handler('sender', **{'instance': gbobject})
+ self.assertEquals(self.top, 0)
+ settings.SAVE_PING_EXTERNAL_URLS = True
+ ping_external_urls_handler('sender', **{'instance': gbobject})
+ self.assertEquals(self.top, 1)
+ gbobject.status = 0
+ ping_external_urls_handler('sender', **{'instance': gbobject})
+ self.assertEquals(self.top, 1)
+
+ # Remove stub
+ objectapp.ping.ExternalUrlsPinger = self.original_pinger
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/sitemaps.py b/build/lib.linux-i686-2.6/objectapp/tests/sitemaps.py
new file mode 100644
index 0000000..e91a07c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/sitemaps.py
@@ -0,0 +1,145 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Objectapp's sitemaps"""
+from django.test import TestCase
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+
+from tagging.models import Tag
+
+from objectapp.models import Gbobject
+from objectapp.models import Author
+from objectapp.models import Objecttype
+from objectapp.managers import PUBLISHED
+from objectapp.sitemaps import GbobjectSitemap
+from objectapp.sitemaps import ObjecttypeSitemap
+from objectapp.sitemaps import AuthorSitemap
+from objectapp.sitemaps import TagSitemap
+
+
+class ObjectappSitemapsTestCase(TestCase):
+ """Test cases for Sitemaps classes provided"""
+ urls = 'objectapp.tests.urls'
+
+ def setUp(self):
+ self.site = Site.objects.get_current()
+ self.author = User.objects.create(username='admin',
+ email='admin@example.com')
+ self.Objecttype = Objecttype.objects.create(title='Tests', slug='tests')
+ params = {'title': 'My gbobject 1', 'content': 'My content 1',
+ 'tags': 'objectapp, test', 'slug': 'my-gbobject-1',
+ 'status': PUBLISHED}
+ self.gbobject_1 = Gbobject.objects.create(**params)
+ self.gbobject_1.authors.add(self.author)
+ self.gbobject_1.objecttypes.add(self.Objecttype)
+ self.gbobject_1.sites.add(self.site)
+
+ params = {'title': 'My gbobject 2', 'content': 'My content 2',
+ 'tags': 'objectapp', 'slug': 'my-gbobject-2',
+ 'status': PUBLISHED}
+ self.gbobject_2 = Gbobject.objects.create(**params)
+ self.gbobject_2.authors.add(self.author)
+ self.gbobject_2.objecttypes.add(self.Objecttype)
+ self.gbobject_2.sites.add(self.site)
+
+ def test_gbobject_sitemap(self):
+ sitemap = GbobjectSitemap()
+ self.assertEquals(len(sitemap.items()), 2)
+ self.assertEquals(sitemap.lastmod(self.gbobject_1),
+ self.gbobject_1.last_update)
+
+ def test_Objecttype_sitemap(self):
+ sitemap = ObjecttypeSitemap()
+ self.assertEquals(len(sitemap.items()), 1)
+ self.assertEquals(sitemap.lastmod(self.Objecttype),
+ self.gbobject_2.creation_date)
+ self.assertEquals(sitemap.lastmod(Objecttype.objects.create(
+ title='New', slug='new')), None)
+ self.assertEquals(sitemap.priority(self.Objecttype), '1.0')
+
+ def test_author_sitemap(self):
+ sitemap = AuthorSitemap()
+ authors = sitemap.items()
+ self.assertEquals(len(authors), 1)
+ self.assertEquals(sitemap.lastmod(authors[0]),
+ self.gbobject_2.creation_date)
+ self.assertEquals(sitemap.lastmod(Author.objects.create(
+ username='New', email='new@example.com')), None)
+ self.assertEquals(sitemap.location(self.author), '/authors/admin/')
+
+ def test_tag_sitemap(self):
+ sitemap = TagSitemap()
+ objectapp_tag = Tag.objects.get(name='objectapp')
+ self.assertEquals(len(sitemap.items()), 2)
+ self.assertEquals(sitemap.lastmod(objectapp_tag),
+ self.gbobject_2.creation_date)
+ self.assertEquals(sitemap.priority(objectapp_tag), '1.0')
+ self.assertEquals(sitemap.location(objectapp_tag), '/tags/objectapp/')
+
+ def test_Objecttype_sitemap_zero_division_error(self):
+ Gbobject.objects.all().delete()
+ Objecttype_sitemap = ObjecttypeSitemap()
+ Objecttype_sitemap.items()
+ self.assertEquals(Objecttype_sitemap.priority(self.Objecttype), '0.5')
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/spam_checker.py b/build/lib.linux-i686-2.6/objectapp/tests/spam_checker.py
new file mode 100644
index 0000000..9465255
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/spam_checker.py
@@ -0,0 +1,104 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Objectapp's spam_checker"""
+from __future__ import with_statement
+import warnings
+
+from django.test import TestCase
+
+from objectapp.spam_checker import get_spam_checker
+from objectapp.spam_checker.backends.all_is_spam import backend
+
+
+class SpamCheckerTestCase(TestCase):
+ """Test cases for objectapp.spam_checker"""
+
+ def test_get_spam_checker(self):
+ try:
+ with warnings.catch_warnings(record=True) as w:
+ self.assertEquals(get_spam_checker('mymodule.myclass'), None)
+ self.assertTrue(issubclass(w[-1].Objecttype, RuntimeWarning))
+ self.assertEquals(
+ str(w[-1].message),
+ 'mymodule.myclass backend cannot be imported')
+ except AttributeError:
+ # Fail under Python2.5, because of'warnings.catch_warnings'
+ pass
+
+ try:
+ with warnings.catch_warnings(record=True) as w:
+ self.assertEquals(
+ get_spam_checker('objectapp.tests.custom_spam_checker'), None)
+ self.assertTrue(issubclass(w[-1].Objecttype, RuntimeWarning))
+ self.assertEquals(
+ str(w[-1].message),
+ 'This backend only exists for testing')
+ except AttributeError:
+ # Fail under Python2.5, because of'warnings.catch_warnings'
+ pass
+
+ self.assertEquals(
+ get_spam_checker('objectapp.spam_checker.backends.all_is_spam'),
+ backend)
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/templatetags.py b/build/lib.linux-i686-2.6/objectapp/tests/templatetags.py
new file mode 100644
index 0000000..ab1c5d7
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/templatetags.py
@@ -0,0 +1,590 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Objectapp's templatetags"""
+from datetime import datetime
+
+from django.test import TestCase
+from django.template import Context
+from django.template import Template
+from django.template import TemplateSyntaxError
+from django.contrib import comments
+from django.core.paginator import Paginator
+from django.core.urlresolvers import reverse
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.contrib.comments.models import CommentFlag
+
+from tagging.models import Tag
+
+from objectapp.models import Gbobject
+from objectapp.models import Author
+from objectapp.models import Objecttype
+from objectapp.managers import DRAFT
+from objectapp.managers import PUBLISHED
+from objectapp.templatetags.objectapp_tags import get_authors
+from objectapp.templatetags.objectapp_tags import get_gravatar
+from objectapp.templatetags.objectapp_tags import get_tag_cloud
+from objectapp.templatetags.objectapp_tags import get_objecttypes
+from objectapp.templatetags.objectapp_tags import objectapp_pagination
+from objectapp.templatetags.objectapp_tags import get_recent_gbobjects
+from objectapp.templatetags.objectapp_tags import get_random_gbobjects
+from objectapp.templatetags.objectapp_tags import objectapp_breadcrumbs
+from objectapp.templatetags.objectapp_tags import get_popular_gbobjects
+from objectapp.templatetags.objectapp_tags import get_similar_gbobjects
+from objectapp.templatetags.objectapp_tags import get_recent_comments
+from objectapp.templatetags.objectapp_tags import get_recent_linkbacks
+from objectapp.templatetags.objectapp_tags import get_calendar_gbobjects
+from objectapp.templatetags.objectapp_tags import get_archives_gbobjects
+from objectapp.templatetags.objectapp_tags import get_featured_gbobjects
+from objectapp.templatetags.objectapp_tags import get_archives_gbobjects_tree
+
+
+class TemplateTagsTestCase(TestCase):
+ """Test cases for Template tags"""
+
+ def setUp(self):
+ params = {'title': 'My gbobject',
+ 'content': 'My content',
+ 'tags': 'objectapp, test',
+ 'creation_date': datetime(2010, 1, 1),
+ 'slug': 'my-gbobject'}
+ self.gbobject = Gbobject.objects.create(**params)
+
+ def publish_gbobject(self):
+ self.gbobject.status = PUBLISHED
+ self.gbobject.featured = True
+ self.gbobject.sites.add(Site.objects.get_current())
+ self.gbobject.save()
+
+ def test_get_objecttypes(self):
+ context = get_objecttypes()
+ self.assertEquals(len(context['objecttypes']), 0)
+ self.assertEquals(context['template'], 'objectapp/tags/objecttypes.html')
+
+ Objecttype.objects.create(title='Objecttype 1', slug='Objecttype-1')
+ context = get_objecttypes('custom_template.html')
+ self.assertEquals(len(context['objecttypes']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ def test_get_authors(self):
+ context = get_authors()
+ self.assertEquals(len(context['authors']), 0)
+ self.assertEquals(context['template'], 'objectapp/tags/authors.html')
+
+ user = User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+ self.gbobject.authors.add(user)
+ self.publish_gbobject()
+ context = get_authors('custom_template.html')
+ self.assertEquals(len(context['authors']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ def test_get_recent_gbobjects(self):
+ context = get_recent_gbobjects()
+ self.assertEquals(len(context['gbobjects']), 0)
+ self.assertEquals(context['template'],
+ 'objectapp/tags/recent_gbobjects.html')
+
+ self.publish_gbobject()
+ context = get_recent_gbobjects(3, 'custom_template.html')
+ self.assertEquals(len(context['gbobjects']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+ context = get_recent_gbobjects(0)
+ self.assertEquals(len(context['gbobjects']), 0)
+
+ def test_get_featured_gbobjects(self):
+ context = get_featured_gbobjects()
+ self.assertEquals(len(context['gbobjects']), 0)
+ self.assertEquals(context['template'],
+ 'objectapp/tags/featured_gbobjects.html')
+
+ self.publish_gbobject()
+ context = get_featured_gbobjects(3, 'custom_template.html')
+ self.assertEquals(len(context['gbobjects']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+ context = get_featured_gbobjects(0)
+ self.assertEquals(len(context['gbobjects']), 0)
+
+ def test_get_random_gbobjects(self):
+ context = get_random_gbobjects()
+ self.assertEquals(len(context['gbobjects']), 0)
+ self.assertEquals(context['template'],
+ 'objectapp/tags/random_gbobjects.html')
+
+ self.publish_gbobject()
+ context = get_random_gbobjects(3, 'custom_template.html')
+ self.assertEquals(len(context['gbobjects']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+ context = get_random_gbobjects(0)
+ self.assertEquals(len(context['gbobjects']), 0)
+
+ def test_get_popular_gbobjects(self):
+ context = get_popular_gbobjects()
+ self.assertEquals(len(context['gbobjects']), 0)
+ self.assertEquals(context['template'],
+ 'objectapp/tags/popular_gbobjects.html')
+
+ self.publish_gbobject()
+ context = get_popular_gbobjects(3, 'custom_template.html')
+ self.assertEquals(len(context['gbobjects']), 0)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ params = {'title': 'My second gbobject',
+ 'content': 'My second content',
+ 'tags': 'objectapp, test',
+ 'status': PUBLISHED,
+ 'slug': 'my-second-gbobject'}
+ site = Site.objects.get_current()
+ second_gbobject = Gbobject.objects.create(**params)
+ second_gbobject.sites.add(site)
+
+ comments.get_model().objects.create(comment='My Comment 1', site=site,
+ content_object=self.gbobject)
+ comments.get_model().objects.create(comment='My Comment 2', site=site,
+ content_object=self.gbobject)
+ comments.get_model().objects.create(comment='My Comment 3', site=site,
+ content_object=second_gbobject)
+ context = get_popular_gbobjects(3)
+ self.assertEquals(context['gbobjects'], [self.gbobject, second_gbobject])
+ self.gbobject.status = DRAFT
+ self.gbobject.save()
+ context = get_popular_gbobjects(3)
+ self.assertEquals(context['gbobjects'], [second_gbobject])
+
+ def test_get_similar_gbobjects(self):
+ self.publish_gbobject()
+ source_context = Context({'object': self.gbobject})
+ context = get_similar_gbobjects(source_context)
+ self.assertEquals(len(context['gbobjects']), 0)
+ self.assertEquals(context['template'],
+ 'objectapp/tags/similar_gbobjects.html')
+
+ params = {'title': 'My second gbobject',
+ 'content': 'This is the second gbobject of my tests.',
+ 'tags': 'objectapp, test',
+ 'status': PUBLISHED,
+ 'slug': 'my-second-gbobject'}
+ site = Site.objects.get_current()
+ second_gbobject = Gbobject.objects.create(**params)
+ second_gbobject.sites.add(site)
+
+ source_context = Context({'object': second_gbobject})
+ context = get_similar_gbobjects(source_context, 3,
+ 'custom_template.html',
+ flush=True)
+ self.assertEquals(len(context['gbobjects']), 1)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ def test_get_archives_gbobjects(self):
+ context = get_archives_gbobjects()
+ self.assertEquals(len(context['archives']), 0)
+ self.assertEquals(context['template'],
+ 'objectapp/tags/archives_gbobjects.html')
+
+ self.publish_gbobject()
+ params = {'title': 'My second gbobject',
+ 'content': 'My second content',
+ 'tags': 'objectapp, test',
+ 'status': PUBLISHED,
+ 'creation_date': datetime(2009, 1, 1),
+ 'slug': 'my-second-gbobject'}
+ site = Site.objects.get_current()
+ second_gbobject = Gbobject.objects.create(**params)
+ second_gbobject.sites.add(site)
+
+ context = get_archives_gbobjects('custom_template.html')
+ self.assertEquals(len(context['archives']), 2)
+ self.assertEquals(context['archives'][0], datetime(2010, 1, 1))
+ self.assertEquals(context['archives'][1], datetime(2009, 1, 1))
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ def test_get_archives_tree(self):
+ context = get_archives_gbobjects_tree()
+ self.assertEquals(len(context['archives']), 0)
+ self.assertEquals(context['template'],
+ 'objectapp/tags/archives_gbobjects_tree.html')
+
+ self.publish_gbobject()
+ params = {'title': 'My second gbobject',
+ 'content': 'My second content',
+ 'tags': 'objectapp, test',
+ 'status': PUBLISHED,
+ 'creation_date': datetime(2009, 1, 10),
+ 'slug': 'my-second-gbobject'}
+ site = Site.objects.get_current()
+ second_gbobject = Gbobject.objects.create(**params)
+ second_gbobject.sites.add(site)
+
+ context = get_archives_gbobjects_tree('custom_template.html')
+ self.assertEquals(len(context['archives']), 2)
+ self.assertEquals(context['archives'][0], datetime(2009, 1, 10))
+ self.assertEquals(context['archives'][1], datetime(2010, 1, 1))
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ def test_get_calendar_gbobjects(self):
+ source_context = Context()
+ context = get_calendar_gbobjects(source_context)
+ self.assertEquals(context['previous_month'], None)
+ self.assertEquals(context['next_month'], None)
+ self.assertEquals(context['template'], 'objectapp/tags/calendar.html')
+
+ self.publish_gbobject()
+ context = get_calendar_gbobjects(source_context,
+ template='custom_template.html')
+ self.assertEquals(context['previous_month'], datetime(2010, 1, 1))
+ self.assertEquals(context['next_month'], None)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ context = get_calendar_gbobjects(source_context, 2009, 1)
+ self.assertEquals(context['previous_month'], None)
+ self.assertEquals(context['next_month'], datetime(2010, 1, 1))
+
+ source_context = Context({'month': datetime(2009, 1, 1)})
+ context = get_calendar_gbobjects(source_context)
+ self.assertEquals(context['previous_month'], None)
+ self.assertEquals(context['next_month'], datetime(2010, 1, 1))
+
+ source_context = Context({'month': datetime(2010, 1, 1)})
+ context = get_calendar_gbobjects(source_context)
+ self.assertEquals(context['previous_month'], None)
+ self.assertEquals(context['next_month'], None)
+
+ params = {'title': 'My second gbobject',
+ 'content': 'My second content',
+ 'tags': 'objectapp, test',
+ 'status': PUBLISHED,
+ 'creation_date': datetime(2008, 1, 1),
+ 'slug': 'my-second-gbobject'}
+ site = Site.objects.get_current()
+ second_gbobject = Gbobject.objects.create(**params)
+ second_gbobject.sites.add(site)
+
+ source_context = Context()
+ context = get_calendar_gbobjects(source_context, 2009, 1)
+ self.assertEquals(context['previous_month'], datetime(2008, 1, 1))
+ self.assertEquals(context['next_month'], datetime(2010, 1, 1))
+ context = get_calendar_gbobjects(source_context)
+ self.assertEquals(context['previous_month'], datetime(2010, 1, 1))
+ self.assertEquals(context['next_month'], None)
+
+ def test_get_recent_comments(self):
+ site = Site.objects.get_current()
+ context = get_recent_comments()
+ self.assertEquals(len(context['comments']), 0)
+ self.assertEquals(context['template'],
+ 'objectapp/tags/recent_comments.html')
+
+ comment_1 = comments.get_model().objects.create(
+ comment='My Comment 1', site=site,
+ content_object=self.gbobject)
+ context = get_recent_comments(3, 'custom_template.html')
+ self.assertEquals(len(context['comments']), 0)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ self.publish_gbobject()
+ context = get_recent_comments()
+ self.assertEquals(len(context['comments']), 1)
+
+ author = User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+ comment_2 = comments.get_model().objects.create(
+ comment='My Comment 2', site=site,
+ content_object=self.gbobject)
+ comment_2.flags.create(user=author,
+ flag=CommentFlag.MODERATOR_APPROVAL)
+ context = get_recent_comments()
+ self.assertEquals(list(context['comments']), [comment_2, comment_1])
+
+ def test_get_recent_linkbacks(self):
+ user = User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+ site = Site.objects.get_current()
+ context = get_recent_linkbacks()
+ self.assertEquals(len(context['linkbacks']), 0)
+ self.assertEquals(context['template'],
+ 'objectapp/tags/recent_linkbacks.html')
+
+ linkback_1 = comments.get_model().objects.create(
+ comment='My Linkback 1', site=site,
+ content_object=self.gbobject)
+ linkback_1.flags.create(user=user, flag='pingback')
+ context = get_recent_linkbacks(3, 'custom_template.html')
+ self.assertEquals(len(context['linkbacks']), 0)
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ self.publish_gbobject()
+ context = get_recent_linkbacks()
+ self.assertEquals(len(context['linkbacks']), 1)
+
+ linkback_2 = comments.get_model().objects.create(
+ comment='My Linkback 2', site=site,
+ content_object=self.gbobject)
+ linkback_2.flags.create(user=user, flag='trackback')
+ context = get_recent_linkbacks()
+ self.assertEquals(list(context['linkbacks']), [linkback_2, linkback_1])
+
+ def test_objectapp_pagination(self):
+ class FakeRequest(object):
+ def __init__(self, get_dict):
+ self.GET = get_dict
+
+ source_context = Context({'request': FakeRequest(
+ {'page': '1', 'key': 'val'})})
+ paginator = Paginator(range(200), 10)
+
+ context = objectapp_pagination(source_context, paginator.page(1))
+ self.assertEquals(context['page'].number, 1)
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [18, 19, 20])
+ self.assertEquals(context['GET_string'], '&key=val')
+ self.assertEquals(context['template'], 'objectapp/tags/pagination.html')
+
+ source_context = Context({'request': FakeRequest({})})
+ context = objectapp_pagination(source_context, paginator.page(2))
+ self.assertEquals(context['page'].number, 2)
+ self.assertEquals(context['begin'], [1, 2, 3, 4])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [18, 19, 20])
+ self.assertEquals(context['GET_string'], '')
+
+ context = objectapp_pagination(source_context, paginator.page(3))
+ self.assertEquals(context['begin'], [1, 2, 3, 4, 5])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [18, 19, 20])
+
+ context = objectapp_pagination(source_context, paginator.page(6))
+ self.assertEquals(context['begin'], [1, 2, 3, 4, 5, 6, 7, 8])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [18, 19, 20])
+
+ context = objectapp_pagination(source_context, paginator.page(11))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [9, 10, 11, 12, 13])
+ self.assertEquals(context['end'], [18, 19, 20])
+
+ context = objectapp_pagination(source_context, paginator.page(15))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [13, 14, 15, 16, 17, 18, 19, 20])
+
+ context = objectapp_pagination(source_context, paginator.page(18))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [16, 17, 18, 19, 20])
+
+ context = objectapp_pagination(source_context, paginator.page(19))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [17, 18, 19, 20])
+
+ context = objectapp_pagination(source_context, paginator.page(20))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [18, 19, 20])
+
+ context = objectapp_pagination(source_context, paginator.page(10),
+ begin_pages=1, end_pages=3,
+ before_pages=4, after_pages=3,
+ template='custom_template.html')
+ self.assertEquals(context['begin'], [1])
+ self.assertEquals(context['middle'], [6, 7, 8, 9, 10, 11, 12, 13])
+ self.assertEquals(context['end'], [18, 19, 20])
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ paginator = Paginator(range(50), 10)
+ context = objectapp_pagination(source_context, paginator.page(1))
+ self.assertEquals(context['begin'], [1, 2, 3, 4, 5])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [])
+
+ paginator = Paginator(range(60), 10)
+ context = objectapp_pagination(source_context, paginator.page(1))
+ self.assertEquals(context['begin'], [1, 2, 3, 4, 5, 6])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [])
+
+ paginator = Paginator(range(70), 10)
+ context = objectapp_pagination(source_context, paginator.page(1))
+ self.assertEquals(context['begin'], [1, 2, 3])
+ self.assertEquals(context['middle'], [])
+ self.assertEquals(context['end'], [5, 6, 7])
+
+ def test_objectapp_breadcrumbs(self):
+ class FakeRequest(object):
+ def __init__(self, path):
+ self.path = path
+
+ source_context = Context({'request': FakeRequest('/')})
+ context = objectapp_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 1)
+ self.assertEquals(context['breadcrumbs'][0].name, 'Blog')
+ self.assertEquals(context['breadcrumbs'][0].url,
+ reverse('objectapp_gbobject_archive_index'))
+ self.assertEquals(context['separator'], '/')
+ self.assertEquals(context['template'], 'objectapp/tags/breadcrumbs.html')
+
+ context = objectapp_breadcrumbs(source_context,
+ '>', 'Weblog', 'custom_template.html')
+ self.assertEquals(len(context['breadcrumbs']), 1)
+ self.assertEquals(context['breadcrumbs'][0].name, 'Weblog')
+ self.assertEquals(context['separator'], '>')
+ self.assertEquals(context['template'], 'custom_template.html')
+
+ source_context = Context(
+ {'request': FakeRequest(self.gbobject.get_absolute_url()),
+ 'object': self.gbobject})
+ context = objectapp_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 5)
+
+ cat_1 = Objecttype.objects.create(title='Objecttype 1', slug='Objecttype-1')
+ source_context = Context(
+ {'request': FakeRequest(cat_1.get_absolute_url()),
+ 'object': cat_1})
+ context = objectapp_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 3)
+ cat_2 = Objecttype.objects.create(title='Objecttype 2', slug='Objecttype-2',
+ parent=cat_1)
+ source_context = Context(
+ {'request': FakeRequest(cat_2.get_absolute_url()),
+ 'object': cat_2})
+ context = objectapp_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 4)
+
+ tag = Tag.objects.get(name='test')
+ source_context = Context(
+ {'request': FakeRequest(reverse('objectapp_tag_detail',
+ args=['test'])),
+ 'object': tag})
+ context = objectapp_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 3)
+
+ User.objects.create_user(username='webmaster',
+ email='webmaster@example.com')
+ author = Author.objects.get(username='webmaster')
+ source_context = Context(
+ {'request': FakeRequest(author.get_absolute_url()),
+ 'object': author})
+ context = objectapp_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 3)
+
+ source_context = Context(
+ {'request': FakeRequest(reverse(
+ 'objectapp_gbobject_archive_year', args=[2011]))})
+ context = objectapp_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 2)
+
+ source_context = Context({'request': FakeRequest(reverse(
+ 'objectapp_gbobject_archive_month', args=[2011, '03']))})
+ context = objectapp_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 3)
+
+ source_context = Context({'request': FakeRequest(reverse(
+ 'objectapp_gbobject_archive_day', args=[2011, '03', 15]))})
+ context = objectapp_breadcrumbs(source_context)
+ self.assertEquals(len(context['breadcrumbs']), 4)
+ # More tests can be done here, for testing path and objects in context
+
+ def test_get_gravatar(self):
+ self.assertEquals(
+ get_gravatar('webmaster@example.com'),
+ 'http://www.gravatar.com/avatar/86d4fd4a22de452'
+ 'a9228298731a0b592.jpg?s=80&amp;r=g')
+ self.assertEquals(
+ get_gravatar(' WEBMASTER@example.com ', 15, 'x', '404'),
+ 'http://www.gravatar.com/avatar/86d4fd4a22de452'
+ 'a9228298731a0b592.jpg?s=15&amp;r=x&amp;d=404')
+
+ def test_get_tags(self):
+ Tag.objects.create(name='tag')
+ t = Template("""
+ {% load objectapp_tags %}
+ {% get_tags as gbobject_tags %}
+ {{ gbobject_tags|join:", " }}
+ """)
+ html = t.render(Context())
+ self.assertEquals(html.strip(), '')
+ self.publish_gbobject()
+ html = t.render(Context())
+ self.assertEquals(html.strip(), 'test, objectapp')
+
+ template_error_as = """
+ {% load objectapp_tags %}
+ {% get_tags a_s gbobject_tags %}"""
+ self.assertRaises(TemplateSyntaxError, Template, template_error_as)
+
+ template_error_args = """
+ {% load objectapp_tags %}
+ {% get_tags as gbobject tags %}"""
+ self.assertRaises(TemplateSyntaxError, Template, template_error_args)
+
+ def test_get_tag_cloud(self):
+ context = get_tag_cloud()
+ self.assertEquals(len(context['tags']), 0)
+ self.assertEquals(context['template'], 'objectapp/tags/tag_cloud.html')
+ self.publish_gbobject()
+ context = get_tag_cloud(6, 'custom_template.html')
+ self.assertEquals(len(context['tags']), 2)
+ self.assertEquals(context['template'], 'custom_template.html')
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/url_shortener.py b/build/lib.linux-i686-2.6/objectapp/tests/url_shortener.py
new file mode 100644
index 0000000..4a3719c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/url_shortener.py
@@ -0,0 +1,112 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Objectapp's url_shortener"""
+from __future__ import with_statement
+import warnings
+
+from django.test import TestCase
+
+from objectapp.url_shortener import get_url_shortener
+from objectapp import url_shortener as us_settings
+from objectapp.url_shortener.backends.default import backend as default_backend
+
+
+class URLShortenerTestCase(TestCase):
+ """Test cases for objectapp.url_shortener"""
+
+ def setUp(self):
+ self.original_backend = us_settings.URL_SHORTENER_BACKEND
+
+ def tearDown(self):
+ us_settings.URL_SHORTENER_BACKEND = self.original_backend
+
+ def test_get_url_shortener(self):
+ us_settings.URL_SHORTENER_BACKEND = 'mymodule.myclass'
+ try:
+ with warnings.catch_warnings(record=True) as w:
+ self.assertEquals(get_url_shortener(), default_backend)
+ self.assertTrue(issubclass(w[-1].Objecttype, RuntimeWarning))
+ self.assertEquals(
+ str(w[-1].message),
+ 'mymodule.myclass backend cannot be imported')
+ except AttributeError:
+ # Fail under Python2.5, because of'warnings.catch_warnings'
+ pass
+
+ us_settings.URL_SHORTENER_BACKEND = 'objectapp.tests.custom_url_shortener'
+ try:
+ with warnings.catch_warnings(record=True) as w:
+ self.assertEquals(get_url_shortener(), default_backend)
+ self.assertTrue(issubclass(w[-1].Objecttype, RuntimeWarning))
+ self.assertEquals(
+ str(w[-1].message),
+ 'This backend only exists for testing')
+ except AttributeError:
+ # Fail under Python2.5, because of'warnings.catch_warnings'
+ pass
+
+ us_settings.URL_SHORTENER_BACKEND = 'objectapp.url_shortener'\
+ '.backends.default'
+ self.assertEquals(get_url_shortener(), default_backend)
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/urls.py b/build/lib.linux-i686-2.6/objectapp/tests/urls.py
new file mode 100644
index 0000000..a9b8400
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/urls.py
@@ -0,0 +1,85 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test urls for the objectapp project"""
+from django.contrib import admin
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import include
+from django.conf.urls.defaults import patterns
+
+from objectapp.urls import urlpatterns
+
+admin.autodiscover()
+
+handler500 = 'django.views.defaults.server_error'
+handler404 = 'django.views.defaults.page_not_found'
+
+urlpatterns += patterns(
+ '',
+ url(r'^channel-test/$', 'objectapp.views.channels.gbobject_channel',
+ {'query': 'test'}),
+ url(r'^comments/', include('django.contrib.comments.urls')),
+ url(r'^xmlrpc/$', 'django_xmlrpc.views.handle_xmlrpc'),
+ url(r'^admin/', include(admin.site.urls)),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/utils.py b/build/lib.linux-i686-2.6/objectapp/tests/utils.py
new file mode 100644
index 0000000..16b4e8c
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/utils.py
@@ -0,0 +1,90 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Utils for Objectapp's tests"""
+import StringIO
+from xmlrpclib import Transport
+
+from django.test.client import Client
+
+
+class TestTransport(Transport):
+ """Handles connections to XML-RPC server
+ through Django test client."""
+
+ def __init__(self, *args, **kwargs):
+ Transport.__init__(self, *args, **kwargs)
+ self.client = Client()
+
+ def request(self, host, handler, request_body, verbose=0):
+ self.verbose = verbose
+ response = self.client.post(handler,
+ request_body,
+ content_type="text/xml")
+ res = StringIO.StringIO(response.content)
+ setattr(res, 'getheader', lambda *args: '') # For Python >= 2.7
+ res.seek(0)
+ if not hasattr(res, 'getheader'):
+ setattr(res, 'getheader', lambda *args: "")
+ return self.parse_response(res)
diff --git a/build/lib.linux-i686-2.6/objectapp/tests/views.py b/build/lib.linux-i686-2.6/objectapp/tests/views.py
new file mode 100644
index 0000000..5f4907a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/tests/views.py
@@ -0,0 +1,363 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Test cases for Objectapp's views"""
+from datetime import datetime
+
+from django.conf import settings
+from django.test import TestCase
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.template import TemplateDoesNotExist
+from django.utils.translation import ugettext_lazy as _
+
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.managers import PUBLISHED
+from objectapp.settings import PAGINATION
+
+
+class ViewsBaseCase(TestCase):
+ """
+ Setup and utility function base case.
+ """
+
+ def setUp(self):
+ self.old_CONTEXT_PROCESSORS = settings.TEMPLATE_CONTEXT_PROCESSORS
+ self.old_TEMPLATE_LOADERS = settings.TEMPLATE_LOADERS
+ settings.TEMPLATE_LOADERS = (
+ ('django.template.loaders.cached.Loader', (
+ 'django.template.loaders.app_directories.Loader',
+ 'django.template.loaders.eggs.Loader',
+ )
+ ),
+ )
+ settings.TEMPLATE_CONTEXT_PROCESSORS = (
+ 'django.core.context_processors.request',
+ )
+
+ self.site = Site.objects.get_current()
+ self.author = User.objects.create_superuser(
+ username='admin', email='admin@example.com', password='password')
+ self.Objecttype = Objecttype.objects.create(title='Tests', slug='tests')
+ params = {'title': 'Test 1',
+ 'content': 'First test gbobject published',
+ 'slug': 'test-1',
+ 'tags': 'tests',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ gbobject = Gbobject.objects.create(**params)
+ gbobject.sites.add(self.site)
+ gbobject.objecttypes.add(self.Objecttype)
+ gbobject.authors.add(self.author)
+
+ params = {'title': 'Test 2',
+ 'content': 'Second test gbobject published',
+ 'slug': 'test-2',
+ 'tags': 'tests',
+ 'creation_date': datetime(2010, 6, 1),
+ 'status': PUBLISHED}
+ gbobject = Gbobject.objects.create(**params)
+ gbobject.sites.add(self.site)
+ gbobject.objecttypes.add(self.Objecttype)
+ gbobject.authors.add(self.author)
+
+ def tearDown(self):
+ settings.TEMPLATE_CONTEXT_PROCESSORS = self.old_CONTEXT_PROCESSORS
+ settings.TEMPLATE_LOADERS = self.old_TEMPLATE_LOADERS
+
+ def create_published_gbobject(self):
+ params = {'title': 'My test gbobject',
+ 'content': 'My test content',
+ 'slug': 'my-test-gbobject',
+ 'tags': 'tests',
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ gbobject = Gbobject.objects.create(**params)
+ gbobject.sites.add(self.site)
+ gbobject.objecttypes.add(self.Objecttype)
+ gbobject.authors.add(self.author)
+ return gbobject
+
+ def check_publishing_context(self, url, first_expected,
+ second_expected=None):
+ """Test the numbers of gbobjects in context of an url,"""
+ response = self.client.get(url)
+ self.assertEquals(len(response.context['object_list']), first_expected)
+ if second_expected:
+ self.create_published_gbobject()
+ response = self.client.get(url)
+ self.assertEquals(
+ len(response.context['object_list']), second_expected)
+ return response
+
+
+class ObjectappViewsTestCase(ViewsBaseCase):
+ """
+ Test cases for generic views used in the application,
+ for reproducing and correcting issue :
+ http://github.com/Fantomas42/django-blog-objectapp/issues#issue/3
+ """
+ urls = 'objectapp.tests.urls'
+
+ def test_objectapp_gbobject_archive_index(self):
+ self.check_publishing_context('/', 2, 3)
+
+ def test_objectapp_gbobject_archive_year(self):
+ self.check_publishing_context('/2010/', 2, 3)
+
+ def test_objectapp_gbobject_archive_month(self):
+ self.check_publishing_context('/2010/01/', 1, 2)
+
+ def test_objectapp_gbobject_archive_day(self):
+ self.check_publishing_context('/2010/01/01/', 1, 2)
+
+ def test_objectapp_gbobject_shortlink(self):
+ response = self.client.get('/1/', follow=True)
+ self.assertEquals(response.redirect_chain,
+ [('http://testserver/2010/01/01/test-1/', 301)])
+
+ def test_objectapp_gbobject_detail(self):
+ gbobject = self.create_published_gbobject()
+ gbobject.sites.clear()
+ # Check a 404 error, but the 404.html may no exist
+ try:
+ self.assertRaises(TemplateDoesNotExist, self.client.get,
+ '/2010/01/01/my-test-gbobject/')
+ except AssertionError:
+ response = self.client.get('/2010/01/01/my-test-gbobject/')
+ self.assertEquals(response.status_code, 404)
+
+ gbobject.template = 'objectapp/_gbobject_detail.html'
+ gbobject.save()
+ gbobject.sites.add(Site.objects.get_current())
+ response = self.client.get('/2010/01/01/my-test-gbobject/')
+ self.assertEquals(response.status_code, 200)
+ self.assertTemplateUsed(response, 'objectapp/_gbobject_detail.html')
+
+ def test_objectapp_gbobject_detail_login(self):
+ gbobject = self.create_published_gbobject()
+ gbobject.login_required = True
+ gbobject.save()
+ response = self.client.get('/2010/01/01/my-test-gbobject/')
+ self.assertTemplateUsed(response, 'objectapp/login.html')
+
+ def test_objectapp_gbobject_detail_password(self):
+ gbobject = self.create_published_gbobject()
+ gbobject.password = 'password'
+ gbobject.save()
+ response = self.client.get('/2010/01/01/my-test-gbobject/')
+ self.assertTemplateUsed(response, 'objectapp/password.html')
+ self.assertEquals(response.context['error'], False)
+ response = self.client.post('/2010/01/01/my-test-gbobject/',
+ {'password': 'bad_password'})
+ self.assertTemplateUsed(response, 'objectapp/password.html')
+ self.assertEquals(response.context['error'], True)
+ response = self.client.post('/2010/01/01/my-test-gbobject/',
+ {'password': 'password'})
+ self.assertEquals(response.status_code, 302)
+
+ def test_objectapp_gbobject_channel(self):
+ self.check_publishing_context('/channel-test/', 2, 3)
+
+ def test_objectapp_Objecttype_list(self):
+ self.check_publishing_context('/objecttypes/', 1)
+ gbobject = Gbobject.objects.all()[0]
+ gbobject.objecttypes.add(Objecttype.objects.create(title='New Objecttype',
+ slug='new-Objecttype'))
+ self.check_publishing_context('/objecttypes/', 2)
+
+ def test_objectapp_Objecttype_detail(self):
+ response = self.check_publishing_context('/objecttypes/tests/', 2, 3)
+ self.assertTemplateUsed(response, 'objectapp/Objecttype/gbobject_list.html')
+ self.assertEquals(response.context['Objecttype'].slug, 'tests')
+
+ def test_objectapp_Objecttype_detail_paginated(self):
+ """Test case reproducing issue #42 on Objecttype
+ detail view paginated"""
+ for i in range(PAGINATION):
+ params = {'title': 'My gbobject %i' % i,
+ 'content': 'My content %i' % i,
+ 'slug': 'my-gbobject-%i' % i,
+ 'creation_date': datetime(2010, 1, 1),
+ 'status': PUBLISHED}
+ gbobject = Gbobject.objects.create(**params)
+ gbobject.sites.add(self.site)
+ gbobject.objecttypes.add(self.Objecttype)
+ gbobject.authors.add(self.author)
+ response = self.client.get('/objecttypes/tests/')
+ self.assertEquals(len(response.context['object_list']), PAGINATION)
+ response = self.client.get('/objecttypes/tests/?page=2')
+ self.assertEquals(len(response.context['object_list']), 2)
+ response = self.client.get('/objecttypes/tests/page/2/')
+ self.assertEquals(len(response.context['object_list']), 2)
+ self.assertEquals(response.context['Objecttype'].slug, 'tests')
+
+ def test_objectapp_author_list(self):
+ self.check_publishing_context('/authors/', 1)
+ gbobject = Gbobject.objects.all()[0]
+ gbobject.authors.add(User.objects.create(username='new-user',
+ email='new_user@example.com'))
+ self.check_publishing_context('/authors/', 2)
+
+ def test_objectapp_author_detail(self):
+ response = self.check_publishing_context('/authors/admin/', 2, 3)
+ self.assertTemplateUsed(response, 'objectapp/author/gbobject_list.html')
+ self.assertEquals(response.context['author'].username, 'admin')
+
+ def test_objectapp_tag_list(self):
+ self.check_publishing_context('/tags/', 1)
+ gbobject = Gbobject.objects.all()[0]
+ gbobject.tags = 'tests, tag'
+ gbobject.save()
+ self.check_publishing_context('/tags/', 2)
+
+ def test_objectapp_tag_detail(self):
+ response = self.check_publishing_context('/tags/tests/', 2, 3)
+ self.assertTemplateUsed(response, 'objectapp/tag/gbobject_list.html')
+ self.assertEquals(response.context['tag'].name, 'tests')
+
+ def test_objectapp_gbobject_search(self):
+ self.check_publishing_context('/search/?pattern=test', 2, 3)
+ response = self.client.get('/search/?pattern=ab')
+ self.assertEquals(len(response.context['object_list']), 0)
+ self.assertEquals(response.context['error'],
+ _('The pattern is too short'))
+ response = self.client.get('/search/')
+ self.assertEquals(len(response.context['object_list']), 0)
+ self.assertEquals(response.context['error'],
+ _('No pattern to search found'))
+
+ def test_objectapp_sitemap(self):
+ response = self.client.get('/sitemap/')
+ self.assertEquals(len(response.context['gbobjects']), 2)
+ self.assertEquals(len(response.context['objecttypes']), 1)
+ gbobject = self.create_published_gbobject()
+ gbobject.objecttypes.add(Objecttype.objects.create(title='New Objecttype',
+ slug='new-Objecttype'))
+ response = self.client.get('/sitemap/')
+ self.assertEquals(len(response.context['gbobjects']), 3)
+ self.assertEquals(len(response.context['objecttypes']), 2)
+
+ def test_objectapp_trackback(self):
+ # Check a 404 error, but the 404.html may no exist
+ try:
+ self.assertRaises(TemplateDoesNotExist, self.client.post,
+ '/trackback/404/')
+ except AssertionError:
+ response = self.client.post('/trackback/404/')
+ self.assertEquals(response.status_code, 404)
+ self.assertEquals(
+ self.client.post('/trackback/1/').status_code, 301)
+ self.assertEquals(
+ self.client.get('/trackback/1/').status_code, 301)
+ gbobject = Gbobject.objects.get(slug='test-1')
+ gbobject.pingback_enabled = False
+ gbobject.save()
+ self.assertEquals(
+ self.client.post('/trackback/1/',
+ {'url': 'http://example.com'}).content,
+ '<?xml version="1.0" encoding="utf-8"?>\n<response>\n \n '
+ '<error>1</error>\n <message>Trackback is not enabled for '
+ 'Test 1</message>\n \n</response>\n')
+ gbobject.pingback_enabled = True
+ gbobject.save()
+ self.assertEquals(
+ self.client.post('/trackback/1/',
+ {'url': 'http://example.com'}).content,
+ '<?xml version="1.0" encoding="utf-8"?>\n<response>\n \n '
+ '<error>0</error>\n \n</response>\n')
+ self.assertEquals(
+ self.client.post('/trackback/1/',
+ {'url': 'http://example.com'}).content,
+ '<?xml version="1.0" encoding="utf-8"?>\n<response>\n \n '
+ '<error>1</error>\n <message>Trackback is already registered'
+ '</message>\n \n</response>\n')
+
+
+class ObjectappCustomDetailViews(ViewsBaseCase):
+ """
+ Tests with an alternate urls.py that modifies how author_detail,
+ tags_detail and objecttypes_detail views to be called with a custom
+ template_name keyword argument and an extra_context.
+ """
+ urls = 'objectapp.tests.custom_views_detail_urls'
+
+ def test_custom_Objecttype_detail(self):
+ response = self.check_publishing_context('/objecttypes/tests/', 2, 3)
+ self.assertTemplateUsed(response, 'objectapp/gbobject_list.html')
+ self.assertEquals(response.context['Objecttype'].slug, 'tests')
+ self.assertEquals(response.context['extra'], 'context')
+
+ def test_custom_author_detail(self):
+ response = self.check_publishing_context('/authors/admin/', 2, 3)
+ self.assertTemplateUsed(response, 'objectapp/gbobject_list.html')
+ self.assertEquals(response.context['author'].username, 'admin')
+ self.assertEquals(response.context['extra'], 'context')
+
+ def test_custom_tag_detail(self):
+ response = self.check_publishing_context('/tags/tests/', 2, 3)
+ self.assertTemplateUsed(response, 'objectapp/gbobject_list.html')
+ self.assertEquals(response.context['tag'].name, 'tests')
+ self.assertEquals(response.context['extra'], 'context')
diff --git a/build/lib.linux-i686-2.6/objectapp/testsettings.py b/build/lib.linux-i686-2.6/objectapp/testsettings.py
new file mode 100644
index 0000000..a69af6e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/testsettings.py
@@ -0,0 +1,103 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Settings for testing objectapp"""
+import os
+from objectapp.xmlrpc import OBJECTAPP_XMLRPC_METHODS
+
+DATABASES = {'default': {'NAME': 'objectapp_tests.db',
+ 'ENGINE': 'django.db.backends.sqlite3'}}
+
+SITE_ID = 1
+
+STATIC_URL = '/static/'
+
+ROOT_URLCONF = 'objectapp.tests.urls'
+
+TEMPLATE_CONTEXT_PROCESSORS = [
+ 'django.core.context_processors.request',
+ 'objectapp.context_processors.version']
+
+TEMPLATE_LOADERS = [
+ ['django.template.loaders.cached.Loader', [
+ 'django.template.loaders.filesystem.Loader',
+ 'django.template.loaders.app_directories.Loader']
+ ]
+ ]
+
+TEMPLATE_DIRS = [os.path.join(os.path.dirname(__file__),
+ 'tests', 'templates')]
+
+INSTALLED_APPS = ['django.contrib.contenttypes',
+ 'django.contrib.comments',
+ 'django.contrib.sessions',
+ 'django.contrib.sites',
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django_xmlrpc',
+ 'mptt', 'tagging', 'objectapp']
+
+OBJECTAPP_PAGINATION = 3
+
+XMLRPC_METHODS = OBJECTAPP_XMLRPC_METHODS
diff --git a/build/lib.linux-i686-2.6/objectapp/url_shortener/__init__.py b/build/lib.linux-i686-2.6/objectapp/url_shortener/__init__.py
new file mode 100644
index 0000000..6b5f98d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/url_shortener/__init__.py
@@ -0,0 +1,88 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Url shortener for Objectapp"""
+import warnings
+
+from django.utils.importlib import import_module
+from django.core.exceptions import ImproperlyConfigured
+
+from objectapp.settings import URL_SHORTENER_BACKEND
+from objectapp.url_shortener.backends.default import backend as default_backend
+
+
+def get_url_shortener():
+ """Return the selected url shortener backend"""
+ try:
+ backend_module = import_module(URL_SHORTENER_BACKEND)
+ backend = getattr(backend_module, 'backend')
+ except (ImportError, AttributeError):
+ warnings.warn('%s backend cannot be imported' % URL_SHORTENER_BACKEND,
+ RuntimeWarning)
+ backend = default_backend
+ except ImproperlyConfigured, e:
+ warnings.warn(str(e), RuntimeWarning)
+ backend = default_backend
+
+ return backend
diff --git a/build/lib.linux-i686-2.6/objectapp/url_shortener/backends/__init__.py b/build/lib.linux-i686-2.6/objectapp/url_shortener/backends/__init__.py
new file mode 100644
index 0000000..83a6d7e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/url_shortener/backends/__init__.py
@@ -0,0 +1 @@
+"""Shortlink backends for Objectapp"""
diff --git a/build/lib.linux-i686-2.6/objectapp/url_shortener/backends/bitly.py b/build/lib.linux-i686-2.6/objectapp/url_shortener/backends/bitly.py
new file mode 100644
index 0000000..fda2a84
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/url_shortener/backends/bitly.py
@@ -0,0 +1,84 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Bit.ly url shortener backend for Objectapp"""
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+
+try:
+ from django_bitly.models import Bittle
+except ImportError:
+ raise ImproperlyConfigured('django_bitly is not available')
+
+if not getattr(settings, 'BITLY_LOGIN', ''):
+ raise ImproperlyConfigured('You have to set a BITLY_LOGIN setting')
+
+if not getattr(settings, 'BITLY_API_KEY', ''):
+ raise ImproperlyConfigured('You have to set a BITLY_API_KEY setting')
+
+
+def backend(gbobject):
+ """Bit.ly url shortener backend for Objectapp"""
+ bittle = Bittle.objects.bitlify(gbobject)
+ return bittle.shortUrl
diff --git a/build/lib.linux-i686-2.6/objectapp/url_shortener/backends/default.py b/build/lib.linux-i686-2.6/objectapp/url_shortener/backends/default.py
new file mode 100644
index 0000000..544dd0b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/url_shortener/backends/default.py
@@ -0,0 +1,75 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Default url shortener backend for Objectapp"""
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+
+from objectapp.settings import PROTOCOL
+
+
+def backend(gbobject):
+ """Default url shortener backend for Objectapp"""
+ return '%s://%s%s' % (PROTOCOL, Site.objects.get_current().domain,
+ reverse('objectapp_gbobject_shortlink', args=[gbobject.pk]))
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/__init__.py b/build/lib.linux-i686-2.6/objectapp/urls/__init__.py
new file mode 100644
index 0000000..2ba09ff
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/__init__.py
@@ -0,0 +1,84 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Defaults urls for the Objectapp project"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import include
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns(
+ '',
+ url(r'^tags/', include('objectapp.urls.tags',)),
+ url(r'^feeds/', include('objectapp.urls.feeds')),
+ url(r'^authors/', include('objectapp.urls.authors')),
+ url(r'^objecttypes/', include('objectapp.urls.objecttypes')),
+ url(r'^search/', include('objectapp.urls.search')),
+ url(r'^sitemap/', include('objectapp.urls.sitemap')),
+ url(r'^trackback/', include('objectapp.urls.trackback')),
+ url(r'^discussions/', include('objectapp.urls.discussions')),
+ url(r'^add/', include('objectapp.urls.add')),
+ url(r'^', include('objectapp.urls.quick_gbobject')),
+ url(r'^', include('objectapp.urls.capabilities')),
+ url(r'^', include('objectapp.urls.gbobjects')),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/add.py b/build/lib.linux-i686-2.6/objectapp/urls/add.py
new file mode 100644
index 0000000..77de348
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/add.py
@@ -0,0 +1,78 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for Objectapp forms"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('objectapp.views.add',
+ url(r'^gbobject/$', 'addgbobject',
+ name='objectapp_add_gbobject'),
+ url(r'^process/$', 'addprocess',
+ name='objectapp_add_gbobject'),
+ url(r'^system/$', 'addsystem',
+ name='objectapp_add_system'),
+
+ )
+
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/authors.py b/build/lib.linux-i686-2.6/objectapp/urls/authors.py
new file mode 100644
index 0000000..6e23729
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/authors.py
@@ -0,0 +1,78 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Objectapp authors"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+
+urlpatterns = patterns('objectapp.views.authors',
+ url(r'^$', 'author_list',
+ name='objectapp_author_list'),
+ url(r'^(?P<username>[.+-@\w]+)/$', 'author_detail',
+ name='objectapp_author_detail'),
+ url(r'^(?P<username>[.+-@\w]+)/page/(?P<page>\d+)/$',
+ 'author_detail',
+ name='objectapp_author_detail_paginated'),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/capabilities.py b/build/lib.linux-i686-2.6/objectapp/urls/capabilities.py
new file mode 100644
index 0000000..e271762
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/capabilities.py
@@ -0,0 +1,98 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the objectapp capabilities"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+from django.contrib.sites.models import Site
+
+from objectapp.settings import PROTOCOL
+from objectapp.settings import COPYRIGHT
+from objectapp.settings import FEEDS_FORMAT
+
+extra_context = {'protocol': PROTOCOL,
+ 'site': Site.objects.get_current()}
+
+extra_context_opensearch = extra_context.copy()
+extra_context_opensearch.update({'copyright': COPYRIGHT,
+ 'feeds_format': FEEDS_FORMAT})
+
+urlpatterns = patterns('django.views.generic.simple',
+ url(r'^rsd.xml$', 'direct_to_template',
+ {'template': 'objectapp/rsd.xml',
+ 'mimetype': 'application/rsd+xml',
+ 'extra_context': extra_context},
+ name='objectapp_rsd'),
+ url(r'^wlwmanifest.xml$', 'direct_to_template',
+ {'template': 'objectapp/wlwmanifest.xml',
+ 'mimetype': 'application/wlwmanifest+xml',
+ 'extra_context': extra_context},
+ name='objectapp_wlwmanifest'),
+ url(r'^opensearch.xml$', 'direct_to_template',
+ {'template': 'objectapp/opensearch.xml',
+ 'mimetype':
+ 'application/opensearchdescription+xml',
+ 'extra_context': extra_context_opensearch},
+ name='objectapp_opensearch'),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/discussions.py b/build/lib.linux-i686-2.6/objectapp/urls/discussions.py
new file mode 100644
index 0000000..759c7b0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/discussions.py
@@ -0,0 +1,73 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Objectapp discussions"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('django.views.generic.simple',
+ url(r'^success/$', 'direct_to_template',
+ {'template': 'comments/objectapp/gbobject/posted.html'},
+ name='objectapp_discussion_success'),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/feeds.py b/build/lib.linux-i686-2.6/objectapp/urls/feeds.py
new file mode 100644
index 0000000..5e6f47d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/feeds.py
@@ -0,0 +1,113 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Objectapp feeds"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+from objectapp.feeds import LatestGbobjects
+from objectapp.feeds import GbobjectDiscussions
+from objectapp.feeds import GbobjectComments
+from objectapp.feeds import GbobjectTrackbacks
+from objectapp.feeds import GbobjectPingbacks
+from objectapp.feeds import SearchGbobjects
+from objectapp.feeds import TagGbobjects
+from objectapp.feeds import ObjecttypeGbobjects
+from objectapp.feeds import AuthorGbobjects
+
+
+urlpatterns = patterns(
+ '',
+ url(r'^latest/$',
+ LatestGbobjects(),
+ name='objectapp_gbobject_latest_feed'),
+ url(r'^search/$',
+ SearchGbobjects(),
+ name='objectapp_gbobject_search_feed'),
+ url(r'^tags/(?P<slug>[- \w]+)/$',
+ TagGbobjects(),
+ name='objectapp_tag_feed'),
+ url(r'^authors/(?P<username>[.+-@\w]+)/$',
+ AuthorGbobjects(),
+ name='objectapp_author_feed'),
+ url(r'^objecttypes/(?P<path>[-\/\w]+)/$',
+ ObjecttypeGbobjects(),
+ name='objectapp_Objecttype_feed'),
+ url(r'^discussions/(?P<year>\d{4})/(?P<month>\d{2})/' \
+ '(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
+ GbobjectDiscussions(),
+ name='objectapp_gbobject_discussion_feed'),
+ url(r'^comments/(?P<year>\d{4})/(?P<month>\d{2})/' \
+ '(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
+ GbobjectComments(),
+ name='objectapp_gbobject_comment_feed'),
+ url(r'^pingbacks/(?P<year>\d{4})/(?P<month>\d{2})/' \
+ '(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
+ GbobjectPingbacks(),
+ name='objectapp_gbobject_pingback_feed'),
+ url(r'^trackbacks/(?P<year>\d{4})/(?P<month>\d{2})/' \
+ '(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
+ GbobjectTrackbacks(),
+ name='objectapp_gbobject_trackback_feed'),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/gbobjects.py b/build/lib.linux-i686-2.6/objectapp/urls/gbobjects.py
new file mode 100644
index 0000000..565a20b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/gbobjects.py
@@ -0,0 +1,114 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Objectapp gbobjects"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+from objectapp.models import Gbobject
+from objectapp.settings import PAGINATION
+from objectapp.settings import ALLOW_EMPTY
+from objectapp.settings import ALLOW_FUTURE
+
+gbobject_conf_index = {'paginate_by': PAGINATION,
+ 'template_name': 'objectapp/gbobject_archive.html'}
+
+gbobject_conf = {'date_field': 'creation_date',
+ 'allow_empty': ALLOW_EMPTY,
+ 'allow_future': ALLOW_FUTURE,
+ 'month_format': '%m'}
+
+gbobject_conf_year = gbobject_conf.copy()
+gbobject_conf_year['make_object_list'] = True
+del gbobject_conf_year['month_format']
+
+gbobject_conf_detail = gbobject_conf.copy()
+del gbobject_conf_detail['allow_empty']
+gbobject_conf_detail['queryset'] = Gbobject.published.on_site()
+
+
+urlpatterns = patterns(
+ 'objectapp.views.gbobjects',
+ url(r'^$',
+ 'gbobject_index', gbobject_conf_index,
+ name='objectapp_gbobject_archive_index'),
+ url(r'^page/(?P<page>\d+)/$',
+ 'gbobject_index', gbobject_conf_index,
+ name='objectapp_gbobject_archive_index_paginated'),
+ url(r'^(?P<year>\d{4})/$',
+ 'gbobject_year', gbobject_conf_year,
+ name='objectapp_gbobject_archive_year'),
+ url(r'^(?P<year>\d{4})/(?P<month>\d{2})/$',
+ 'gbobject_month', gbobject_conf,
+ name='objectapp_gbobject_archive_month'),
+ url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$',
+ 'gbobject_day', gbobject_conf,
+ name='objectapp_gbobject_archive_day'),
+ url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
+ 'gbobject_detail', gbobject_conf_detail,
+ name='objectapp_gbobject_detail'),
+ url(r'^(?P<object_id>\d+)/$',
+ 'gbobject_shortlink',
+ name='objectapp_gbobject_shortlink'),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/objecttypes.py b/build/lib.linux-i686-2.6/objectapp/urls/objecttypes.py
new file mode 100644
index 0000000..212a46a
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/objecttypes.py
@@ -0,0 +1,84 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Objectapp objecttypes"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+from objectapp.models import Objecttype
+
+Objecttype_conf = {'queryset': Objecttype.tree.all()}
+
+urlpatterns = patterns('django.views.generic.list_detail',
+ url(r'^$', 'object_list',
+ Objecttype_conf, 'objectapp_Objecttype_list'),
+ )
+
+urlpatterns += patterns('objectapp.views.objecttypes',
+ url(r'^(?P<path>[-\/\w]+)/page/(?P<page>\d+)/$',
+ 'Objecttype_detail',
+ name='objectapp_Objecttype_detail_paginated'),
+ url(r'^(?P<path>[-\/\w]+)/$', 'Objecttype_detail',
+ name='objectapp_Objecttype_detail'),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/quick_gbobject.py b/build/lib.linux-i686-2.6/objectapp/urls/quick_gbobject.py
new file mode 100644
index 0000000..8ff5956
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/quick_gbobject.py
@@ -0,0 +1,72 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Url for the Objectapp quick gbobject view"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('objectapp.views.quick_gbobject',
+ url(r'^quick_gbobject/$', 'view_quick_gbobject',
+ name='objectapp_gbobject_quick_post')
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/search.py b/build/lib.linux-i686-2.6/objectapp/urls/search.py
new file mode 100644
index 0000000..afe2bde
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/search.py
@@ -0,0 +1,71 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Objectapp search"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('objectapp.views.search',
+ url(r'^$', 'gbobject_search', name='objectapp_gbobject_search'),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/sitemap.py b/build/lib.linux-i686-2.6/objectapp/urls/sitemap.py
new file mode 100644
index 0000000..019d833
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/sitemap.py
@@ -0,0 +1,73 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Objectapp sitemap"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('objectapp.views.sitemap',
+ url(r'^$', 'sitemap',
+ {'template': 'objectapp/sitemap.html'},
+ name='objectapp_sitemap'),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/tags.py b/build/lib.linux-i686-2.6/objectapp/urls/tags.py
new file mode 100644
index 0000000..340a09e
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/tags.py
@@ -0,0 +1,76 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Objectapp tags"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('objectapp.views.tags',
+ url(r'^$', 'tag_list',
+ name='objectapp_tag_list'),
+ url(r'^(?P<tag>[^/]+(?u))/$', 'tag_detail',
+ name='objectapp_tag_detail'),
+ url(r'^(?P<tag>[^/]+(?u))/page/(?P<page>\d+)/$',
+ 'tag_detail', name='objectapp_tag_detail_paginated'),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/urls/trackback.py b/build/lib.linux-i686-2.6/objectapp/urls/trackback.py
new file mode 100644
index 0000000..b78f1b5
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/urls/trackback.py
@@ -0,0 +1,72 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Urls for the Objectapp trackback"""
+from django.conf.urls.defaults import url
+from django.conf.urls.defaults import patterns
+
+urlpatterns = patterns('objectapp.views.trackback',
+ url(r'^(?P<object_id>\d+)/$', 'gbobject_trackback',
+ name='objectapp_gbobject_trackback'),
+ )
diff --git a/build/lib.linux-i686-2.6/objectapp/views/__init__.py b/build/lib.linux-i686-2.6/objectapp/views/__init__.py
new file mode 100644
index 0000000..a16657d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/__init__.py
@@ -0,0 +1 @@
+"""Views for Objectapp"""
diff --git a/build/lib.linux-i686-2.6/objectapp/views/add.py b/build/lib.linux-i686-2.6/objectapp/views/add.py
new file mode 100644
index 0000000..362c3d3
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/add.py
@@ -0,0 +1,126 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+from django.http import HttpResponse
+from django.http import HttpResponseRedirect
+from django.template import RequestContext
+from django.shortcuts import render_to_response
+from datetime import datetime
+from objectapp.forms import *
+
+
+def addgbobject(request):
+ if request.method == 'POST':
+ formset = GbobjectForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/objects/")
+
+
+
+ else:
+
+ formset = GbobjectForm()
+
+
+ variables = RequestContext(request,{'formset':formset})
+ template = "objectappforms/gbobjectform.html"
+ return render_to_response(template, variables)
+
+
+def addprocess(request):
+ if request.method == 'POST':
+ formset = ProcessForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/objects/")
+
+
+
+ else:
+
+ formset = ProcessForm()
+
+
+ variables = RequestContext(request,{'formset':formset})
+ template = "objectappforms/processform.html"
+ return render_to_response(template, variables)
+
+def addsystem(request):
+ if request.method == 'POST':
+ formset = ProcessForm(request.POST)
+ if formset.is_valid():
+ formset.save()
+ return HttpResponseRedirect("/objects/")
+
+
+
+ else:
+
+ formset = SystemForm()
+
+
+ variables = RequestContext(request,{'formset':formset})
+ template = "objectappforms/systemform.html"
+ return render_to_response(template, variables)
diff --git a/build/lib.linux-i686-2.6/objectapp/views/authors.py b/build/lib.linux-i686-2.6/objectapp/views/authors.py
new file mode 100644
index 0000000..a6b7745
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/authors.py
@@ -0,0 +1,92 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Objectapp authors"""
+from django.shortcuts import get_object_or_404
+from django.views.generic.list_detail import object_list
+
+from objectapp.models import Author
+from objectapp.settings import PAGINATION
+from objectapp.views.decorators import update_queryset
+from objectapp.views.decorators import template_name_for_gbobject_queryset_filtered
+
+
+author_list = update_queryset(object_list, Author.published.all)
+
+
+def author_detail(request, username, page=None, **kwargs):
+ """Display the gbobjects of an author"""
+ extra_context = kwargs.pop('extra_context', {})
+
+ author = get_object_or_404(Author, username=username)
+ if not kwargs.get('template_name'):
+ kwargs['template_name'] = template_name_for_gbobject_queryset_filtered(
+ 'author', author.username)
+
+ extra_context.update({'author': author})
+ kwargs['extra_context'] = extra_context
+
+ return object_list(request, queryset=author.gbobjects_published(),
+ paginate_by=PAGINATION, page=page,
+ **kwargs)
diff --git a/build/lib.linux-i686-2.6/objectapp/views/channels.py b/build/lib.linux-i686-2.6/objectapp/views/channels.py
new file mode 100644
index 0000000..bc842a0
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/channels.py
@@ -0,0 +1,58 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Views for Objectapp channels"""
+from django.views.generic.list_detail import object_list
+
+from objectapp.models import Gbobject
+
+
+def gbobject_channel(request, query, *ka, **kw):
+ """Display a custom selection of gbobjects"""
+ queryset = Gbobject.published.search(query)
+ return object_list(request, queryset=queryset,
+ *ka, **kw)
diff --git a/build/lib.linux-i686-2.6/objectapp/views/decorators.py b/build/lib.linux-i686-2.6/objectapp/views/decorators.py
new file mode 100644
index 0000000..cdc7203
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/decorators.py
@@ -0,0 +1,151 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Decorators for objectapp.views"""
+from functools import wraps
+
+from django.template import RequestContext
+from django.contrib.auth.views import login
+from django.shortcuts import redirect
+from django.shortcuts import get_object_or_404
+from django.shortcuts import render_to_response
+from django.template.loader import get_template
+from django.template import TemplateDoesNotExist
+from django.views.decorators.csrf import csrf_protect
+from django.views.decorators.cache import never_cache
+
+
+def update_queryset(view, queryset,
+ queryset_parameter='queryset'):
+ """Decorator around views based on a queryset
+ passed in parameter, who will force the update
+ of the queryset before executing the view.
+ Related to issue http://code.djangoproject.com/ticket/8378"""
+
+ @wraps(view)
+ def wrapper(*args, **kwargs):
+ """Regenerate the queryset before passing it to the view."""
+ kwargs[queryset_parameter] = queryset()
+ return view(*args, **kwargs)
+
+ return wrapper
+
+
+@csrf_protect
+@never_cache
+def password(request, gbobject):
+ """Displays the password form and handle validation
+ by setting the valid password in a cookie."""
+ error = False
+ if request.method == 'POST':
+ if request.POST.get('password') == gbobject.password:
+ request.session[
+ 'objectapp_gbobject_%s_password' % gbobject.pk] = gbobject.password
+ return redirect(gbobject)
+ error = True
+ return render_to_response('objectapp/password.html', {'error': error},
+ context_instance=RequestContext(request))
+
+
+def protect_gbobject(view):
+ """Decorator performing a security check if needed
+ around the generic.date_based.gbobject_detail view
+ and specify the template used to render the gbobject"""
+
+ @wraps(view)
+ def wrapper(*ka, **kw):
+ """Do security check and retrieve the template"""
+ request = ka[0]
+ gbobject = get_object_or_404(kw['queryset'], slug=kw['slug'],
+ creation_date__year=kw['year'],
+ creation_date__month=kw['month'],
+ creation_date__day=kw['day'])
+
+ if gbobject.login_required and not request.user.is_authenticated():
+ return login(request, 'objectapp/login.html')
+ if gbobject.password and gbobject.password != \
+ request.session.get('objectapp_gbobject_%s_password' % gbobject.pk):
+ return password(request, gbobject)
+ kw['template_name'] = gbobject.template
+ return view(*ka, **kw)
+
+ return wrapper
+
+
+def template_name_for_gbobject_queryset_filtered(model_type, model_name):
+ """Return a custom template name for views
+ returning a queryset of Gbobject filtered by another model."""
+ template_name_list = (
+ 'objectapp/%s/%s/gbobject_list.html' % (model_type, model_name),
+ 'objectapp/%s/%s_gbobject_list.html' % (model_type, model_name),
+ 'objectapp/%s/gbobject_list.html' % model_type,
+ 'objectapp/gbobject_list.html')
+
+ for template_name in template_name_list:
+ try:
+ get_template(template_name)
+ return template_name
+ except TemplateDoesNotExist:
+ continue
diff --git a/build/lib.linux-i686-2.6/objectapp/views/gbobjects.py b/build/lib.linux-i686-2.6/objectapp/views/gbobjects.py
new file mode 100644
index 0000000..9662c97
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/gbobjects.py
@@ -0,0 +1,99 @@
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+#
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Objectapp gbobjects"""
+from django.shortcuts import redirect
+from django.shortcuts import get_object_or_404
+from django.views.generic.list_detail import object_list
+from django.views.generic.date_based import archive_year
+from django.views.generic.date_based import archive_month
+from django.views.generic.date_based import archive_day
+from django.views.generic.date_based import object_detail
+
+from objectapp.models import Gbobject
+from objectapp.views.decorators import protect_gbobject
+from objectapp.views.decorators import update_queryset
+
+
+gbobject_index = update_queryset(object_list, Gbobject.published.all)
+
+gbobject_year = update_queryset(archive_year, Gbobject.published.all)
+
+gbobject_month = update_queryset(archive_month, Gbobject.published.all)
+
+gbobject_day = update_queryset(archive_day, Gbobject.published.all)
+
+gbobject_detail = protect_gbobject(object_detail)
+
+
+def gbobject_shortlink(request, object_id):
+ """
+ Redirect to the 'get_absolute_url' of an Gbobject,
+ accordingly to 'object_id' argument
+ """
+ gbobject = get_object_or_404(Gbobject, pk=object_id)
+ return redirect(gbobject, permanent=True)
diff --git a/build/lib.linux-i686-2.6/objectapp/views/objecttypes.py b/build/lib.linux-i686-2.6/objectapp/views/objecttypes.py
new file mode 100644
index 0000000..f64704f
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/objecttypes.py
@@ -0,0 +1,94 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Objectapp objecttypes"""
+from django.shortcuts import get_object_or_404
+from django.views.generic.list_detail import object_list
+
+from objectapp.models import Objecttype
+from objectapp.settings import PAGINATION
+from objectapp.views.decorators import template_name_for_gbobject_queryset_filtered
+
+
+def get_Objecttype_or_404(path):
+ """Retrieve a Objecttype by a path"""
+ path_bits = [p for p in path.split('/') if p]
+ return get_object_or_404(Objecttype, slug=path_bits[-1])
+
+
+def Objecttype_detail(request, path, page=None, **kwargs):
+ """Display the gbobjects of a Objecttype"""
+ extra_context = kwargs.pop('extra_context', {})
+
+ Objecttype = get_Objecttype_or_404(path)
+ if not kwargs.get('template_name'):
+ kwargs['template_name'] = template_name_for_gbobject_queryset_filtered(
+ 'Objecttype', Objecttype.slug)
+
+ extra_context.update({'Objecttype': Objecttype})
+ kwargs['extra_context'] = extra_context
+
+ return object_list(request, queryset=Objecttype.gbobjects_published(),
+ paginate_by=PAGINATION, page=page,
+ **kwargs)
diff --git a/build/lib.linux-i686-2.6/objectapp/views/quick_gbobject.py b/build/lib.linux-i686-2.6/objectapp/views/quick_gbobject.py
new file mode 100644
index 0000000..0fca2ee
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/quick_gbobject.py
@@ -0,0 +1,118 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Objectapp quick gbobject"""
+from urllib import urlencode
+
+from django import forms
+from django.utils.html import linebreaks
+from django.shortcuts import redirect
+from django.core.urlresolvers import reverse
+from django.contrib.sites.models import Site
+from django.template.defaultfilters import slugify
+from django.utils.encoding import smart_str
+from django.contrib.auth.decorators import permission_required
+
+from objectapp.models import Gbobject
+from objectapp.managers import DRAFT
+from objectapp.managers import PUBLISHED
+
+
+class QuickGbobjectForm(forms.Form):
+ """Form for posting an gbobject quickly"""
+
+ title = forms.CharField(required=True, max_length=255)
+ content = forms.CharField(required=True)
+ tags = forms.CharField(required=False, max_length=255)
+
+
+@permission_required('objectapp.add_gbobject')
+def view_quick_gbobject(request):
+ """View for quickly post an Gbobject"""
+ if request.POST:
+ form = QuickGbobjectForm(request.POST)
+ if form.is_valid():
+ gbobject_dict = form.cleaned_data
+ status = PUBLISHED
+ if 'save_draft' in request.POST:
+ status = DRAFT
+ gbobject_dict['content'] = linebreaks(gbobject_dict['content'])
+ gbobject_dict['slug'] = slugify(gbobject_dict['title'])
+ gbobject_dict['status'] = status
+ gbobject = Gbobject.objects.create(**gbobject_dict)
+ gbobject.sites.add(Site.objects.get_current())
+ gbobject.authors.add(request.user)
+ return redirect(gbobject)
+
+ data = {'title': smart_str(request.POST.get('title', '')),
+ 'content': smart_str(linebreaks(request.POST.get(
+ 'content', ''))),
+ 'tags': smart_str(request.POST.get('tags', '')),
+ 'slug': slugify(request.POST.get('title', '')),
+ 'authors': request.user.pk,
+ 'sites': Site.objects.get_current().pk}
+ return redirect('%s?%s' % (reverse('admin:objectapp_gbobject_add'),
+ urlencode(data)))
+
+ return redirect('admin:objectapp_gbobject_add')
diff --git a/build/lib.linux-i686-2.6/objectapp/views/search.py b/build/lib.linux-i686-2.6/objectapp/views/search.py
new file mode 100644
index 0000000..bb9fe9d
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/search.py
@@ -0,0 +1,91 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Objectapp gbobjects search"""
+from django.utils.translation import ugettext as _
+from django.views.generic.list_detail import object_list
+
+from objectapp.models import Gbobject
+from objectapp.settings import PAGINATION
+
+
+def gbobject_search(request):
+ """Search gbobjects matching with a pattern"""
+ error = None
+ pattern = None
+ gbobjects = Gbobject.published.none()
+
+ if request.GET:
+ pattern = request.GET.get('pattern', '')
+ if len(pattern) < 3:
+ error = _('The pattern is too short')
+ else:
+ gbobjects = Gbobject.published.search(pattern)
+ else:
+ error = _('No pattern to search found')
+
+ return object_list(request, queryset=gbobjects,
+ paginate_by=PAGINATION,
+ template_name='objectapp/gbobject_search.html',
+ extra_context={'error': error,
+ 'pattern': pattern})
diff --git a/build/lib.linux-i686-2.6/objectapp/views/sitemap.py b/build/lib.linux-i686-2.6/objectapp/views/sitemap.py
new file mode 100644
index 0000000..2c9ebbc
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/sitemap.py
@@ -0,0 +1,77 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Objectapp sitemap"""
+from django.views.generic.simple import direct_to_template
+
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+
+
+def sitemap(*ka, **kw):
+ """Wrapper around the direct to template generic view to
+ force the update of the extra context"""
+ kw['extra_context'] = {'gbobjects': Gbobject.published.all(),
+ 'objecttypes': Objecttype.tree.all()}
+ return direct_to_template(*ka, **kw)
diff --git a/build/lib.linux-i686-2.6/objectapp/views/tags.py b/build/lib.linux-i686-2.6/objectapp/views/tags.py
new file mode 100644
index 0000000..33ada35
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/tags.py
@@ -0,0 +1,97 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Objectapp tags"""
+from django.template import RequestContext
+from django.shortcuts import render_to_response
+from django.template.defaultfilters import slugify
+
+from tagging.models import Tag
+from tagging.views import tagged_object_list
+
+from objectapp.models import Gbobject
+from objectapp.settings import PAGINATION
+
+from objectapp.views.decorators import template_name_for_gbobject_queryset_filtered
+
+
+def tag_list(request, template_name='objectapp/tag_list.html'):
+ """Return the list of published tags with counts,
+ try to simulate an object_list view"""
+ tag_list = Tag.objects.usage_for_queryset(
+ Gbobject.published.all(), counts=True)
+ return render_to_response(template_name, {'object_list': tag_list},
+ context_instance=RequestContext(request))
+
+
+def tag_detail(request, tag, page=None, **kwargs):
+ """Display the gbobjects of a tag"""
+ if not kwargs.get('template_name'):
+ kwargs['template_name'] = template_name_for_gbobject_queryset_filtered(
+ 'tag', slugify(tag))
+
+ return tagged_object_list(request, tag=tag,
+ queryset_or_model=Gbobject.published.all(),
+ paginate_by=PAGINATION, page=page,
+ **kwargs)
diff --git a/build/lib.linux-i686-2.6/objectapp/views/trackback.py b/build/lib.linux-i686-2.6/objectapp/views/trackback.py
new file mode 100644
index 0000000..932f575
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/views/trackback.py
@@ -0,0 +1,109 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""Views for Objectapp trackback"""
+from django.shortcuts import redirect
+from django.shortcuts import get_object_or_404
+from django.contrib.sites.models import Site
+from django.contrib import comments
+from django.views.decorators.csrf import csrf_exempt
+from django.contrib.contenttypes.models import ContentType
+from django.views.generic.simple import direct_to_template
+
+from objectapp.models import Gbobject
+
+
+@csrf_exempt
+def gbobject_trackback(request, object_id):
+ """Set a TrackBack for an Gbobject"""
+ gbobject = get_object_or_404(Gbobject.published, pk=object_id)
+
+ if request.POST.get('url'):
+ error = ''
+ url = request.POST['url']
+ site = Site.objects.get_current()
+
+ if not gbobject.pingback_enabled:
+ error = u'Trackback is not enabled for %s' % gbobject.title
+
+ title = request.POST.get('title') or url
+ excerpt = request.POST.get('excerpt') or title
+ blog_name = request.POST.get('blog_name') or title
+
+ if not error:
+ comment, created = comments.get_model().objects.get_or_create(
+ content_type=ContentType.objects.get_for_model(Gbobject),
+ object_pk=gbobject.pk, site=site, user_url=url,
+ user_name=blog_name, defaults={'comment': excerpt})
+ if created:
+ user = gbobject.authors.all()[0]
+ comment.flags.create(user=user, flag='trackback')
+ else:
+ error = u'Trackback is already registered'
+
+ return direct_to_template(request, 'objectapp/gbobject_trackback.xml',
+ mimetype='text/xml',
+ extra_context={'error': error})
+
+ return redirect(gbobject, permanent=True)
diff --git a/build/lib.linux-i686-2.6/objectapp/xmlrpc/__init__.py b/build/lib.linux-i686-2.6/objectapp/xmlrpc/__init__.py
new file mode 100644
index 0000000..29d9e2b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/xmlrpc/__init__.py
@@ -0,0 +1,81 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""XML-RPC methods for Objectapp"""
+
+
+OBJECTAPP_XMLRPC_PINGBACK = [
+ ('objectapp.xmlrpc.pingback.pingback_ping',
+ 'pingback.ping'),
+ ('objectapp.xmlrpc.pingback.pingback_extensions_get_pingbacks',
+ 'pingback.extensions.getPingbacks')]
+
+OBJECTAPP_XMLRPC_METAWEBLOG = [
+ ('objectapp.xmlrpc.metaweblog.get_users_blogs',
+ 'blogger.getUsersBlogs'),
+ ('objectapp.xmlrpc.metaweblog.get_user_info',
+ 'blogger.getUserInfo'),
+ ('objectapp.xmlrpc.metaweblog.delete_post',
+ 'blogger.deletePost'),
+ ('objectapp.xmlrpc.metaweblog.get_authors',
+ 'wp.getAuthors'),
+ ('objectapp.xmlrpc.metaweblog.get_objecttypes',
+ 'metaWeblog.getObjecttypes'),
+ ('objectapp.xmlrpc.metaweblog.new_Objecttype',
+ 'wp.newObjecttype'),
+ ('objectapp.xmlrpc.metaweblog.get_recent_posts',
+ 'metaWeblog.getRecentPosts'),
+ ('objectapp.xmlrpc.metaweblog.get_post',
+ 'metaWeblog.getPost'),
+ ('objectapp.xmlrpc.metaweblog.new_post',
+ 'metaWeblog.newPost'),
+ ('objectapp.xmlrpc.metaweblog.edit_post',
+ 'metaWeblog.editPost'),
+ ('objectapp.xmlrpc.metaweblog.new_media_object',
+ 'metaWeblog.newMediaObject')]
+
+OBJECTAPP_XMLRPC_METHODS = OBJECTAPP_XMLRPC_PINGBACK + OBJECTAPP_XMLRPC_METAWEBLOG
diff --git a/build/lib.linux-i686-2.6/objectapp/xmlrpc/metaweblog.py b/build/lib.linux-i686-2.6/objectapp/xmlrpc/metaweblog.py
new file mode 100644
index 0000000..18b2b25
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/xmlrpc/metaweblog.py
@@ -0,0 +1,344 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""XML-RPC methods of Objectapp metaWeblog API"""
+import os
+from datetime import datetime
+from xmlrpclib import Fault
+from xmlrpclib import DateTime
+
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+from django.utils.translation import gettext as _
+from django.utils.html import strip_tags
+from django.utils.text import truncate_words
+from django.core.files.base import ContentFile
+from django.core.files.storage import default_storage
+from django.template.defaultfilters import slugify
+
+from objectapp.models import Gbobject
+from objectapp.models import Objecttype
+from objectapp.settings import PROTOCOL
+from objectapp.settings import UPLOAD_TO
+from objectapp.managers import DRAFT, PUBLISHED
+from django_xmlrpc.decorators import xmlrpc_func
+
+# http://docs.nucleuscms.org/blog/12#errorcodes
+LOGIN_ERROR = 801
+PERMISSION_DENIED = 803
+
+
+def authenticate(username, password, permission=None):
+ """Authenticate staff_user with permission"""
+ try:
+ user = User.objects.get(username__exact=username)
+ except User.DoesNotExist:
+ raise Fault(LOGIN_ERROR, _('Username is incorrect.'))
+ if not user.check_password(password):
+ raise Fault(LOGIN_ERROR, _('Password is invalid.'))
+ if not user.is_staff or not user.is_active:
+ raise Fault(PERMISSION_DENIED, _('User account unavailable.'))
+ if permission:
+ if not user.has_perm(permission):
+ raise Fault(PERMISSION_DENIED, _('User cannot %s.') % permission)
+ return user
+
+
+def blog_structure(site):
+ """A blog structure"""
+ return {'url': '%s://%s%s' % (
+ PROTOCOL, site.domain, reverse('objectapp_gbobject_archive_index')),
+ 'blogid': settings.SITE_ID,
+ 'blogName': site.name}
+
+
+def user_structure(user, site):
+ """An user structure"""
+ return {'userid': user.pk,
+ 'email': user.email,
+ 'nickname': user.username,
+ 'lastname': user.last_name,
+ 'firstname': user.first_name,
+ 'url': '%s://%s%s' % (
+ PROTOCOL, site.domain,
+ reverse('objectapp_author_detail', args=[user.username]))}
+
+
+def author_structure(user):
+ """An author structure"""
+ return {'user_id': user.pk,
+ 'user_login': user.username,
+ 'display_name': user.username,
+ 'user_email': user.email}
+
+
+def Objecttype_structure(Objecttype, site):
+ """A Objecttype structure"""
+ return {'description': Objecttype.title,
+ 'htmlUrl': '%s://%s%s' % (
+ PROTOCOL, site.domain,
+ Objecttype.get_absolute_url()),
+ 'rssUrl': '%s://%s%s' % (
+ PROTOCOL, site.domain,
+ reverse('objectapp_Objecttype_feed', args=[Objecttype.tree_path])),
+ # Useful Wordpress Extensions
+ 'ObjecttypeId': Objecttype.pk,
+ 'parentId': Objecttype.parent and Objecttype.parent.pk or 0,
+ 'ObjecttypeDescription': Objecttype.description,
+ 'ObjecttypeName': Objecttype.title}
+
+
+def post_structure(gbobject, site):
+ """A post structure with extensions"""
+ author = gbobject.authors.all()[0]
+ return {'title': gbobject.title,
+ 'description': unicode(gbobject.html_content),
+ 'link': '%s://%s%s' % (PROTOCOL, site.domain,
+ gbobject.get_absolute_url()),
+ # Basic Extensions
+ 'permaLink': '%s://%s%s' % (PROTOCOL, site.domain,
+ gbobject.get_absolute_url()),
+ 'objecttypes': [cat.title for cat in gbobject.objecttypes.all()],
+ 'dateCreated': DateTime(gbobject.creation_date.isoformat()),
+ 'postid': gbobject.pk,
+ 'userid': author.username,
+ # Useful Movable Type Extensions
+ 'mt_excerpt': gbobject.excerpt,
+ 'mt_allow_comments': int(gbobject.comment_enabled),
+ 'mt_allow_pings': int(gbobject.pingback_enabled),
+ 'mt_keywords': gbobject.tags,
+ # Useful Wordpress Extensions
+ 'wp_author': author.username,
+ 'wp_author_id': author.pk,
+ 'wp_author_display_name': author.username,
+ 'wp_password': gbobject.password,
+ 'wp_slug': gbobject.slug,
+ 'sticky': gbobject.featured}
+
+
+@xmlrpc_func(returns='struct[]', args=['string', 'string', 'string'])
+def get_users_blogs(apikey, username, password):
+ """blogger.getUsersBlogs(api_key, username, password)
+ => blog structure[]"""
+ authenticate(username, password)
+ site = Site.objects.get_current()
+ return [blog_structure(site)]
+
+
+@xmlrpc_func(returns='struct', args=['string', 'string', 'string'])
+def get_user_info(apikey, username, password):
+ """blogger.getUserInfo(api_key, username, password)
+ => user structure"""
+ user = authenticate(username, password)
+ site = Site.objects.get_current()
+ return user_structure(user, site)
+
+
+@xmlrpc_func(returns='struct[]', args=['string', 'string', 'string'])
+def get_authors(apikey, username, password):
+ """wp.getAuthors(api_key, username, password)
+ => author structure[]"""
+ authenticate(username, password)
+ return [author_structure(author)
+ for author in User.objects.filter(is_staff=True)]
+
+
+@xmlrpc_func(returns='boolean', args=['string', 'string',
+ 'string', 'string', 'string'])
+def delete_post(apikey, post_id, username, password, publish):
+ """blogger.deletePost(api_key, post_id, username, password, 'publish')
+ => boolean"""
+ user = authenticate(username, password, 'objectapp.delete_gbobject')
+ gbobject = Gbobject.objects.get(id=post_id, authors=user)
+ gbobject.delete()
+ return True
+
+
+@xmlrpc_func(returns='struct', args=['string', 'string', 'string'])
+def get_post(post_id, username, password):
+ """metaWeblog.getPost(post_id, username, password)
+ => post structure"""
+ user = authenticate(username, password)
+ site = Site.objects.get_current()
+ return post_structure(Gbobject.objects.get(id=post_id, authors=user), site)
+
+
+@xmlrpc_func(returns='struct[]',
+ args=['string', 'string', 'string', 'integer'])
+def get_recent_posts(blog_id, username, password, number):
+ """metaWeblog.getRecentPosts(blog_id, username, password, number)
+ => post structure[]"""
+ user = authenticate(username, password)
+ site = Site.objects.get_current()
+ return [post_structure(gbobject, site) \
+ for gbobject in Gbobject.objects.filter(authors=user)[:number]]
+
+
+@xmlrpc_func(returns='struct[]', args=['string', 'string', 'string'])
+def get_objecttypes(blog_id, username, password):
+ """metaWeblog.getObjecttypes(blog_id, username, password)
+ => Objecttype structure[]"""
+ authenticate(username, password)
+ site = Site.objects.get_current()
+ return [Objecttype_structure(Objecttype, site) \
+ for Objecttype in Objecttype.objects.all()]
+
+
+@xmlrpc_func(returns='string', args=['string', 'string', 'string', 'struct'])
+def new_Objecttype(blog_id, username, password, Objecttype_struct):
+ """wp.newObjecttype(blog_id, username, password, Objecttype)
+ => Objecttype_id"""
+ authenticate(username, password, 'objectapp.add_Objecttype')
+ Objecttype_dict = {'title': Objecttype_struct['name'],
+ 'description': Objecttype_struct['description'],
+ 'slug': Objecttype_struct['slug']}
+ if int(Objecttype_struct['parent_id']):
+ Objecttype_dict['parent'] = Objecttype.objects.get(
+ pk=Objecttype_struct['parent_id'])
+ Objecttype = Objecttype.objects.create(**Objecttype_dict)
+
+ return Objecttype.pk
+
+
+@xmlrpc_func(returns='string', args=['string', 'string', 'string',
+ 'struct', 'boolean'])
+def new_post(blog_id, username, password, post, publish):
+ """metaWeblog.newPost(blog_id, username, password, post, publish)
+ => post_id"""
+ user = authenticate(username, password, 'objectapp.add_gbobject')
+ if post.get('dateCreated'):
+ creation_date = datetime.strptime(
+ post['dateCreated'].value.replace('Z', '').replace('-', ''),
+ '%Y%m%dT%H:%M:%S')
+ else:
+ creation_date = datetime.now()
+
+ gbobject_dict = {'title': post['title'],
+ 'content': post['description'],
+ 'excerpt': post.get('mt_excerpt', truncate_words(
+ strip_tags(post['description']), 50)),
+ 'creation_date': creation_date,
+ 'last_update': creation_date,
+ 'comment_enabled': post.get('mt_allow_comments', 1) == 1,
+ 'pingback_enabled': post.get('mt_allow_pings', 1) == 1,
+ 'featured': post.get('sticky', 0) == 1,
+ 'tags': 'mt_keywords' in post and post['mt_keywords'] or '',
+ 'slug': 'wp_slug' in post and post['wp_slug'] or slugify(
+ post['title']),
+ 'password': post.get('wp_password', ''),
+ 'status': publish and PUBLISHED or DRAFT}
+ gbobject = Gbobject.objects.create(**gbobject_dict)
+
+ author = user
+ if 'wp_author_id' in post and user.has_perm('objectapp.can_change_author'):
+ if int(post['wp_author_id']) != user.pk:
+ author = User.objects.get(pk=post['wp_author_id'])
+ gbobject.authors.add(author)
+
+ gbobject.sites.add(Site.objects.get_current())
+ if 'objecttypes' in post:
+ gbobject.objecttypes.add(*[Objecttype.objects.get_or_create(
+ title=cat, slug=slugify(cat))[0]
+ for cat in post['objecttypes']])
+
+ return gbobject.pk
+
+
+@xmlrpc_func(returns='boolean', args=['string', 'string', 'string',
+ 'struct', 'boolean'])
+def edit_post(post_id, username, password, post, publish):
+ """metaWeblog.editPost(post_id, username, password, post, publish)
+ => boolean"""
+ user = authenticate(username, password, 'objectapp.change_gbobject')
+ gbobject = Gbobject.objects.get(id=post_id, authors=user)
+ if post.get('dateCreated'):
+ creation_date = datetime.strptime(
+ post['dateCreated'].value.replace('Z', '').replace('-', ''),
+ '%Y%m%dT%H:%M:%S')
+ else:
+ creation_date = gbobject.creation_date
+
+ gbobject.title = post['title']
+ gbobject.content = post['description']
+ gbobject.excerpt = post.get('mt_excerpt', truncate_words(
+ strip_tags(post['description']), 50))
+ gbobject.creation_date = creation_date
+ gbobject.last_update = datetime.now()
+ gbobject.comment_enabled = post.get('mt_allow_comments', 1) == 1
+ gbobject.pingback_enabled = post.get('mt_allow_pings', 1) == 1
+ gbobject.featured = post.get('sticky', 0) == 1
+ gbobject.tags = 'mt_keywords' in post and post['mt_keywords'] or ''
+ gbobject.slug = 'wp_slug' in post and post['wp_slug'] or slugify(
+ post['title'])
+ gbobject.status = publish and PUBLISHED or DRAFT
+ gbobject.password = post.get('wp_password', '')
+ gbobject.save()
+
+ if 'wp_author_id' in post and user.has_perm('objectapp.can_change_author'):
+ if int(post['wp_author_id']) != user.pk:
+ author = User.objects.get(pk=post['wp_author_id'])
+ gbobject.authors.clear()
+ gbobject.authors.add(author)
+
+ if 'objecttypes' in post:
+ gbobject.objecttypes.clear()
+ gbobject.objecttypes.add(*[Objecttype.objects.get_or_create(
+ title=cat, slug=slugify(cat))[0]
+ for cat in post['objecttypes']])
+ return True
+
+
+@xmlrpc_func(returns='struct', args=['string', 'string', 'string', 'struct'])
+def new_media_object(blog_id, username, password, media):
+ """metaWeblog.newMediaObject(blog_id, username, password, media)
+ => media structure"""
+ authenticate(username, password)
+ path = default_storage.save(os.path.join(UPLOAD_TO, media['name']),
+ ContentFile(media['bits'].data))
+ return {'url': default_storage.url(path)}
diff --git a/build/lib.linux-i686-2.6/objectapp/xmlrpc/pingback.py b/build/lib.linux-i686-2.6/objectapp/xmlrpc/pingback.py
new file mode 100644
index 0000000..2c8d51b
--- /dev/null
+++ b/build/lib.linux-i686-2.6/objectapp/xmlrpc/pingback.py
@@ -0,0 +1,187 @@
+# Copyright (c) 2011, 2012 Free Software Foundation
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This project incorporates work covered by the following copyright and permission notice:
+
+# Copyright (c) 2009, Julien Fache
+# All rights reserved.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of the author nor the names of other
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+"""XML-RPC methods of Objectapp Pingback"""
+from urllib2 import urlopen
+from urllib2 import URLError
+from urllib2 import HTTPError
+from urlparse import urlsplit
+
+from django.contrib import comments
+from django.utils.html import strip_tags
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import resolve
+from django.core.urlresolvers import Resolver404
+from django.utils.translation import ugettext as _
+from django.contrib.contenttypes.models import ContentType
+
+from objectapp.models import Gbobject
+from objectapp.settings import PINGBACK_CONTENT_LENGTH
+from BeautifulSoup import BeautifulSoup
+from django_xmlrpc.decorators import xmlrpc_func
+
+UNDEFINED_ERROR = 0
+SOURCE_DOES_NOT_EXIST = 16
+SOURCE_DOES_NOT_LINK = 17
+TARGET_DOES_NOT_EXIST = 32
+TARGET_IS_NOT_PINGABLE = 33
+PINGBACK_ALREADY_REGISTERED = 48
+
+
+def generate_pingback_content(soup, target, max_length, trunc_char='...'):
+ """Generate a description text for the pingback"""
+ link = soup.find('a', href=target)
+
+ content = strip_tags(unicode(link.findParent()))
+ index = content.index(link.string)
+
+ if len(content) > max_length:
+ middle = max_length / 2
+ start = index - middle
+ end = index + middle
+
+ if start <= 0:
+ end -= start
+ extract = content[0:end]
+ else:
+ extract = '%s%s' % (trunc_char, content[start:end])
+
+ if end < len(content):
+ extract += trunc_char
+ return extract
+
+ return content
+
+
+@xmlrpc_func(returns='string', args=['string', 'string'])
+def pingback_ping(source, target):
+ """pingback.ping(sourceURI, targetURI) => 'Pingback message'
+
+ Notifies the server that a link has been added to sourceURI,
+ pointing to targetURI.
+
+ See: http://hixie.ch/specs/pingback/pingback-1.0"""
+ try:
+ if source == target:
+ return UNDEFINED_ERROR
+
+ site = Site.objects.get_current()
+ try:
+ document = ''.join(urlopen(source).readlines())
+ except (HTTPError, URLError):
+ return SOURCE_DOES_NOT_EXIST
+
+ if not target in document:
+ return SOURCE_DOES_NOT_LINK
+
+ scheme, netloc, path, query, fragment = urlsplit(target)
+ if netloc != site.domain:
+ return TARGET_DOES_NOT_EXIST
+
+ try:
+ view, args, kwargs = resolve(path)
+ except Resolver404:
+ return TARGET_DOES_NOT_EXIST
+
+ try:
+ gbobject = Gbobject.published.get(
+ slug=kwargs['slug'],
+ creation_date__year=kwargs['year'],
+ creation_date__month=kwargs['month'],
+ creation_date__day=kwargs['day'])
+ if not gbobject.pingback_enabled:
+ return TARGET_IS_NOT_PINGABLE
+ except (KeyError, Gbobject.DoesNotExist):
+ return TARGET_IS_NOT_PINGABLE
+
+ soup = BeautifulSoup(document)
+ title = soup.find('title')
+ title = title and strip_tags(title) or _('No title')
+ description = generate_pingback_content(soup, target,
+ PINGBACK_CONTENT_LENGTH)
+
+ comment, created = comments.get_model().objects.get_or_create(
+ content_type=ContentType.objects.get_for_model(Gbobject),
+ object_pk=gbobject.pk, user_url=source, site=site,
+ defaults={'comment': description, 'user_name': title})
+ if created:
+ user = gbobject.authors.all()[0]
+ comment.flags.create(user=user, flag='pingback')
+ return 'Pingback from %s to %s registered.' % (source, target)
+ return PINGBACK_ALREADY_REGISTERED
+ except:
+ return UNDEFINED_ERROR
+
+
+@xmlrpc_func(returns='string[]', args=['string'])
+def pingback_extensions_get_pingbacks(target):
+ """pingback.extensions.getPingbacks(url) => '[url, url, ...]'
+
+ Returns an array of URLs that link to the specified url.
+
+ See: http://www.aquarionics.com/misc/archives/blogite/0198.html"""
+ site = Site.objects.get_current()
+
+ scheme, netloc, path, query, fragment = urlsplit(target)
+ if netloc != site.domain:
+ return TARGET_DOES_NOT_EXIST
+
+ try:
+ view, args, kwargs = resolve(path)
+ except Resolver404:
+ return TARGET_DOES_NOT_EXIST
+
+ try:
+ gbobject = Gbobject.published.get(
+ slug=kwargs['slug'],
+ creation_date__year=kwargs['year'],
+ creation_date__month=kwargs['month'],
+ creation_date__day=kwargs['day'])
+ except (KeyError, Gbobject.DoesNotExist):
+ return TARGET_IS_NOT_PINGABLE
+
+ return [pingback.user_url for pingback in gbobject.pingbacks]
diff --git a/demo/__init__.pyc b/demo/__init__.pyc
new file mode 100644
index 0000000..3aa8423
--- /dev/null
+++ b/demo/__init__.pyc
Binary files differ
diff --git a/demo/dashboard.pyc b/demo/dashboard.pyc
new file mode 100644
index 0000000..d0e061e
--- /dev/null
+++ b/demo/dashboard.pyc
Binary files differ
diff --git a/demo/demo.db b/demo/demo.db
index 88f113b..ca33612 100644
--- a/demo/demo.db
+++ b/demo/demo.db
Binary files differ
diff --git a/demo/graphviz/__init__.pyc b/demo/graphviz/__init__.pyc
new file mode 100644
index 0000000..02e3f24
--- /dev/null
+++ b/demo/graphviz/__init__.pyc
Binary files differ
diff --git a/demo/graphviz/admin.pyc b/demo/graphviz/admin.pyc
new file mode 100644
index 0000000..d712f1c
--- /dev/null
+++ b/demo/graphviz/admin.pyc
Binary files differ
diff --git a/demo/graphviz/management/__init__.pyc b/demo/graphviz/management/__init__.pyc
new file mode 100644
index 0000000..4fb5495
--- /dev/null
+++ b/demo/graphviz/management/__init__.pyc
Binary files differ
diff --git a/demo/graphviz/models.pyc b/demo/graphviz/models.pyc
new file mode 100644
index 0000000..00d027e
--- /dev/null
+++ b/demo/graphviz/models.pyc
Binary files differ
diff --git a/demo/grappelli/__init__.pyc b/demo/grappelli/__init__.pyc
new file mode 100644
index 0000000..ad6c9f3
--- /dev/null
+++ b/demo/grappelli/__init__.pyc
Binary files differ
diff --git a/demo/grappelli/dashboard/__init__.pyc b/demo/grappelli/dashboard/__init__.pyc
new file mode 100644
index 0000000..db1644a
--- /dev/null
+++ b/demo/grappelli/dashboard/__init__.pyc
Binary files differ
diff --git a/demo/grappelli/dashboard/dashboards.pyc b/demo/grappelli/dashboard/dashboards.pyc
new file mode 100644
index 0000000..8359b87
--- /dev/null
+++ b/demo/grappelli/dashboard/dashboards.pyc
Binary files differ
diff --git a/demo/grappelli/dashboard/management/__init__.pyc b/demo/grappelli/dashboard/management/__init__.pyc
new file mode 100644
index 0000000..8296cb8
--- /dev/null
+++ b/demo/grappelli/dashboard/management/__init__.pyc
Binary files differ
diff --git a/demo/grappelli/dashboard/modules.pyc b/demo/grappelli/dashboard/modules.pyc
new file mode 100644
index 0000000..02cc73c
--- /dev/null
+++ b/demo/grappelli/dashboard/modules.pyc
Binary files differ
diff --git a/demo/grappelli/dashboard/registry.pyc b/demo/grappelli/dashboard/registry.pyc
new file mode 100644
index 0000000..fca1a27
--- /dev/null
+++ b/demo/grappelli/dashboard/registry.pyc
Binary files differ
diff --git a/demo/grappelli/dashboard/templatetags/__init__.pyc b/demo/grappelli/dashboard/templatetags/__init__.pyc
new file mode 100644
index 0000000..892c983
--- /dev/null
+++ b/demo/grappelli/dashboard/templatetags/__init__.pyc
Binary files differ
diff --git a/demo/grappelli/dashboard/templatetags/grp_dashboard_tags.pyc b/demo/grappelli/dashboard/templatetags/grp_dashboard_tags.pyc
new file mode 100644
index 0000000..392f329
--- /dev/null
+++ b/demo/grappelli/dashboard/templatetags/grp_dashboard_tags.pyc
Binary files differ
diff --git a/demo/grappelli/dashboard/utils.pyc b/demo/grappelli/dashboard/utils.pyc
new file mode 100644
index 0000000..cecc4b0
--- /dev/null
+++ b/demo/grappelli/dashboard/utils.pyc
Binary files differ
diff --git a/demo/grappelli/models.pyc b/demo/grappelli/models.pyc
new file mode 100644
index 0000000..2635511
--- /dev/null
+++ b/demo/grappelli/models.pyc
Binary files differ
diff --git a/demo/grappelli/settings.pyc b/demo/grappelli/settings.pyc
new file mode 100644
index 0000000..f8f4c5a
--- /dev/null
+++ b/demo/grappelli/settings.pyc
Binary files differ
diff --git a/demo/grappelli/templatetags/__init__.pyc b/demo/grappelli/templatetags/__init__.pyc
new file mode 100644
index 0000000..6873fc5
--- /dev/null
+++ b/demo/grappelli/templatetags/__init__.pyc
Binary files differ
diff --git a/demo/grappelli/templatetags/grp_tags.pyc b/demo/grappelli/templatetags/grp_tags.pyc
new file mode 100644
index 0000000..1d9bfaa
--- /dev/null
+++ b/demo/grappelli/templatetags/grp_tags.pyc
Binary files differ
diff --git a/demo/grappelli/urls.pyc b/demo/grappelli/urls.pyc
new file mode 100644
index 0000000..24a0b72
--- /dev/null
+++ b/demo/grappelli/urls.pyc
Binary files differ
diff --git a/demo/grappelli/views/__init__.pyc b/demo/grappelli/views/__init__.pyc
new file mode 100644
index 0000000..1533e6e
--- /dev/null
+++ b/demo/grappelli/views/__init__.pyc
Binary files differ
diff --git a/demo/grappelli/views/related.pyc b/demo/grappelli/views/related.pyc
new file mode 100644
index 0000000..01e8189
--- /dev/null
+++ b/demo/grappelli/views/related.pyc
Binary files differ
diff --git a/demo/settings.pyc b/demo/settings.pyc
new file mode 100644
index 0000000..5cfa794
--- /dev/null
+++ b/demo/settings.pyc
Binary files differ
diff --git a/demo/urls.pyc b/demo/urls.pyc
new file mode 100644
index 0000000..a2d9523
--- /dev/null
+++ b/demo/urls.pyc
Binary files differ
diff --git a/demo/views.pyc b/demo/views.pyc
new file mode 100644
index 0000000..046700a
--- /dev/null
+++ b/demo/views.pyc
Binary files differ
diff --git a/dist/django_gstudio-0.3.dev-py2.6.egg b/dist/django_gstudio-0.3.dev-py2.6.egg
new file mode 100644
index 0000000..dea1129
--- /dev/null
+++ b/dist/django_gstudio-0.3.dev-py2.6.egg
Binary files differ
diff --git a/gstudio/__init__.pyc b/gstudio/__init__.pyc
new file mode 100644
index 0000000..9f1566a
--- /dev/null
+++ b/gstudio/__init__.pyc
Binary files differ
diff --git a/gstudio/admin/objecttype.py b/gstudio/admin/objecttype.py
index 22ef205..c98a0d7 100644
--- a/gstudio/admin/objecttype.py
+++ b/gstudio/admin/objecttype.py
@@ -33,6 +33,7 @@ class ObjecttypeAdmin(reversion.VersionAdmin):
'classes': ('collapse', 'collapse-closed')}),
(_('Options'), {'fields': ('featured', 'excerpt', 'template',
'authors',
+ 'rurl',
'creation_date',
'start_publication',
'end_publication'),
diff --git a/gstudio/managers.py b/gstudio/managers.py
index 5922327..f05a925 100644
--- a/gstudio/managers.py
+++ b/gstudio/managers.py
@@ -79,6 +79,54 @@ class AuthorPublishedManager(models.Manager):
nodetypes__sites=Site.objects.get_current()
).distinct()
+def nodes_published(queryset):
+
+ """Return only the nodetypes published"""
+ now = datetime.now()
+ return queryset.filter(status=PUBLISHED,
+ start_publication__lte=now,
+ end_publication__gt=now,
+ sites=Site.objects.get_current())
+
+class NodePublishedManager(models.Manager):
+ """Manager to retrieve published nodes"""
+
+ def get_query_set(self):
+ """Return published nodes"""
+ return nodes_published(
+ super(NodePublishedManager, self).get_query_set())
+
+ def on_site(self):
+ """Return nodes published on current site"""
+ return super(NodePublishedManager, self).get_query_set(
+ ).filter(sites=Site.objects.get_current())
+
+ def search(self, pattern):
+ """Top level search method on nodes"""
+ try:
+ return self.advanced_search(pattern)
+ except:
+ return self.basic_search(pattern)
+
+ def advanced_search(self, pattern):
+ """Advanced search on nodes"""
+ from gstudio.search import advanced_search
+ return advanced_search(pattern)
+
+ def basic_search(self, pattern):
+ """Basic search on nodes"""
+ lookup = None
+ for pattern in pattern.split():
+ query_part = models.Q(title__icontains=pattern)
+ ''' models.Q(content__icontains=pattern) | \
+ models.Q(excerpt__icontains=pattern) | \ '''
+ if lookup is None:
+ lookup = query_part
+ else:
+ lookup |= query_part
+
+ return self.get_query_set().filter(lookup)
+
def nodetypes_published(queryset):
diff --git a/gstudio/models.py b/gstudio/models.py
index 885b345..c145ab0 100644
--- a/gstudio/models.py
+++ b/gstudio/models.py
@@ -95,6 +95,7 @@ from gstudio.settings import MARKDOWN_EXTENSIONS
from gstudio.settings import AUTO_CLOSE_COMMENTS_AFTER
from gstudio.managers import nodetypes_published
from gstudio.managers import NodetypePublishedManager
+from gstudio.managers import NodePublishedManager
from gstudio.managers import AuthorPublishedManager
from gstudio.managers import DRAFT, HIDDEN, PUBLISHED
from gstudio.moderator import NodetypeCommentModerator
@@ -212,15 +213,26 @@ class NID(models.Model):
"""
return self.__dict__
+ @property
+ def get_app_name(self):
+ if self.ref.__class__.__name__=='Gbobject' or self.ref.__class__.__name__=='Process' or self.ref.__class__.__name__=='System' :
+ return 'type'
+
@models.permalink
def get_absolute_url(self):
"""Return nodetype's URL"""
-
- return ('gstudio_nodetype_detail', (), {
- 'year': self.creation_date.strftime('%Y'),
- 'month': self.creation_date.strftime('%m'),
- 'day': self.creation_date.strftime('%d'),
- 'slug': self.slug})
+ if self.get_app_name=='type':
+ return ('objectapp_gbobject_detail', (), {
+ 'year': self.creation_date.strftime('%Y'),
+ 'month': self.creation_date.strftime('%m'),
+ 'day': self.creation_date.strftime('%d'),
+ 'slug': self.slug})
+ else:
+ return ('gstudio_nodetype_detail', (), {
+ 'year': self.creation_date.strftime('%Y'),
+ 'month': self.creation_date.strftime('%m'),
+ 'day': self.creation_date.strftime('%d'),
+ 'slug': self.slug})
@property
def ref(self):
@@ -273,7 +285,17 @@ class Node(NID):
altnames = TagField(_('alternate names'), help_text=_('alternate names if any'), blank=True, null=True)
plural = models.CharField(_('plural name'), help_text=_('plural form of the node name if any'), max_length=255, blank=True, null=True)
rating = RatingField(range=5, can_change_vote = True, help_text=_('your rating'), blank=True, null=True)
+ status = models.IntegerField(choices=STATUS_CHOICES, default=PUBLISHED)
+ start_publication = models.DateTimeField(_('start publication'),
+ help_text=_('date start publish'),
+ default=datetime.now)
+ end_publication = models.DateTimeField(_('end publication'),
+ help_text=_('date end publish'),
+ default=datetime(2042, 3, 15))
+ sites = models.ManyToManyField(Site, verbose_name=_('sites publication'),
+ related_name='nodetypes')
+ published = NodePublishedManager()
def __unicode__(self):
return self.title
@@ -514,24 +536,9 @@ class Nodetype(Node):
related_name='nodetypes',
blank=True, null=False)
- status = models.IntegerField(choices=STATUS_CHOICES, default=PUBLISHED)
-
featured = models.BooleanField(_('featured'), default=False)
comment_enabled = models.BooleanField(_('comment enabled'), default=True)
pingback_enabled = models.BooleanField(_('linkback enabled'), default=True)
-
-
-
- start_publication = models.DateTimeField(_('start publication'),
- help_text=_('date start publish'),
- default=datetime.now)
- end_publication = models.DateTimeField(_('end publication'),
- help_text=_('date end publish'),
- default=datetime(2042, 3, 15))
-
- sites = models.ManyToManyField(Site, verbose_name=_('sites publication'),
- related_name='nodetypes')
-
login_required = models.BooleanField(
_('login required'), default=False,
help_text=_('only authenticated users can view the nodetype'))
@@ -545,7 +552,7 @@ class Nodetype(Node):
choices=[('gstudio/nodetype_detail.html', _('Default template'))] + \
NODETYPE_TEMPLATES,
help_text=_('template used to display the nodetype'))
-
+ rurl=models.URLField(_('rurl'),verify_exists=True,null=True, blank=True)
objects = models.Manager()
published = NodetypePublishedManager()
diff --git a/gstudio/search.py b/gstudio/search.py
index adbb037..7312ad6 100644
--- a/gstudio/search.py
+++ b/gstudio/search.py
@@ -64,7 +64,7 @@ from pyparsing import operatorPrecedence
from django.db.models import Q
-from gstudio.models import Nodetype
+from gstudio.models import Node
from gstudio.settings import STOP_WORDS
@@ -96,9 +96,9 @@ def createQ(token):
return Q()
if not meta:
- return Q(content__icontains=search) | \
- Q(excerpt__icontains=search) | \
- Q(title__icontains=search)
+ return Q(title__icontains=search)
+ ''' Q(content__icontains=search) | \
+ Q(excerpt__icontains=search) | \ '''
if meta == 'metatype':
if wildcards == 'BOTH':
@@ -178,4 +178,4 @@ def advanced_search(pattern):
"""Parse the grammar of a pattern
and build a queryset with it"""
query_parsed = QUERY.parseString(pattern)
- return Nodetype.published.filter(query_parsed[0]).distinct()
+ return Node.published.filter(query_parsed[0]).distinct()
diff --git a/gstudio/templates/gstudio/base.html b/gstudio/templates/gstudio/base.html
index 2c612e1..94a72eb 100644
--- a/gstudio/templates/gstudio/base.html
+++ b/gstudio/templates/gstudio/base.html
@@ -25,7 +25,7 @@
<div class="search">
<h3>{% trans "Search" %}</h3>
- <form method="get" id="searchform" action="{% url objectapp_gbobject_search %}">
+ <form method="get" id="searchform" action="{% url nodes_search %}">
<p>
<input type="text" value="{% trans "Keywords..." %}" name="pattern" id="searchbox" onfocus="this.value=''" />
<input type="submit" class="submitbutton" value="OK" />
@@ -35,10 +35,12 @@
</p>
</form>
</div>
+<!--
<div class="objecttypes">
<h3>{% trans "Objecttypes" %}</h3>
{% get_objecttypes %}
</div>
+-->
<div class="authors">
<h3>{% trans "Authors" %}</h3>
{% get_authors %}
diff --git a/objectapp/admin/gbobject.py b/objectapp/admin/gbobject.py
index 5b2ce3d..1d4e10b 100644
--- a/objectapp/admin/gbobject.py
+++ b/objectapp/admin/gbobject.py
@@ -66,6 +66,7 @@ class GbobjectAdmin(reversion.VersionAdmin):
(_('Options'), {'fields': ('featured', 'excerpt', 'template',
'authors',
+ 'rurl',
'creation_date',
'start_publication',
'end_publication'),
diff --git a/objectapp/models.py b/objectapp/models.py
index 15c904c..2154b46 100644
--- a/objectapp/models.py
+++ b/objectapp/models.py
@@ -151,6 +151,7 @@ class Gbobject(Node):
(PUBLISHED, _('published')))
content = models.TextField(_('content'), null=True, blank=True)
+ content_org = models.TextField(_('content'), null=True, blank=True)
image = models.ImageField(_('image'), upload_to=UPLOAD_TO,
blank=True, help_text=_('used for illustration'))
@@ -175,23 +176,13 @@ class Gbobject(Node):
authors = models.ManyToManyField(User, verbose_name=_('authors'),
related_name='gbobjects',
blank=True, null=False)
- status = models.IntegerField(choices=STATUS_CHOICES, default=PUBLISHED)
+
featured = models.BooleanField(_('featured'), default=False)
comment_enabled = models.BooleanField(_('comment enabled'), default=True)
pingback_enabled = models.BooleanField(_('linkback enabled'), default=True)
- start_publication = models.DateTimeField(_('start publication'),
- help_text=_('date start publish'),
- default=datetime.now)
- end_publication = models.DateTimeField(_('end publication'),
- help_text=_('date end publish'),
- default=datetime(2042, 3, 15))
-
- sites = models.ManyToManyField(Site, verbose_name=_('sites publication'),
- related_name='gbobjects')
-
login_required = models.BooleanField(
_('login required'), default=False,
help_text=_('only authenticated users can view the gbobject'))
@@ -205,7 +196,7 @@ class Gbobject(Node):
choices=[('objectapp/gbobject_detail.html', _('Default template'))] + \
GBOBJECT_TEMPLATES,
help_text=_('template used to display the gbobject'))
-
+ rurl=models.URLField(_('rurl'),verify_exists=True,null=True, blank=True)
objects = models.Manager()
published = GbobjectPublishedManager()
diff --git a/objectapp/templates/objectapp/base.html b/objectapp/templates/objectapp/base.html
index 16aaaf9..d2b78ce 100644
--- a/objectapp/templates/objectapp/base.html
+++ b/objectapp/templates/objectapp/base.html
@@ -24,7 +24,7 @@
<div class="search">
<h3>{% trans "Search" %}</h3>
- <form method="get" id="searchform" action="{% url objectapp_gbobject_search %}">
+ <form method="get" id="searchform" action="{% url nodes_search %}">
<p>
<input type="text" value="{% trans "Keywords..." %}" name="pattern" id="searchbox" onfocus="this.value=''" />
<input type="submit" class="submitbutton" value="OK" />
diff --git a/objectapp/urls/search.py b/objectapp/urls/search.py
index afe2bde..4f74e9e 100644
--- a/objectapp/urls/search.py
+++ b/objectapp/urls/search.py
@@ -67,5 +67,5 @@ from django.conf.urls.defaults import url
from django.conf.urls.defaults import patterns
urlpatterns = patterns('objectapp.views.search',
- url(r'^$', 'gbobject_search', name='objectapp_gbobject_search'),
+ url(r'^$', 'nodes_search', name='nodes_search'),
)
diff --git a/objectapp/views/search.py b/objectapp/views/search.py
index bb9fe9d..567d66e 100644
--- a/objectapp/views/search.py
+++ b/objectapp/views/search.py
@@ -65,27 +65,27 @@
from django.utils.translation import ugettext as _
from django.views.generic.list_detail import object_list
-from objectapp.models import Gbobject
+from gstudio.models import Node
from objectapp.settings import PAGINATION
+from gstudio.managers import *
-
-def gbobject_search(request):
+def nodes_search(request):
"""Search gbobjects matching with a pattern"""
error = None
pattern = None
- gbobjects = Gbobject.published.none()
+ nodes = Node.published.none()
if request.GET:
pattern = request.GET.get('pattern', '')
if len(pattern) < 3:
error = _('The pattern is too short')
else:
- gbobjects = Gbobject.published.search(pattern)
+ nodes = Node.published.search(pattern)
else:
error = _('No pattern to search found')
- return object_list(request, queryset=gbobjects,
+ return object_list(request, queryset=nodes,
paginate_by=PAGINATION,
- template_name='objectapp/gbobject_search.html',
+ template_name='gstudio/nodes_search.html',
extra_context={'error': error,
'pattern': pattern})